diff --git a/.parcel-cache/data.mdb b/.parcel-cache/data.mdb
new file mode 100644
index 0000000..6e6eb61
Binary files /dev/null and b/.parcel-cache/data.mdb differ
diff --git a/.parcel-cache/lock.mdb b/.parcel-cache/lock.mdb
new file mode 100644
index 0000000..a6c73b9
Binary files /dev/null and b/.parcel-cache/lock.mdb differ
diff --git a/.storybook/.parcelrc b/.storybook/.parcelrc
new file mode 100644
index 0000000..c2544f2
--- /dev/null
+++ b/.storybook/.parcelrc
@@ -0,0 +1,8 @@
+{
+ "extends": "@parcel/config-storybook",
+ "resolvers": ["@parcel/resolver-glob", "..."],
+ "transformers": {
+ "packages/*/*/intl/*.json": ["parcel-transformer-intl"],
+ "raw:*": ["@parcel/transformer-raw"]
+ }
+}
diff --git a/.storybook/constants.js b/.storybook/constants.js
new file mode 100644
index 0000000..471abb4
--- /dev/null
+++ b/.storybook/constants.js
@@ -0,0 +1,108 @@
+import themeGlobal from '../packages/@fds/fds-css/vars/spectrum-global.css';
+import themeLight from '../packages/@fds/fds-css/vars/spectrum-light.css';
+import themeLightest from '../packages/@fds/fds-css/vars/spectrum-lightest.css';
+import themeDark from '../packages/@fds/fds-css/vars/spectrum-dark.css';
+import themeDarkest from '../packages/@fds/fds-css/vars/spectrum-darkest.css';
+import scaleMedium from '../packages/@fds/fds-css/vars/spectrum-medium.css';
+import scaleLarge from '../packages/@fds/fds-css/vars/spectrum-large.css';
+import express from '../packages/@fds/fds-css/vars/express.css';
+
+const THEME = {
+ global: themeGlobal,
+ light: themeLight,
+ lightest: themeLightest,
+ dark: themeDark,
+ darkest: themeDarkest
+};
+
+export const scales = {
+ medium: scaleMedium,
+ large: scaleLarge
+};
+
+export let defaultTheme = {
+ global: THEME.global,
+ light: THEME.light,
+ dark: THEME.darkest,
+ medium: scales.medium,
+ large: scales.large
+};
+
+export let altTheme = {
+ global: THEME.global,
+ light: THEME.lightest,
+ dark: THEME.dark,
+ medium: scales.medium,
+ large: scales.large
+};
+
+export let themes = {
+ light: defaultTheme,
+ dark: altTheme,
+ lightest: altTheme,
+ darkest: defaultTheme
+};
+
+export let expressThemes = {};
+for (let key in themes) {
+ expressThemes[key] = {
+ ...themes[key],
+ global: {
+ ...themes[key].global,
+ express: express.express
+ },
+ medium: {
+ ...themes[key].medium,
+ express: express.medium
+ },
+ large: {
+ ...themes[key].large,
+ express: express.large
+ }
+ };
+}
+
+// Based on https://adobe.sharepoint.com/sites/global/SitePages/Languages%20Supported.aspx
+export let locales = [
+ {label: 'Auto', value: ''},
+ // Tier 1
+ {label: 'French (France)', value: 'fr-FR'},
+ {label: 'French (Canada)', value: 'fr-CA'},
+ {label: 'German (Germany)', value: 'de-DE'},
+ {label: 'English (Great Britain)', value: 'en-GB'},
+ {label: 'English (United States)', value: 'en-US'},
+ {label: 'Japanese (Japan)', value: 'ja-JP'},
+ // // Tier 2
+ {label: 'Danish (Denmark)', value: 'da-DK'},
+ {label: 'Dutch (Netherlands)', value: 'nl-NL'},
+ {label: 'Finnish (Finland)', value: 'fi-FI'},
+ {label: 'Italian (Italy)', value: 'it-IT'},
+ {label: 'Norwegian (Norway)', value: 'nb-NO'},
+ {label: 'Spanish (Spain)', value: 'es-ES'},
+ {label: 'Swedish (Sweden)', value: 'sv-SE'},
+ {label: 'Portuguese (Brazil)', value: 'pt-BR'},
+ // // Tier 3
+ {label: 'Chinese (Simplified)', value: 'zh-CN'},
+ {label: 'Chinese (Traditional)', value: 'zh-TW'},
+ {label: 'Korean (Korea)', value: 'ko-KR'},
+ // // Tier 4
+ {label: 'Bulgarian (Bulgaria)', value: 'bg-BG'},
+ {label: 'Croatian (Croatia)', value: 'hr-HR'},
+ {label: 'Czech (Czech Republic)', value: 'cs-CZ'},
+ {label: 'Estonian (Estonia)', value: 'et-EE'},
+ {label: 'Hungarian (Hungary)', value: 'hu-HU'},
+ {label: 'Latvian (Latvia)', value: 'lv-LV'},
+ {label: 'Lithuanian (Lithuania)', value: 'lt-LT'},
+ {label: 'Polish (Poland)', value: 'pl-PL'},
+ {label: 'Romanian (Romania)', value: 'ro-RO'},
+ {label: 'Russian (Russia)', value: 'ru-RU'},
+ {label: 'Serbian (Serbia)', value: 'sr-SP'},
+ {label: 'Slovakian (Slovakia)', value: 'sk-SK'},
+ {label: 'Slovenian (Slovenia)', value: 'sl-SI'},
+ {label: 'Turkish (Turkey)', value: 'tr-TR'},
+ {label: 'Ukrainian (Ukraine)', value: 'uk-UA'},
+ // // Tier 5
+ {label: 'Arabic (United Arab Emirates)', value: 'ar-AE'}, // ar-SA??
+ {label: 'Greek (Greece)', value: 'el-GR'},
+ {label: 'Hebrew (Israel)', value: 'he-IL'}
+];
diff --git a/.storybook/custom-addons/descriptions/register.js b/.storybook/custom-addons/descriptions/register.js
new file mode 100644
index 0000000..9878e67
--- /dev/null
+++ b/.storybook/custom-addons/descriptions/register.js
@@ -0,0 +1,28 @@
+
+import {addons, types} 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`;
+
+const PARAM_KEY = 'description';
+
+const MyPanel = () => {
+ const value = useParameter(PARAM_KEY, null);
+ const item = value ? value.data : 'No description for this story.';
+ return
{item}
;
+};
+
+addons.register(ADDON_ID, (api) => {
+ addons.add(PANEL_ID, {
+ type: types.PANEL,
+ title: 'Description',
+ render: ({ active }) => (
+
+
+
+ ),
+ });
+});
diff --git a/.storybook/custom-addons/provider/index.js b/.storybook/custom-addons/provider/index.js
new file mode 100644
index 0000000..9415413
--- /dev/null
+++ b/.storybook/custom-addons/provider/index.js
@@ -0,0 +1,72 @@
+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 [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.
+ let theme = (expressValue ? expressThemes : themes)[themeValue || 'light'] || defaultTheme;
+ let colorScheme = themeValue && themeValue.replace(/est$/, '');
+ useEffect(() => {
+ let channel = addons.getChannel();
+ let providerUpdate = (event) => {
+ setLocale(event.locale);
+ setTheme(event.theme === 'Auto' ? undefined : event.theme);
+ setScale(event.scale === 'Auto' ? undefined : event.scale);
+ setExpress(event.express);
+ setStoryReady(true);
+ };
+
+ channel.on('provider/updated', providerUpdate);
+ channel.emit('rsp/ready-for-update');
+ return () => {
+ channel.removeListener('provider/updated', providerUpdate);
+ };
+ }, []);
+
+ if (props.options.mainElement == null) {
+ return (
+
+
+ {storyReady && props.children}
+
+
+ );
+ } else {
+ return (
+
+ {storyReady && props.children}
+
+ );
+ }
+}
+
+export const withProviderSwitcher = makeDecorator({
+ name: 'withProviderSwitcher',
+ parameterName: 'providerSwitcher',
+ wrapper: (getStory, context, {options, parameters}) => {
+ options = {...options, ...parameters};
+ return (
+
+ {getStory(context)}
+
+ );
+ }
+});
diff --git a/.storybook/custom-addons/provider/register.js b/.storybook/custom-addons/provider/register.js
new file mode 100644
index 0000000..e8d2d92
--- /dev/null
+++ b/.storybook/custom-addons/provider/register.js
@@ -0,0 +1,128 @@
+
+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: ''},
+ {label: "Light", value: "light"},
+ {label: "Lightest", value: "lightest"},
+ {label: "Dark", value: "dark"},
+ {label: "Darkest", value: "darkest"}
+];
+
+let SCALES = [
+ {label: 'Auto', value: ''},
+ {label: "Medium", value: "medium"},
+ {label: "Large", value: "large"}
+];
+
+let TOAST_POSITIONS = [
+ {label: 'top', value: 'top'},
+ {label: 'top left', value: 'top left'},
+ {label: 'top center', value: 'top center'},
+ {label: 'top right', value: 'top right'},
+ {label: 'bottom', value: 'bottom'},
+ {label: 'bottom left', value: 'bottom left'},
+ {label: 'bottom center', value: 'bottom center'},
+ {label: 'bottom right', value: 'bottom right'}
+];
+
+function ProviderFieldSetter({api}) {
+ let [values, setValues] = useState({locale: providerValuesFromUrl.locale || undefined, theme: providerValuesFromUrl.theme || undefined, scale: providerValuesFromUrl.scale || undefined, express: providerValuesFromUrl.express === 'true'});
+ let channel = addons.getChannel();
+ let onLocaleChange = (e) => {
+ let newValue = e.target.value || undefined;
+ setValues((old) => {
+ let next = {...old, locale: newValue};
+ channel.emit('provider/updated', next);
+ return next;
+ });
+ };
+ let onThemeChange = (e) => {
+ let newValue = e.target.value || undefined;
+ setValues((old) => {
+ let next = {...old, theme: newValue};
+ channel.emit('provider/updated', next);
+ return next;
+ });
+ };
+ let onScaleChange = (e) => {
+ let newValue = e.target.value || undefined;
+ setValues((old) => {
+ let next = {...old, scale: newValue};
+ channel.emit('provider/updated', next);
+ return next;
+ });
+ };
+ let onExpressChange = (e) => {
+ let newValue = e.target.checked;
+ setValues((old) => {
+ let next = {...old, express: newValue};
+ channel.emit('provider/updated', next);
+ return next;
+ });
+ };
+ useEffect(() => {
+ let storySwapped = () => {
+ channel.emit('provider/updated', values);
+ };
+ channel.on('rsp/ready-for-update', storySwapped);
+ return () => {
+ channel.removeListener('rsp/ready-for-update', storySwapped);
+ };
+ });
+
+ useEffect(() => {
+ api.setQueryParams({
+ 'providerSwitcher-locale': values.locale || '',
+ 'providerSwitcher-theme': values.theme || '',
+ 'providerSwitcher-scale': values.scale || '',
+ 'providerSwitcher-express': String(values.express),
+ });
+ });
+
+ return (
+
+
+ Locale:
+
+ {locales.map(locale => {locale.label} )}
+
+
+
+ Theme:
+
+ {THEMES.map(theme => {theme.label} )}
+
+
+
+ Scale:
+
+ {SCALES.map(scale => {scale.label} )}
+
+
+
+ Express:
+
+
+
+ )
+}
+
+addons.register('ProviderSwitcher', (api) => {
+ addons.add('ProviderSwitcher', {
+ title: 'viewport',
+ type: types.TOOL,
+ match: ({ viewMode }) => viewMode === 'story',
+ render: () => ,
+ });
+});
diff --git a/.storybook/custom-addons/scrolling/index.js b/.storybook/custom-addons/scrolling/index.js
new file mode 100644
index 0000000..6e016d9
--- /dev/null
+++ b/.storybook/custom-addons/scrolling/index.js
@@ -0,0 +1,57 @@
+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);
+
+ useEffect(() => {
+ let channel = addons.getChannel();
+ let updateScrolling = (val) => {
+ setScrolling(val);
+ };
+ channel.on('scrolling/updated', updateScrolling);
+ return () => {
+ channel.removeListener('scrolling/updated', updateScrolling);
+ };
+ }, []);
+
+ let styles = {alignItems: 'center', boxSizing: 'border-box', display: 'flex', justifyContent: 'center'};
+ if (isScrolling) {
+ return (
+
+
+ {children}
+
+
+ );
+ } else {
+ return (
+
+ {children}
+
+ );
+ }
+}
+
+function StoryWrapper({children, className, style}) {
+ return (
+
+ {React.version}
+ {children}
+
+ );
+}
+
+export const withScrollingSwitcher = (Story) => {
+ return (
+
+
+
+ )
+}
diff --git a/.storybook/custom-addons/scrolling/register.js b/.storybook/custom-addons/scrolling/register.js
new file mode 100644
index 0000000..b25f1be
--- /dev/null
+++ b/.storybook/custom-addons/scrolling/register.js
@@ -0,0 +1,40 @@
+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 onChange = () => {
+ setScrolling((old) => {
+ channel.emit('scrolling/updated', !old);
+ return !old;
+ })
+ };
+
+ useEffect(() => {
+ api.setQueryParams({
+ 'scrolling': isScrolling
+ });
+ });
+
+ return (
+
+ );
+};
+
+addons.register('ScrollingSwitcher', (api) => {
+ addons.add('ScrollingSwitcher', {
+ title: 'Scrolling switcher',
+ type: types.TOOL,
+ //👇 Shows the Toolbar UI element if either the Canvas or Docs tab is active
+ match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)),
+ render: () =>
+ });
+});
diff --git a/.storybook/custom-addons/strictmode/index.js b/.storybook/custom-addons/strictmode/index.js
new file mode 100644
index 0000000..61ae2a9
--- /dev/null
+++ b/.storybook/custom-addons/strictmode/index.js
@@ -0,0 +1,37 @@
+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');
+
+ useEffect(() => {
+ let channel = addons.getChannel();
+ let updateStrict = (val) => {
+ setStrict(val);
+ };
+ channel.on('strict/updated', updateStrict);
+ return () => {
+ channel.removeListener('strict/updated', updateStrict);
+ };
+ }, []);
+
+ return isStrict ? (
+
+ {children}
+
+ ) : children;
+}
+
+export const withStrictModeSwitcher = makeDecorator({
+ name: 'withStrictModeSwitcher',
+ parameterName: 'strictModeSwitcher',
+ wrapper: (getStory, context) => {
+ return (
+
+ {getStory(context)}
+
+ );
+ }
+});
diff --git a/.storybook/custom-addons/strictmode/register.js b/.storybook/custom-addons/strictmode/register.js
new file mode 100644
index 0000000..c4d1b2b
--- /dev/null
+++ b/.storybook/custom-addons/strictmode/register.js
@@ -0,0 +1,42 @@
+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 onChange = () => {
+ setStrict((old) => {
+ channel.emit('strict/updated', !old);
+ return !old;
+ })
+ };
+
+ useEffect(() => {
+ api.setQueryParams({
+ 'strict': isStrict
+ });
+ });
+
+ return (
+
+ );
+};
+
+if (process.env.NODE_ENV !== 'production') {
+ addons.register('StrictModeSwitcher', (api) => {
+ addons.add('StrictModeSwitcher', {
+ title: 'Strict mode switcher',
+ type: types.TOOL,
+ //👇 Shows the Toolbar UI element if either the Canvas or Docs tab is active
+ match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)),
+ render: () =>
+ });
+ });
+}
diff --git a/.storybook/custom-addons/theme/register.js b/.storybook/custom-addons/theme/register.js
new file mode 100644
index 0000000..59b1039
--- /dev/null
+++ b/.storybook/custom-addons/theme/register.js
@@ -0,0 +1,18 @@
+import {themes} from '@storybook/theming';
+import {addons} from '@storybook/manager-api';
+import {FORCE_RE_RENDER} from '@storybook/core-events';
+
+
+addons.register('theme-switcher', api => {
+ let query = window.matchMedia('(prefers-color-scheme: dark)');
+ let update = () => {
+ let theme = query.matches ? themes.dark : themes.normal;
+ theme.brandTitle = `FDS Design v1`;
+ theme.brandUrl = 'https://react-spectrum.corp.adobe.com';
+ api.setOptions({theme});
+ addons.getChannel().emit(FORCE_RE_RENDER);
+ };
+
+ addons.getChannel().on('storiesConfigured', update);
+ query.addListener(update);
+});
diff --git a/.storybook/gh-pages-config.json b/.storybook/gh-pages-config.json
deleted file mode 100644
index 3380ef2..0000000
--- a/.storybook/gh-pages-config.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "branch": "gh-pages",
- "basePath": "/fds-design/",
- "storybookBuildDir": "storybook-static"
-}
diff --git a/.storybook/logo-dark.svg b/.storybook/logo-dark.svg
new file mode 100644
index 0000000..69d1e2c
--- /dev/null
+++ b/.storybook/logo-dark.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.storybook/logo.svg b/.storybook/logo.svg
new file mode 100644
index 0000000..53f81fc
--- /dev/null
+++ b/.storybook/logo.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.storybook/main.js b/.storybook/main.js
new file mode 100644
index 0000000..0e94daf
--- /dev/null
+++ b/.storybook/main.js
@@ -0,0 +1,24 @@
+
+module.exports = {
+ stories: [
+ '../packages/@fds-design/*/stories/*.stories.{js,jsx,ts,tsx}',
+ ],
+
+ addons: [
+ "@storybook/addon-actions",
+ "@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'
+ ],
+
+ typescript: {
+ check: false,
+ reactDocgen: false
+ },
+ framework: '@storybook/react-vite'
+};
diff --git a/.storybook/main.ts b/.storybook/main.ts
deleted file mode 100644
index 768eb03..0000000
--- a/.storybook/main.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { StorybookConfig } from "@storybook/react-vite";
-
-const config: StorybookConfig = {
- stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
- addons: [
- "@storybook/addon-onboarding",
- "@storybook/addon-essentials",
- "@chromatic-com/storybook",
- "@storybook/addon-interactions",
- ],
- framework: {
- name: "@storybook/react-vite",
- options: {},
- },
-};
-export default config;
diff --git a/.storybook/manager.js b/.storybook/manager.js
new file mode 100644
index 0000000..22bfe12
--- /dev/null
+++ b/.storybook/manager.js
@@ -0,0 +1,8 @@
+import {addons} from '@storybook/manager-api';
+
+addons.setConfig({
+ enableShortcuts: false,
+ sidebar: {
+ showRoots: false,
+ }
+});
diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html
new file mode 100644
index 0000000..072aca7
--- /dev/null
+++ b/.storybook/preview-head.html
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/.storybook/preview.js b/.storybook/preview.js
new file mode 100644
index 0000000..ee79eb4
--- /dev/null
+++ b/.storybook/preview.js
@@ -0,0 +1,54 @@
+import {configureActions} from '@storybook/addon-actions';
+import React from 'react';
+import {withProviderSwitcher} from './custom-addons/provider';
+import {withScrollingSwitcher} from './custom-addons/scrolling';
+import {withStrictModeSwitcher} from './custom-addons/strictmode';
+
+// decorator order matters, the last one will be the outer most
+
+configureActions({
+ depth: 2,
+});
+
+export const parameters = {
+ options: {
+ storySort: (a, b) => {
+ return a.title === b.title
+ ? 0
+ : a.id.localeCompare(b.id, undefined, { numeric: true });
+ }
+ },
+ a11y: {
+ config: {
+ rules: [
+ {
+ id: 'aria-hidden-focus',
+ selector: 'body *:not([data-a11y-ignore="aria-hidden-focus"])',
+ }
+ ]
+ }
+ },
+ layout: 'fullscreen',
+ // Stops infinite loop memory crash when saving CSF stories https://github.com/storybookjs/storybook/issues/12747#issuecomment-1151803506
+ docs: {
+ source: {
+ type: 'code'
+ }
+ },
+ darkMode: {
+ light: {
+ brandTitle: 'React Spectrum',
+ brandImage: new URL('raw:logo.svg', import.meta.url).toString()
+ },
+ dark: {
+ brandTitle: 'React Spectrum',
+ brandImage: new URL('raw:logo-dark.svg', import.meta.url).toString()
+ }
+ },
+};
+
+export const decorators = [
+ withScrollingSwitcher,
+ ...(process.env.NODE_ENV !== 'production' ? [withStrictModeSwitcher] : []),
+ withProviderSwitcher
+];
diff --git a/.storybook/preview.ts b/.storybook/preview.ts
deleted file mode 100644
index 37914b1..0000000
--- a/.storybook/preview.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type { Preview } from "@storybook/react";
-
-const preview: Preview = {
- parameters: {
- controls: {
- matchers: {
- color: /(background|color)$/i,
- date: /Date$/i,
- },
- },
- },
-};
-
-export default preview;
diff --git a/.storybook/test-runner.js b/.storybook/test-runner.js
new file mode 100644
index 0000000..a5784c7
--- /dev/null
+++ b/.storybook/test-runner.js
@@ -0,0 +1,39 @@
+const {configureAxe, checkA11y, injectAxe} = require('axe-playwright');
+const {getStoryContext} = require('@storybook/test-runner');
+
+
+/*
+* See https://storybook.js.org/docs/react/writing-tests/test-runner#test-hook-api-experimental
+* to learn more about the test-runner hooks API.
+*/
+module.exports = {
+ async preRender(page) {
+ await injectAxe(page);
+ },
+ async postRender(page, context) {
+ // Grab accessibility settings from the story itself
+ const storyContext = await getStoryContext(page, context);
+ if (storyContext.parameters?.a11y?.disable) {
+ return;
+ }
+
+ await configureAxe(page, {
+ // TODO: Ideally would have a selector target for the storybook's sb main body element
+ rules: [
+ {
+ id: 'aria-hidden-focus',
+ selector: 'body *:not([data-a11y-ignore="aria-hidden-focus"])',
+ },
+ ...(storyContext.parameters?.a11y?.config?.rules ?? [])
+ ]
+ });
+
+ await checkA11y(page, '#root', {
+ detailedReport: true,
+ detailedReportOptions: {
+ html: true,
+ },
+ axeOptions: storyContext.parameters?.a11y?.options,
+ });
+ },
+};
diff --git a/lerna.json b/lerna.json
new file mode 100644
index 0000000..a50d485
--- /dev/null
+++ b/lerna.json
@@ -0,0 +1,13 @@
+{
+ "version": "independent",
+ "npmClient": "npm",
+ "useWorkspaces": true,
+ "command": {
+ "publish": {
+ "allowBranch": [
+ "main",
+ "release"
+ ]
+ }
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 32cbac0..743c087 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,36 +13,41 @@
"react-dom": "^18.3.1"
},
"devDependencies": {
- "@chromatic-com/storybook": "^3.2.3",
"@eslint/js": "^9.17.0",
- "@storybook/addon-essentials": "^8.4.7",
- "@storybook/addon-interactions": "^8.4.7",
- "@storybook/addon-onboarding": "^8.4.7",
- "@storybook/blocks": "^8.4.7",
- "@storybook/react": "^8.4.7",
- "@storybook/react-vite": "^8.4.7",
- "@storybook/test": "^8.4.7",
+ "@storybook/addon-a11y": "^7.6.19",
+ "@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/react-vite": "^7.6.19",
+ "@storybook/test-runner": "^0.16.0",
+ "@storybook/testing-library": "^0.2.2",
"@types/react": "^18.3.17",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react-swc": "^3.5.0",
+ "chromatic": "^11.3.0",
"eslint": "^9.17.0",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.16",
"eslint-plugin-storybook": "^0.11.1",
"globals": "^15.13.0",
- "storybook": "^8.4.7",
+ "storybook": "^7.6.19",
+ "storybook-dark-mode": "^4.0.2",
+ "storybook-react-parcel": "^0.0.1",
"typescript": "~5.6.2",
"typescript-eslint": "^8.18.1",
- "vite": "^6.0.3"
+ "vite": "^5.0.0"
}
},
- "node_modules/@adobe/css-tools": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz",
- "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -57,6 +62,19 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@aw-web-design/x-default-browser": {
+ "version": "1.4.126",
+ "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz",
+ "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-browser-id": "3.0.0"
+ },
+ "bin": {
+ "x-default-browser": "bin/x-default-browser.js"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
@@ -113,16 +131,6 @@
"url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/generator": {
"version": "7.26.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
@@ -140,6 +148,19 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-compilation-targets": {
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
@@ -157,14 +178,75 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+ "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+ "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
@@ -199,6 +281,79 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-string-parser": {
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
@@ -229,6 +384,21 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helpers": {
"version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
@@ -259,4451 +429,18943 @@
"node": ">=6.0.0"
}
},
- "node_modules/@babel/runtime": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
- "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "regenerator-runtime": "^0.14.0"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/template": {
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
"version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
- "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.25.9",
- "@babel/parser": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/traverse": {
- "version": "7.26.4",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
- "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.3",
- "@babel/parser": "^7.26.3",
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.26.3",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/traverse/node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
}
},
- "node_modules/@babel/types": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
- "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@chromatic-com/storybook": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.3.tgz",
- "integrity": "sha512-3+hfANx79kIjP1qrOSLxpoAXOiYUA0S7A0WI0A24kASrv7USFNNW8etR5TjUilMb0LmqKUn3wDwUK2h6aceQ9g==",
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "chromatic": "^11.15.0",
- "filesize": "^10.0.12",
- "jsonfile": "^6.1.0",
- "react-confetti": "^6.1.0",
- "strip-ansi": "^7.1.0"
- },
"engines": {
- "node": ">=16.0.0",
- "yarn": ">=1.22.18"
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
- "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
- "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/android-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
- "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/android-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
- "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
"engines": {
- "node": ">=18"
- }
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
- "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz",
+ "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
- "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
- "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
- "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-arm": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
- "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
- "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
- "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
- "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
- "cpu": [
- "loong64"
- ],
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
- "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
- "cpu": [
- "mips64el"
- ],
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
- "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
- "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
- "cpu": [
- "riscv64"
- ],
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
- "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/linux-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
- "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
- "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
- "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
- "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
- "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
- "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
+ "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
- "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@esbuild/win32-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
- "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
+ "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
- "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.4.3"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">=6.9.0"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
}
},
- "node_modules/@eslint/config-array": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
- "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@eslint/object-schema": "^2.1.5",
- "debug": "^4.3.1",
- "minimatch": "^3.1.2"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint/core": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
- "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
+ "node_modules/@babel/plugin-transform-classes/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
+ "license": "MIT",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=4"
}
},
- "node_modules/@eslint/eslintrc": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
- "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=6.9.0"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6.9.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint/js": {
- "version": "9.17.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz",
- "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==",
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint/object-schema": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
- "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@eslint/plugin-kit": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
- "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "levn": "^0.4.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@formatjs/ecma402-abstract": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz",
- "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==",
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/fast-memoize": "2.2.5",
- "@formatjs/intl-localematcher": "0.5.9",
- "decimal.js": "10",
- "tslib": "2"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@formatjs/fast-memoize": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz",
- "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==",
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "2"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@formatjs/icu-messageformat-parser": {
- "version": "2.9.7",
- "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz",
- "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==",
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/ecma402-abstract": "2.3.1",
- "@formatjs/icu-skeleton-parser": "1.8.11",
- "tslib": "2"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@formatjs/icu-skeleton-parser": {
- "version": "1.8.11",
- "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz",
- "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==",
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz",
+ "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/ecma402-abstract": "2.3.1",
- "tslib": "2"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-flow": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@formatjs/intl-localematcher": {
- "version": "0.5.9",
- "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz",
- "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==",
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
+ "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "2"
- }
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
- "dev": true,
- "license": "Apache-2.0",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
"engines": {
- "node": ">=18.18.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@humanfs/node": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
- "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.3.0"
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
- "node": ">=18.18.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18.18"
+ "node": ">=6.9.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=12.22"
+ "node": ">=6.9.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
- "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=18.18"
+ "node": ">=6.9.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@internationalized/date": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.6.0.tgz",
- "integrity": "sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@internationalized/message": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.6.tgz",
- "integrity": "sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@swc/helpers": "^0.5.0",
- "intl-messageformat": "^10.1.0"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@internationalized/number": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.0.tgz",
- "integrity": "sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@internationalized/string": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.5.tgz",
- "integrity": "sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.4.2.tgz",
- "integrity": "sha512-feQ+ntr+8hbVudnsTUapiMN9q8T90XA1d5jn9QzY09sNoj4iD9wi0PY1vsBFTda4ZjEaxRK9S81oarR2nj7TFQ==",
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "magic-string": "^0.27.0",
- "react-docgen-typescript": "^2.2.2"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
- "peerDependencies": {
- "typescript": ">= 4.3.x",
- "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
+ "engines": {
+ "node": ">=6.9.0"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
- "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.13"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
- "node": ">=12"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
- "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
+ "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
},
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@mdx-js/react": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz",
- "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==",
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/mdx": "^2.0.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "@types/react": ">=16",
- "react": ">=16"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
"engines": {
- "node": ">= 8"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/breadcrumbs": {
- "version": "3.5.19",
- "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.19.tgz",
- "integrity": "sha512-mVngOPFYVVhec89rf/CiYQGTfaLRfHFtX+JQwY7sNYNqSA+gO8p4lNARe3Be6bJPgH+LUQuruIY9/ZDL6LT3HA==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/link": "^3.7.7",
- "@react-aria/utils": "^3.26.0",
- "@react-types/breadcrumbs": "^3.7.9",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/button": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.11.0.tgz",
- "integrity": "sha512-b37eIV6IW11KmNIAm65F3SEl2/mgj5BrHIysW6smZX3KoKWTGYsYfcQkmtNgY0GOSFfDxMCoolsZ6mxC00nSDA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/toolbar": "3.0.0-beta.11",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/toggle": "^3.8.0",
- "@react-types/button": "^3.10.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/calendar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.6.0.tgz",
- "integrity": "sha512-tZ3nd5DP8uxckbj83Pt+4RqgcTWDlGi7njzc7QqFOG2ApfnYDUXbIpb/Q4KY6JNlJskG8q33wo0XfOwNy8J+eg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/date": "^3.6.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/calendar": "^3.6.0",
- "@react-types/button": "^3.10.1",
- "@react-types/calendar": "^3.5.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/checkbox": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.15.0.tgz",
- "integrity": "sha512-z/8xd4em7o0MroBXwkkwv7QRwiJaA1FwqMhRUb7iqtBGP2oSytBEDf0N7L09oci32a1P4ZPz2rMK5GlLh/PD6g==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/form": "^3.0.11",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/toggle": "^3.10.10",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/checkbox": "^3.6.10",
- "@react-stately/form": "^3.1.0",
- "@react-stately/toggle": "^3.8.0",
- "@react-types/checkbox": "^3.9.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/collections": {
- "version": "3.0.0-alpha.6",
- "resolved": "https://registry.npmjs.org/@react-aria/collections/-/collections-3.0.0-alpha.6.tgz",
- "integrity": "sha512-A+7Eap/zvsghMb5/C3EAPn41axSzRhtX2glQRXSBj1mK31CTPCZ9BhrMIMC5DL7ZnfA7C+Ysilo9nI2YQh5PMg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/ssr": "^3.9.7",
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0",
- "use-sync-external-store": "^1.2.0"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/color": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.2.tgz",
- "integrity": "sha512-dSM5qQRcR1gRGYCBw0IGRmc29gjfoht3cQleKb8MMNcgHYa2oi5VdCs2yKXmYFwwVC6uPtnlNy9S6e0spqdr+w==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/numberfield": "^3.11.9",
- "@react-aria/slider": "^3.7.14",
- "@react-aria/spinbutton": "^3.6.10",
- "@react-aria/textfield": "^3.15.0",
- "@react-aria/utils": "^3.26.0",
- "@react-aria/visually-hidden": "^3.8.18",
- "@react-stately/color": "^3.8.1",
- "@react-stately/form": "^3.1.0",
- "@react-types/color": "^3.0.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@react-aria/combobox": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.11.0.tgz",
- "integrity": "sha512-s88YMmPkMO1WSoiH1KIyZDLJqUwvM2wHXXakj3cYw1tBHGo4rOUFq+JWQIbM5EDO4HOR4AUUqzIUd0NO7t3zyg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/listbox": "^3.13.6",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/menu": "^3.16.0",
- "@react-aria/overlays": "^3.24.0",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/textfield": "^3.15.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/combobox": "^3.10.1",
- "@react-stately/form": "^3.1.0",
- "@react-types/button": "^3.10.1",
- "@react-types/combobox": "^3.13.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/datepicker": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.12.0.tgz",
- "integrity": "sha512-VYNXioLfddIHpwQx211+rTYuunDmI7VHWBRetCpH3loIsVFuhFSRchTQpclAzxolO3g0vO7pMVj9VYt7Swp6kg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/date": "^3.6.0",
- "@internationalized/number": "^3.6.0",
- "@internationalized/string": "^3.2.5",
- "@react-aria/focus": "^3.19.0",
- "@react-aria/form": "^3.0.11",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/spinbutton": "^3.6.10",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/datepicker": "^3.11.0",
- "@react-stately/form": "^3.1.0",
- "@react-types/button": "^3.10.1",
- "@react-types/calendar": "^3.5.0",
- "@react-types/datepicker": "^3.9.0",
- "@react-types/dialog": "^3.5.14",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/dialog": {
- "version": "3.5.20",
- "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.20.tgz",
- "integrity": "sha512-l0GZVLgeOd3kL3Yj8xQW7wN3gn9WW3RLd/SGI9t7ciTq+I/FhftjXCWzXLlOCCTLMf+gv7eazecECtmoWUaZWQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/overlays": "^3.24.0",
- "@react-aria/utils": "^3.26.0",
- "@react-types/dialog": "^3.5.14",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/disclosure": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@react-aria/disclosure/-/disclosure-3.0.0.tgz",
- "integrity": "sha512-xO9QTQSvymujTjCs1iCQ4+dKZvtF/rVVaFZBKlUtqIqwTHMdqeZu4fh5miLEnTyVLNHMGzLrFggsd8Q+niC9Og==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/ssr": "^3.9.7",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/disclosure": "^3.0.0",
- "@react-types/button": "^3.10.1",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/dnd": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.8.0.tgz",
- "integrity": "sha512-JiqHY3E9fDU5Kb4gN22cuK6QNlpMCGe6ngR/BV+Q8mLEsdoWcoUAYOtYXVNNTRvCdVbEWI87FUU+ThyPpoDhNQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
+ "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/string": "^3.2.5",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/overlays": "^3.24.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/dnd": "^3.5.0",
- "@react-types/button": "^3.10.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/focus": {
- "version": "3.19.0",
- "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.19.0.tgz",
- "integrity": "sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
+ "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0",
- "clsx": "^2.0.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/form": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.11.tgz",
- "integrity": "sha512-oXzjTiwVuuWjZ8muU0hp3BrDH5qjVctLOF50mjPvqUbvXQTHhoDxWweyIXPQjGshaqBd2w4pWaE4A2rG2O/apw==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz",
+ "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/form": "^3.1.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/grid": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.11.0.tgz",
- "integrity": "sha512-lN5FpQgu2Rq0CzTPWmzRpq6QHcMmzsXYeClsgO3108uVp1/genBNAObYVTxGOKe/jb9q99trz8EtIn05O6KN1g==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/grid": "^3.10.0",
- "@react-stately/selection": "^3.18.0",
- "@react-types/checkbox": "^3.9.0",
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/gridlist": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.10.0.tgz",
- "integrity": "sha512-UcblfSZ7kJBrjg9mQ5VbnRevN81UiYB4NuL5PwIpBpridO7tnl4ew6+96PYU7Wj1chHhPS3x0b0zmuSVN7A0LA==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/grid": "^3.11.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/list": "^3.11.1",
- "@react-stately/tree": "^3.8.6",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/i18n": {
- "version": "3.12.4",
- "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.4.tgz",
- "integrity": "sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/date": "^3.6.0",
- "@internationalized/message": "^3.1.6",
- "@internationalized/number": "^3.6.0",
- "@internationalized/string": "^3.2.5",
- "@react-aria/ssr": "^3.9.7",
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/interactions": {
- "version": "3.22.5",
- "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.5.tgz",
- "integrity": "sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/ssr": "^3.9.7",
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@react-aria/label": {
- "version": "3.7.13",
- "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.13.tgz",
- "integrity": "sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz",
+ "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/compat-data": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.9",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.25.9",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.25.9",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.25.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.25.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.25.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.38.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/link": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.7.7.tgz",
- "integrity": "sha512-eVBRcHKhNSsATYWv5wRnZXRqPVcKAWWakyvfrYePIKpC3s4BaHZyTGYdefk8ZwZdEOuQZBqLMnjW80q1uhtkuA==",
- "license": "Apache-2.0",
+ "node_modules/@babel/preset-flow": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.9.tgz",
+ "integrity": "sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-types/link": "^3.5.9",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-flow-strip-types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/listbox": {
- "version": "3.13.6",
- "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.13.6.tgz",
- "integrity": "sha512-6hEXEXIZVau9lgBZ4VVjFR3JnGU+fJaPmV3HP0UZ2ucUptfG0MZo24cn+ZQJsWiuaCfNFv5b8qribiv+BcO+Kg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/list": "^3.11.1",
- "@react-types/listbox": "^3.5.3",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/@react-aria/live-announcer": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.1.tgz",
- "integrity": "sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig==",
- "license": "Apache-2.0",
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz",
+ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/menu": {
- "version": "3.16.0",
- "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.16.0.tgz",
- "integrity": "sha512-TNk+Vd3TbpBPUxEloAdHRTaRxf9JBK7YmkHYiq0Yj5Lc22KS0E2eTyhpPM9xJvEWN2TlC5TEvNfdyui2kYWFFQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz",
+ "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/overlays": "^3.24.0",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/menu": "^3.9.0",
- "@react-stately/selection": "^3.18.0",
- "@react-stately/tree": "^3.8.6",
- "@react-types/button": "^3.10.1",
- "@react-types/menu": "^3.9.13",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "clone-deep": "^4.0.1",
+ "find-cache-dir": "^2.0.0",
+ "make-dir": "^2.1.0",
+ "pirates": "^4.0.6",
+ "source-map-support": "^0.5.16"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@react-aria/meter": {
- "version": "3.4.18",
- "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.18.tgz",
- "integrity": "sha512-tTX3LLlmDIHqrC42dkdf+upb1c4UbhlpZ52gqB64lZD4OD4HE+vMTwNSe+7MRKMLvcdKPWCRC35PnxIHZ15kfQ==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/progress": "^3.4.18",
- "@react-types/meter": "^3.4.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-aria/numberfield": {
- "version": "3.11.9",
- "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.9.tgz",
- "integrity": "sha512-3tiGPx2y4zyOV7PmdBASes99ZZsFTZAJTnU45Z+p1CW4131lw7y2ZhbojBl7U6DaXAJvi1z6zY6cq2UE9w5a0Q==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/spinbutton": "^3.6.10",
- "@react-aria/textfield": "^3.15.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/form": "^3.1.0",
- "@react-stately/numberfield": "^3.9.8",
- "@react-types/button": "^3.10.1",
- "@react-types/numberfield": "^3.8.7",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "locate-path": "^3.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-aria/overlays": {
- "version": "3.24.0",
- "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.24.0.tgz",
- "integrity": "sha512-0kAXBsMNTc/a3M07tK9Cdt/ea8CxTAEJ223g8YgqImlmoBBYAL7dl5G01IOj67TM64uWPTmZrOklBchHWgEm3A==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/ssr": "^3.9.7",
- "@react-aria/utils": "^3.26.0",
- "@react-aria/visually-hidden": "^3.8.18",
- "@react-stately/overlays": "^3.6.12",
- "@react-types/button": "^3.10.1",
- "@react-types/overlays": "^3.8.11",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-aria/progress": {
- "version": "3.4.18",
- "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.18.tgz",
- "integrity": "sha512-FOLgJ9t9i1u3oAAimybJG6r7/soNPBnJfWo4Yr6MmaUv90qVGa1h6kiuM5m9H/bm5JobAebhdfHit9lFlgsCmg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/label": "^3.7.13",
- "@react-aria/utils": "^3.26.0",
- "@react-types/progress": "^3.5.8",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-aria/radio": {
- "version": "3.10.10",
- "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.10.tgz",
- "integrity": "sha512-NVdeOVrsrHgSfwL2jWCCXFsWZb+RMRZErj5vthHQW4nkHECGOzeX56VaLWTSvdoCPqi9wdIX8A6K9peeAIgxzA==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/form": "^3.0.11",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/radio": "^3.10.9",
- "@react-types/radio": "^3.8.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "p-try": "^2.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-aria/searchfield": {
- "version": "3.7.11",
- "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.11.tgz",
- "integrity": "sha512-wFf6QxtBFfoxy0ANxI0+ftFEBGynVCY0+ce4H4Y9LpUTQsIKMp3sdc7LoUFORWw5Yee6Eid5cFPQX0Ymnk+ZJg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/textfield": "^3.15.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/searchfield": "^3.5.8",
- "@react-types/button": "^3.10.1",
- "@react-types/searchfield": "^3.5.10",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "p-limit": "^2.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-aria/select": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.15.0.tgz",
- "integrity": "sha512-zgBOUNy81aJplfc3NKDJMv8HkXjBGzaFF3XDzNfW8vJ7nD9rcTRUN5SQ1XCEnKMv12B/Euk9zt6kd+tX0wk1vQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/form": "^3.0.11",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/listbox": "^3.13.6",
- "@react-aria/menu": "^3.16.0",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-aria/visually-hidden": "^3.8.18",
- "@react-stately/select": "^3.6.9",
- "@react-types/button": "^3.10.1",
- "@react-types/select": "^3.9.8",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/@babel/register/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/@react-aria/selection": {
- "version": "3.21.0",
- "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.21.0.tgz",
- "integrity": "sha512-52JJ6hlPcM+gt0VV3DBmz6Kj1YAJr13TfutrKfGWcK36LvNCBm1j0N+TDqbdnlp8Nue6w0+5FIwZq44XPYiBGg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/selection": "^3.18.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "find-up": "^3.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-aria/separator": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.4.4.tgz",
- "integrity": "sha512-dH+qt0Mdh0nhKXCHW6AR4DF8DKLUBP26QYWaoThPdBwIpypH/JVKowpPtWms1P4b36U6XzHXHnTTEn/ZVoCqNA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/@babel/register/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
}
},
- "node_modules/@react-aria/slider": {
- "version": "3.7.14",
- "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.14.tgz",
- "integrity": "sha512-7rOiKjLkEZ0j7mPMlwrqivc+K4OSfL14slaQp06GHRiJkhiWXh2/drPe15hgNq55HmBQBpA0umKMkJcqVgmXPA==",
- "license": "Apache-2.0",
+ "node_modules/@babel/register/node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/slider": "^3.6.0",
- "@react-types/shared": "^3.26.0",
- "@react-types/slider": "^3.7.7",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
- "node_modules/@react-aria/spinbutton": {
- "version": "3.6.10",
- "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.10.tgz",
- "integrity": "sha512-nhYEYk7xUNOZDaqiQ5w/nHH9ouqjJbabTWXH+KK7UR1oVGfo4z1wG94l8KWF3Z6SGGnBxzLJyTBguZ4g9aYTSg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/runtime": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/utils": "^3.26.0",
- "@react-types/button": "^3.10.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "regenerator-runtime": "^0.14.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/@react-aria/ssr": {
- "version": "3.9.7",
- "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz",
- "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==",
- "license": "Apache-2.0",
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@swc/helpers": "^0.5.0"
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
- "node": ">= 12"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node": ">=6.9.0"
}
},
- "node_modules/@react-aria/switch": {
- "version": "3.6.10",
- "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.10.tgz",
- "integrity": "sha512-FtaI9WaEP1tAmra1sYlAkYXg9x75P5UtgY8pSbe9+1WRyWbuE1QZT+RNCTi3IU4fZ7iJQmXH6+VaMyzPlSUagw==",
- "license": "Apache-2.0",
+ "node_modules/@babel/traverse": {
+ "version": "7.26.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
+ "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/toggle": "^3.10.10",
- "@react-stately/toggle": "^3.8.0",
- "@react-types/shared": "^3.26.0",
- "@react-types/switch": "^3.5.7",
- "@swc/helpers": "^0.5.0"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.3",
+ "@babel/parser": "^7.26.3",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.3",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/@react-aria/table": {
- "version": "3.16.0",
- "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.16.0.tgz",
- "integrity": "sha512-9xF9S3CJ7XRiiK92hsIKxPedD0kgcQWwqTMtj3IBynpQ4vsnRiW3YNIzrn9C3apjknRZDTSta8O2QPYCUMmw2A==",
- "license": "Apache-2.0",
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/grid": "^3.11.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/utils": "^3.26.0",
- "@react-aria/visually-hidden": "^3.8.18",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/flags": "^3.0.5",
- "@react-stately/table": "^3.13.0",
- "@react-types/checkbox": "^3.9.0",
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0",
- "@react-types/table": "^3.10.3",
- "@swc/helpers": "^0.5.0"
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@base2/pretty-print-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz",
+ "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
+ "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.5",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
+ "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
+ "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz",
+ "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
+ "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
+ "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@fal-works/esbuild-plugin-global-externals": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz",
+ "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz",
+ "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
+ "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@formatjs/ecma402-abstract": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz",
+ "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/fast-memoize": "2.2.5",
+ "@formatjs/intl-localematcher": "0.5.9",
+ "decimal.js": "10",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/fast-memoize": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz",
+ "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/icu-messageformat-parser": {
+ "version": "2.9.7",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz",
+ "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.1",
+ "@formatjs/icu-skeleton-parser": "1.8.11",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/icu-skeleton-parser": {
+ "version": "1.8.11",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz",
+ "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.1",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/intl-localematcher": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz",
+ "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
+ "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@internationalized/date": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.6.0.tgz",
+ "integrity": "sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@internationalized/message": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.6.tgz",
+ "integrity": "sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0",
+ "intl-messageformat": "^10.1.0"
+ }
+ },
+ "node_modules/@internationalized/number": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.0.tgz",
+ "integrity": "sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@internationalized/string": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.5.tgz",
+ "integrity": "sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/core/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/core/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jest/core/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/create-cache-key-function": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
+ "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.3.0.tgz",
+ "integrity": "sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob": "^7.2.0",
+ "glob-promise": "^4.2.0",
+ "magic-string": "^0.27.0",
+ "react-docgen-typescript": "^2.2.2"
+ },
+ "peerDependencies": {
+ "typescript": ">= 4.3.x",
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/glob-promise": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz",
+ "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/glob": "^7.1.3"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/ahmadnassri"
+ },
+ "peerDependencies": {
+ "glob": "^7.1.6"
+ }
+ },
+ "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@juggle/resize-observer": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
+ "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@lezer/common": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz",
+ "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@lezer/lr": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz",
+ "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@lmdb/lmdb-darwin-arm64": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz",
+ "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-darwin-x64": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz",
+ "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-arm": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz",
+ "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-arm64": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz",
+ "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-x64": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz",
+ "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-win32-x64": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz",
+ "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz",
+ "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdx": "^2.0.0",
+ "@types/react": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "react": ">=16"
+ }
+ },
+ "node_modules/@mischnic/json-sourcemap": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz",
+ "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "json5": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
+ "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz",
+ "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz",
+ "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz",
+ "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz",
+ "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz",
+ "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@ndelangen/get-tarball": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz",
+ "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "gunzip-maybe": "^1.4.2",
+ "pump": "^3.0.0",
+ "tar-fs": "^2.1.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/cache": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.13.3.tgz",
+ "integrity": "sha512-Vz5+K5uCt9mcuQAMDo0JdbPYDmVdB8Nvu/A2vTEK2rqZPxvoOTczKeMBA4JqzKqGURHPRLaJCvuR8nDG+jhK9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/fs": "2.13.3",
+ "@parcel/logger": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "lmdb": "2.8.5"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.13.3"
+ }
+ },
+ "node_modules/@parcel/codeframe": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.13.3.tgz",
+ "integrity": "sha512-L/PQf+PT0xM8k9nc0B+PxxOYO2phQYnbuifu9o4pFRiqVmCtHztP+XMIvRJ2gOEXy3pgAImSPFVJ3xGxMFky4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/core": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.13.3.tgz",
+ "integrity": "sha512-SRZFtqGiaKHlZ2YAvf+NHvBFWS3GnkBvJMfOJM7kxJRK3M1bhbwJa/GgSdzqro5UVf9Bfj6E+pkdrRQIOZ7jMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mischnic/json-sourcemap": "^0.1.0",
+ "@parcel/cache": "2.13.3",
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/events": "2.13.3",
+ "@parcel/feature-flags": "2.13.3",
+ "@parcel/fs": "2.13.3",
+ "@parcel/graph": "3.3.3",
+ "@parcel/logger": "2.13.3",
+ "@parcel/package-manager": "2.13.3",
+ "@parcel/plugin": "2.13.3",
+ "@parcel/profiler": "2.13.3",
+ "@parcel/rust": "2.13.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/types": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "@parcel/workers": "2.13.3",
+ "base-x": "^3.0.8",
+ "browserslist": "^4.6.6",
+ "clone": "^2.1.1",
+ "dotenv": "^16.4.5",
+ "dotenv-expand": "^11.0.6",
+ "json5": "^2.2.0",
+ "msgpackr": "^1.9.9",
+ "nullthrows": "^1.1.1",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/core/node_modules/dotenv-expand": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dotenv": "^16.4.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/@parcel/core/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@parcel/diagnostic": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.13.3.tgz",
+ "integrity": "sha512-C70KXLBaXLJvr7XCEVu8m6TqNdw1gQLxqg5BQ8roR62R4vWWDnOq8PEksxDi4Y8Z/FF4i3Sapv6tRx9iBNxDEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mischnic/json-sourcemap": "^0.1.0",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/events": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.13.3.tgz",
+ "integrity": "sha512-ZkSHTTbD/E+53AjUzhAWTnMLnxLEU5yRw0H614CaruGh+GjgOIKyukGeToF5Gf/lvZ159VrJCGE0Z5EpgHVkuQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/feature-flags": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/feature-flags/-/feature-flags-2.13.3.tgz",
+ "integrity": "sha512-UZm14QpamDFoUut9YtCZSpG1HxPs07lUwUCpsAYL0PpxASD3oWJQxIJGfDZPa2272DarXDG9adTKrNXvkHZblw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/fs": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.13.3.tgz",
+ "integrity": "sha512-+MPWAt0zr+TCDSlj1LvkORTjfB/BSffsE99A9AvScKytDSYYpY2s0t4vtV9unSh0FHMS2aBCZNJ4t7KL+DcPIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/feature-flags": "2.13.3",
+ "@parcel/rust": "2.13.3",
+ "@parcel/types-internal": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "@parcel/watcher": "^2.0.7",
+ "@parcel/workers": "2.13.3"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.13.3"
+ }
+ },
+ "node_modules/@parcel/graph": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.3.3.tgz",
+ "integrity": "sha512-pxs4GauEdvCN8nRd6wG3st6LvpHske3GfqGwUSR0P0X0pBPI1/NicvXz6xzp3rgb9gPWfbKXeI/2IOTfIxxVfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/feature-flags": "2.13.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/logger": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.13.3.tgz",
+ "integrity": "sha512-8YF/ZhsQgd7ohQ2vEqcMD1Ag9JlJULROWRPGgGYLGD+twuxAiSdiFBpN3f+j4gQN4PYaLaIS/SwUFx11J243fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/events": "2.13.3"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/markdown-ansi": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.13.3.tgz",
+ "integrity": "sha512-B4rUdlNUulJs2xOQuDbN7Hq5a9roq8IZUcJ1vQ8PAv+zMGb7KCfqIIr/BSCDYGhayfAGBVWW8x55Kvrl1zrDYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/node-resolver-core": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.4.3.tgz",
+ "integrity": "sha512-IEnMks49egEic1ITBp59VQyHzkSQUXqpU9hOHwqN3KoSTdZ6rEgrXcS3pa6tdXay4NYGlcZ88kFCE8i/xYoVCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mischnic/json-sourcemap": "^0.1.0",
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/fs": "2.13.3",
+ "@parcel/rust": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "nullthrows": "^1.1.1",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/node-resolver-core/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@parcel/package-manager": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.13.3.tgz",
+ "integrity": "sha512-FLNI5OrZxymGf/Yln0E/kjnGn5sdkQAxW7pQVdtuM+5VeN75yibJRjsSGv88PvJ+KvpD2ANgiIJo1RufmoPcww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/fs": "2.13.3",
+ "@parcel/logger": "2.13.3",
+ "@parcel/node-resolver-core": "3.4.3",
+ "@parcel/types": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "@parcel/workers": "2.13.3",
+ "@swc/core": "^1.7.26",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.13.3"
+ }
+ },
+ "node_modules/@parcel/package-manager/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@parcel/plugin": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.13.3.tgz",
+ "integrity": "sha512-cterKHHcwg6q11Gpif/aqvHo056TR+yDVJ3fSdiG2xr5KD1VZ2B3hmofWERNNwjMcnR1h9Xq40B7jCKUhOyNFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/types": "2.13.3"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/profiler": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.13.3.tgz",
+ "integrity": "sha512-ok6BwWSLvyHe5TuSXjSacYnDStFgP5Y30tA9mbtWSm0INDsYf+m5DqzpYPx8U54OaywWMK8w3MXUClosJX3aPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/events": "2.13.3",
+ "@parcel/types-internal": "2.13.3",
+ "chrome-trace-event": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/reporter-cli": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.13.3.tgz",
+ "integrity": "sha512-EA5tKt/6bXYNMEavSs35qHlFdx6cZmRazlZxPBgxPePQYoouNAPMNLUOEQozaPhz9f5fvNDN7EHOFaAWcdO2LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/plugin": "2.13.3",
+ "@parcel/types": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "chalk": "^4.1.2",
+ "term-size": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 16.0.0",
+ "parcel": "^2.13.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/rust": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.13.3.tgz",
+ "integrity": "sha512-dLq85xDAtzr3P5200cvxk+8WXSWauYbxuev9LCPdwfhlaWo/JEj6cu9seVdWlkagjGwkoV1kXC+GGntgUXOLAQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/source-map": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz",
+ "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^1.0.3"
+ },
+ "engines": {
+ "node": "^12.18.3 || >=14"
+ }
+ },
+ "node_modules/@parcel/types": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.13.3.tgz",
+ "integrity": "sha512-+RpFHxx8fy8/dpuehHUw/ja9PRExC3wJoIlIIF42E7SLu2SvlTHtKm6EfICZzxCXNEBzjoDbamCRcN0nmTPlhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/types-internal": "2.13.3",
+ "@parcel/workers": "2.13.3"
+ }
+ },
+ "node_modules/@parcel/types-internal": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/types-internal/-/types-internal-2.13.3.tgz",
+ "integrity": "sha512-Lhx0n+9RCp+Ipktf/I+CLm3zE9Iq9NtDd8b2Vr5lVWyoT8AbzBKIHIpTbhLS4kjZ80L3I6o93OYjqAaIjsqoZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/feature-flags": "2.13.3",
+ "@parcel/source-map": "^2.1.1",
+ "utility-types": "^3.10.0"
+ }
+ },
+ "node_modules/@parcel/utils": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.13.3.tgz",
+ "integrity": "sha512-yxY9xw2wOUlJaScOXYZmMGoZ4Ck4Kqj+p6Koe5kLkkWM1j98Q0Dj2tf/mNvZi4yrdnlm+dclCwNRnuE8Q9D+pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/codeframe": "2.13.3",
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/logger": "2.13.3",
+ "@parcel/markdown-ansi": "2.13.3",
+ "@parcel/rust": "2.13.3",
+ "@parcel/source-map": "^2.1.1",
+ "chalk": "^4.1.2",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
+ "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.0",
+ "@parcel/watcher-darwin-arm64": "2.5.0",
+ "@parcel/watcher-darwin-x64": "2.5.0",
+ "@parcel/watcher-freebsd-x64": "2.5.0",
+ "@parcel/watcher-linux-arm-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm-musl": "2.5.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm64-musl": "2.5.0",
+ "@parcel/watcher-linux-x64-glibc": "2.5.0",
+ "@parcel/watcher-linux-x64-musl": "2.5.0",
+ "@parcel/watcher-win32-arm64": "2.5.0",
+ "@parcel/watcher-win32-ia32": "2.5.0",
+ "@parcel/watcher-win32-x64": "2.5.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
+ "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
+ "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
+ "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
+ "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
+ "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
+ "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
+ "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
+ "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
+ "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
+ "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
+ "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
+ "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
+ "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/workers": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.13.3.tgz",
+ "integrity": "sha512-oAHmdniWTRwwwsKbcF4t3VjOtKN+/W17Wj5laiYB+HLkfsjGTfIQPj3sdXmrlBAGpI4omIcvR70PHHXnfdTfwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/diagnostic": "2.13.3",
+ "@parcel/logger": "2.13.3",
+ "@parcel/profiler": "2.13.3",
+ "@parcel/types-internal": "2.13.3",
+ "@parcel/utils": "2.13.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.13.3"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@radix-ui/number": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz",
+ "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz",
+ "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
+ "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz",
+ "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
+ "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz",
+ "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz",
+ "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz",
+ "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-escape-keydown": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz",
+ "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz",
+ "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz",
+ "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz",
+ "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-use-rect": "1.0.1",
+ "@radix-ui/react-use-size": "1.0.1",
+ "@radix-ui/rect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz",
+ "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
+ "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "1.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz",
+ "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-collection": "1.1.1",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
+ "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-collection": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz",
+ "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+ "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-direction": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-id": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
+ "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+ "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+ "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz",
+ "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/number": "1.0.1",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.4",
+ "@radix-ui/react-focus-guards": "1.0.1",
+ "@radix-ui/react-focus-scope": "1.0.3",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-popper": "1.1.2",
+ "@radix-ui/react-portal": "1.0.3",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-use-previous": "1.0.1",
+ "@radix-ui/react-visually-hidden": "1.0.3",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.5"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.1.tgz",
+ "integrity": "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+ "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+ "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+ "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.1.tgz",
+ "integrity": "sha512-i77tcgObYr743IonC1hrsnnPmszDRn8p+EGUsUt+5a/JFn28fxaM88Py6V2mc8J5kELMWishI0rLnuGLFD/nnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.1.tgz",
+ "integrity": "sha512-OgDLZEA30Ylyz8YSXvnGqIHtERqnUt1KUYTKdw/y8u7Ci6zGiJfXc02jahmcSNK3YcErqioj/9flWC9S1ihfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-roving-focus": "1.1.1",
+ "@radix-ui/react-toggle": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
+ "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+ "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-direction": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+ "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+ "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
+ "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+ "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+ "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+ "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.1.tgz",
+ "integrity": "sha512-r7T80WOCHc2n3KRzFCbHWGVzkfVTCzDofGU4gqa5ZuIzgnVaLogGsdyifFJXWQDp0lAr5hrf+X9uqQdE0pa6Ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-roving-focus": "1.1.1",
+ "@radix-ui/react-separator": "1.1.1",
+ "@radix-ui/react-toggle-group": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
+ "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+ "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-direction": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+ "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+ "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
+ "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz",
+ "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz",
+ "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz",
+ "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz",
+ "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz",
+ "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/rect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz",
+ "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz",
+ "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz",
+ "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@react-aria/breadcrumbs": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.19.tgz",
+ "integrity": "sha512-mVngOPFYVVhec89rf/CiYQGTfaLRfHFtX+JQwY7sNYNqSA+gO8p4lNARe3Be6bJPgH+LUQuruIY9/ZDL6LT3HA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/link": "^3.7.7",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/breadcrumbs": "^3.7.9",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/button": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.11.0.tgz",
+ "integrity": "sha512-b37eIV6IW11KmNIAm65F3SEl2/mgj5BrHIysW6smZX3KoKWTGYsYfcQkmtNgY0GOSFfDxMCoolsZ6mxC00nSDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/toolbar": "3.0.0-beta.11",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/toggle": "^3.8.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/calendar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.6.0.tgz",
+ "integrity": "sha512-tZ3nd5DP8uxckbj83Pt+4RqgcTWDlGi7njzc7QqFOG2ApfnYDUXbIpb/Q4KY6JNlJskG8q33wo0XfOwNy8J+eg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/calendar": "^3.6.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/calendar": "^3.5.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/checkbox": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.15.0.tgz",
+ "integrity": "sha512-z/8xd4em7o0MroBXwkkwv7QRwiJaA1FwqMhRUb7iqtBGP2oSytBEDf0N7L09oci32a1P4ZPz2rMK5GlLh/PD6g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.0.11",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/toggle": "^3.10.10",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/checkbox": "^3.6.10",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/toggle": "^3.8.0",
+ "@react-types/checkbox": "^3.9.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/collections": {
+ "version": "3.0.0-alpha.6",
+ "resolved": "https://registry.npmjs.org/@react-aria/collections/-/collections-3.0.0-alpha.6.tgz",
+ "integrity": "sha512-A+7Eap/zvsghMb5/C3EAPn41axSzRhtX2glQRXSBj1mK31CTPCZ9BhrMIMC5DL7ZnfA7C+Ysilo9nI2YQh5PMg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.7",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0",
+ "use-sync-external-store": "^1.2.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/color": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.2.tgz",
+ "integrity": "sha512-dSM5qQRcR1gRGYCBw0IGRmc29gjfoht3cQleKb8MMNcgHYa2oi5VdCs2yKXmYFwwVC6uPtnlNy9S6e0spqdr+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/numberfield": "^3.11.9",
+ "@react-aria/slider": "^3.7.14",
+ "@react-aria/spinbutton": "^3.6.10",
+ "@react-aria/textfield": "^3.15.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/visually-hidden": "^3.8.18",
+ "@react-stately/color": "^3.8.1",
+ "@react-stately/form": "^3.1.0",
+ "@react-types/color": "^3.0.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/combobox": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.11.0.tgz",
+ "integrity": "sha512-s88YMmPkMO1WSoiH1KIyZDLJqUwvM2wHXXakj3cYw1tBHGo4rOUFq+JWQIbM5EDO4HOR4AUUqzIUd0NO7t3zyg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/listbox": "^3.13.6",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/menu": "^3.16.0",
+ "@react-aria/overlays": "^3.24.0",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/textfield": "^3.15.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/combobox": "^3.10.1",
+ "@react-stately/form": "^3.1.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/combobox": "^3.13.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/datepicker": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.12.0.tgz",
+ "integrity": "sha512-VYNXioLfddIHpwQx211+rTYuunDmI7VHWBRetCpH3loIsVFuhFSRchTQpclAzxolO3g0vO7pMVj9VYt7Swp6kg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@internationalized/number": "^3.6.0",
+ "@internationalized/string": "^3.2.5",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/form": "^3.0.11",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/spinbutton": "^3.6.10",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/datepicker": "^3.11.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/calendar": "^3.5.0",
+ "@react-types/datepicker": "^3.9.0",
+ "@react-types/dialog": "^3.5.14",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/dialog": {
+ "version": "3.5.20",
+ "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.20.tgz",
+ "integrity": "sha512-l0GZVLgeOd3kL3Yj8xQW7wN3gn9WW3RLd/SGI9t7ciTq+I/FhftjXCWzXLlOCCTLMf+gv7eazecECtmoWUaZWQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/overlays": "^3.24.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/dialog": "^3.5.14",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/disclosure": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/disclosure/-/disclosure-3.0.0.tgz",
+ "integrity": "sha512-xO9QTQSvymujTjCs1iCQ4+dKZvtF/rVVaFZBKlUtqIqwTHMdqeZu4fh5miLEnTyVLNHMGzLrFggsd8Q+niC9Og==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.7",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/disclosure": "^3.0.0",
+ "@react-types/button": "^3.10.1",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/dnd": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.8.0.tgz",
+ "integrity": "sha512-JiqHY3E9fDU5Kb4gN22cuK6QNlpMCGe6ngR/BV+Q8mLEsdoWcoUAYOtYXVNNTRvCdVbEWI87FUU+ThyPpoDhNQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/string": "^3.2.5",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/overlays": "^3.24.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/dnd": "^3.5.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/focus": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.19.0.tgz",
+ "integrity": "sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/form": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.11.tgz",
+ "integrity": "sha512-oXzjTiwVuuWjZ8muU0hp3BrDH5qjVctLOF50mjPvqUbvXQTHhoDxWweyIXPQjGshaqBd2w4pWaE4A2rG2O/apw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/grid": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.11.0.tgz",
+ "integrity": "sha512-lN5FpQgu2Rq0CzTPWmzRpq6QHcMmzsXYeClsgO3108uVp1/genBNAObYVTxGOKe/jb9q99trz8EtIn05O6KN1g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/grid": "^3.10.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-types/checkbox": "^3.9.0",
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/gridlist": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.10.0.tgz",
+ "integrity": "sha512-UcblfSZ7kJBrjg9mQ5VbnRevN81UiYB4NuL5PwIpBpridO7tnl4ew6+96PYU7Wj1chHhPS3x0b0zmuSVN7A0LA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/grid": "^3.11.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-stately/tree": "^3.8.6",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/i18n": {
+ "version": "3.12.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.4.tgz",
+ "integrity": "sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@internationalized/message": "^3.1.6",
+ "@internationalized/number": "^3.6.0",
+ "@internationalized/string": "^3.2.5",
+ "@react-aria/ssr": "^3.9.7",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/interactions": {
+ "version": "3.22.5",
+ "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.5.tgz",
+ "integrity": "sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.7",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/label": {
+ "version": "3.7.13",
+ "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.13.tgz",
+ "integrity": "sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/link": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.7.7.tgz",
+ "integrity": "sha512-eVBRcHKhNSsATYWv5wRnZXRqPVcKAWWakyvfrYePIKpC3s4BaHZyTGYdefk8ZwZdEOuQZBqLMnjW80q1uhtkuA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/link": "^3.5.9",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/listbox": {
+ "version": "3.13.6",
+ "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.13.6.tgz",
+ "integrity": "sha512-6hEXEXIZVau9lgBZ4VVjFR3JnGU+fJaPmV3HP0UZ2ucUptfG0MZo24cn+ZQJsWiuaCfNFv5b8qribiv+BcO+Kg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-types/listbox": "^3.5.3",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/live-announcer": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.1.tgz",
+ "integrity": "sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@react-aria/menu": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.16.0.tgz",
+ "integrity": "sha512-TNk+Vd3TbpBPUxEloAdHRTaRxf9JBK7YmkHYiq0Yj5Lc22KS0E2eTyhpPM9xJvEWN2TlC5TEvNfdyui2kYWFFQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/overlays": "^3.24.0",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/menu": "^3.9.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-stately/tree": "^3.8.6",
+ "@react-types/button": "^3.10.1",
+ "@react-types/menu": "^3.9.13",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/meter": {
+ "version": "3.4.18",
+ "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.18.tgz",
+ "integrity": "sha512-tTX3LLlmDIHqrC42dkdf+upb1c4UbhlpZ52gqB64lZD4OD4HE+vMTwNSe+7MRKMLvcdKPWCRC35PnxIHZ15kfQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/progress": "^3.4.18",
+ "@react-types/meter": "^3.4.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/numberfield": {
+ "version": "3.11.9",
+ "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.9.tgz",
+ "integrity": "sha512-3tiGPx2y4zyOV7PmdBASes99ZZsFTZAJTnU45Z+p1CW4131lw7y2ZhbojBl7U6DaXAJvi1z6zY6cq2UE9w5a0Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/spinbutton": "^3.6.10",
+ "@react-aria/textfield": "^3.15.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/numberfield": "^3.9.8",
+ "@react-types/button": "^3.10.1",
+ "@react-types/numberfield": "^3.8.7",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/overlays": {
+ "version": "3.24.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.24.0.tgz",
+ "integrity": "sha512-0kAXBsMNTc/a3M07tK9Cdt/ea8CxTAEJ223g8YgqImlmoBBYAL7dl5G01IOj67TM64uWPTmZrOklBchHWgEm3A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/ssr": "^3.9.7",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/visually-hidden": "^3.8.18",
+ "@react-stately/overlays": "^3.6.12",
+ "@react-types/button": "^3.10.1",
+ "@react-types/overlays": "^3.8.11",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/progress": {
+ "version": "3.4.18",
+ "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.18.tgz",
+ "integrity": "sha512-FOLgJ9t9i1u3oAAimybJG6r7/soNPBnJfWo4Yr6MmaUv90qVGa1h6kiuM5m9H/bm5JobAebhdfHit9lFlgsCmg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/progress": "^3.5.8",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/radio": {
+ "version": "3.10.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.10.tgz",
+ "integrity": "sha512-NVdeOVrsrHgSfwL2jWCCXFsWZb+RMRZErj5vthHQW4nkHECGOzeX56VaLWTSvdoCPqi9wdIX8A6K9peeAIgxzA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/form": "^3.0.11",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/radio": "^3.10.9",
+ "@react-types/radio": "^3.8.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/searchfield": {
+ "version": "3.7.11",
+ "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.11.tgz",
+ "integrity": "sha512-wFf6QxtBFfoxy0ANxI0+ftFEBGynVCY0+ce4H4Y9LpUTQsIKMp3sdc7LoUFORWw5Yee6Eid5cFPQX0Ymnk+ZJg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/textfield": "^3.15.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/searchfield": "^3.5.8",
+ "@react-types/button": "^3.10.1",
+ "@react-types/searchfield": "^3.5.10",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/select": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.15.0.tgz",
+ "integrity": "sha512-zgBOUNy81aJplfc3NKDJMv8HkXjBGzaFF3XDzNfW8vJ7nD9rcTRUN5SQ1XCEnKMv12B/Euk9zt6kd+tX0wk1vQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/form": "^3.0.11",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/listbox": "^3.13.6",
+ "@react-aria/menu": "^3.16.0",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/visually-hidden": "^3.8.18",
+ "@react-stately/select": "^3.6.9",
+ "@react-types/button": "^3.10.1",
+ "@react-types/select": "^3.9.8",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/selection": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.21.0.tgz",
+ "integrity": "sha512-52JJ6hlPcM+gt0VV3DBmz6Kj1YAJr13TfutrKfGWcK36LvNCBm1j0N+TDqbdnlp8Nue6w0+5FIwZq44XPYiBGg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/separator": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.4.4.tgz",
+ "integrity": "sha512-dH+qt0Mdh0nhKXCHW6AR4DF8DKLUBP26QYWaoThPdBwIpypH/JVKowpPtWms1P4b36U6XzHXHnTTEn/ZVoCqNA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/slider": {
+ "version": "3.7.14",
+ "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.14.tgz",
+ "integrity": "sha512-7rOiKjLkEZ0j7mPMlwrqivc+K4OSfL14slaQp06GHRiJkhiWXh2/drPe15hgNq55HmBQBpA0umKMkJcqVgmXPA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/slider": "^3.6.0",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/slider": "^3.7.7",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/spinbutton": {
+ "version": "3.6.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.10.tgz",
+ "integrity": "sha512-nhYEYk7xUNOZDaqiQ5w/nHH9ouqjJbabTWXH+KK7UR1oVGfo4z1wG94l8KWF3Z6SGGnBxzLJyTBguZ4g9aYTSg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/ssr": {
+ "version": "3.9.7",
+ "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz",
+ "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/switch": {
+ "version": "3.6.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.10.tgz",
+ "integrity": "sha512-FtaI9WaEP1tAmra1sYlAkYXg9x75P5UtgY8pSbe9+1WRyWbuE1QZT+RNCTi3IU4fZ7iJQmXH6+VaMyzPlSUagw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/toggle": "^3.10.10",
+ "@react-stately/toggle": "^3.8.0",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/switch": "^3.5.7",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/table": {
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.16.0.tgz",
+ "integrity": "sha512-9xF9S3CJ7XRiiK92hsIKxPedD0kgcQWwqTMtj3IBynpQ4vsnRiW3YNIzrn9C3apjknRZDTSta8O2QPYCUMmw2A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/grid": "^3.11.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/visually-hidden": "^3.8.18",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/flags": "^3.0.5",
+ "@react-stately/table": "^3.13.0",
+ "@react-types/checkbox": "^3.9.0",
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/table": "^3.10.3",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-aria/tabs": {
"version": "3.9.8",
- "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.9.8.tgz",
- "integrity": "sha512-Nur/qRFBe+Zrt4xcCJV/ULXCS3Mlae+B89bp1Gl20vSDqk6uaPtGk+cS5k03eugOvas7AQapqNJsJgKd66TChw==",
+ "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.9.8.tgz",
+ "integrity": "sha512-Nur/qRFBe+Zrt4xcCJV/ULXCS3Mlae+B89bp1Gl20vSDqk6uaPtGk+cS5k03eugOvas7AQapqNJsJgKd66TChw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/tabs": "^3.7.0",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/tabs": "^3.3.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tag": {
+ "version": "3.4.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.4.8.tgz",
+ "integrity": "sha512-exWl52bsFtJuzaqMYvSnLteUoPqb3Wf+uICru/yRtREJsWVqjJF38NCVlU73Yqd9qMPTctDrboSZFAWAWKDxoA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/gridlist": "^3.10.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/textfield": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.15.0.tgz",
+ "integrity": "sha512-V5mg7y1OR6WXYHdhhm4FC7QyGc9TideVRDFij1SdOJrIo5IFB7lvwpOS0GmgwkVbtr71PTRMjZnNbrJUFU6VNA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/form": "^3.0.11",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/textfield": "^3.10.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/toggle": {
+ "version": "3.10.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.10.tgz",
+ "integrity": "sha512-QwMT/vTNrbrILxWVHfd9zVQ3mV2NdBwyRu+DphVQiFAXcmc808LEaIX2n0lI6FCsUDC9ZejCyvzd91/YemdZ1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/toggle": "^3.8.0",
+ "@react-types/checkbox": "^3.9.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/toolbar": {
+ "version": "3.0.0-beta.11",
+ "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.11.tgz",
+ "integrity": "sha512-LM3jTRFNDgoEpoL568WaiuqiVM7eynSQLJis1hV0vlVnhTd7M7kzt7zoOjzxVb5Uapz02uCp1Fsm4wQMz09qwQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tooltip": {
+ "version": "3.7.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.10.tgz",
+ "integrity": "sha512-Udi3XOnrF/SYIz72jw9bgB74MG/yCOzF5pozHj2FH2HiJlchYv/b6rHByV/77IZemdlkmL/uugrv/7raPLSlnw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/tooltip": "^3.5.0",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/tooltip": "^3.4.13",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/tree": {
+ "version": "3.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.0-beta.2.tgz",
+ "integrity": "sha512-lH3hVl2VgG3YLN+ee1zQzm+2F+BGLd/HBhfMYPuI3IjHvDb+m+jCJXHdBOGrfG2Qydk2LYheqX8QXCluulu0qQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/gridlist": "^3.10.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/tree": "^3.8.6",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/utils": {
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.26.0.tgz",
+ "integrity": "sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.7",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/virtualizer": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-4.1.0.tgz",
+ "integrity": "sha512-ziSq3Y7iuaAMJWGZU1RRs/TykuPapQfx8dyH2eyKPLgEjBUoXRGWE7n6jklBwal14b0lPK0wkCzRoQbkUvX3cg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-stately/virtualizer": "^4.2.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/visually-hidden": {
+ "version": "3.8.18",
+ "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.18.tgz",
+ "integrity": "sha512-l/0igp+uub/salP35SsNWq5mGmg3G5F5QMS1gDZ8p28n7CgjvzyiGhJbbca7Oxvaw1HRFzVl9ev+89I7moNnFQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/calendar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.6.0.tgz",
+ "integrity": "sha512-GqUtOtGnwWjtNrJud8nY/ywI4VBP5byToNVRTnxbMl+gYO1Qe/uc5NG7zjwMxhb2kqSBHZFdkF0DXVqG2Ul+BA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/calendar": "^3.5.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/checkbox": {
+ "version": "3.6.10",
+ "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.10.tgz",
+ "integrity": "sha512-LHm7i4YI8A/RdgWAuADrnSAYIaYYpQeZqsp1a03Og0pJHAlZL0ymN3y2IFwbZueY0rnfM+yF+kWNXjJqbKrFEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/checkbox": "^3.9.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/collections": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.12.0.tgz",
+ "integrity": "sha512-MfR9hwCxe5oXv4qrLUnjidwM50U35EFmInUeFf8i9mskYwWlRYS0O1/9PZ0oF1M0cKambaRHKEy98jczgb9ycA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/color": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.8.1.tgz",
+ "integrity": "sha512-7eN7K+KJRu+rxK351eGrzoq2cG+yipr90i5b1cUu4lioYmcH4WdsfjmM5Ku6gypbafH+kTDfflvO6hiY1NZH+A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/number": "^3.6.0",
+ "@internationalized/string": "^3.2.5",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/numberfield": "^3.9.8",
+ "@react-stately/slider": "^3.6.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/color": "^3.0.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/combobox": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.10.1.tgz",
+ "integrity": "sha512-Rso+H+ZEDGFAhpKWbnRxRR/r7YNmYVtt+Rn0eNDNIUp3bYaxIBCdCySyAtALs4I8RZXZQ9zoUznP7YeVwG3cLg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-stately/overlays": "^3.6.12",
+ "@react-stately/select": "^3.6.9",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/combobox": "^3.13.1",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/data": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.12.0.tgz",
+ "integrity": "sha512-6PiW2oA56lcH1CVjDcajutzsv91w/PER8K61/OGxtNFFUWaIZH80RWmK4kjU/Lf0vygzXCxout3kEb388lUk0w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/datepicker": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.11.0.tgz",
+ "integrity": "sha512-d9MJF34A0VrhL5y5S8mAISA8uwfNCQKmR2k4KoQJm3De1J8SQeNzSjLviAwh1faDow6FXGlA6tVbTrHyDcBgBg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@internationalized/string": "^3.2.5",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/overlays": "^3.6.12",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/datepicker": "^3.9.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/disclosure": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/disclosure/-/disclosure-3.0.0.tgz",
+ "integrity": "sha512-Z9+fi0/41ZXHjGopORQza7mk4lFEFslKhy65ehEo6O6j2GuIV0659ExIVDsmJoJSFjXCfGh0sX8oTSOlXi9gqg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/dnd": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.5.0.tgz",
+ "integrity": "sha512-ZcWFw1npEDnATiy3TEdzA1skQ3UEIyfbNA6VhPNO8yiSVLxoxBOaEaq8VVS72fRGAtxud6dgOy8BnsP9JwDClQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/selection": "^3.18.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/flags": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.5.tgz",
+ "integrity": "sha512-6wks4csxUwPCp23LgJSnkBRhrWpd9jGd64DjcCTNB2AHIFu7Ab1W59pJpUL6TW7uAxVxdNKjgn6D1hlBy8qWsA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@react-stately/form": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.1.0.tgz",
+ "integrity": "sha512-E2wxNQ0QaTyDHD0nJFtTSnEH9A3bpJurwxhS4vgcUmESHgjFEMLlC9irUSZKgvOgb42GAq+fHoWBsgKeTp9Big==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/grid": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.10.0.tgz",
+ "integrity": "sha512-ii+DdsOBvCnHMgL0JvUfFwO1kiAPP19Bpdpl6zn/oOltk6F5TmnoyNrzyz+2///1hCiySI3FE1O7ujsAQs7a6Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/layout": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-4.1.0.tgz",
+ "integrity": "sha512-pSBqn+4EeOaf2QMK+w2SHgsWKYHdgMZWY3qgJijdzWGZ4JpYmHuiD0yOq80qFdUwxcexPW3vFg3hqIQlMpXeCw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/table": "^3.13.0",
+ "@react-stately/virtualizer": "^4.2.0",
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/table": "^3.10.3",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/list": {
+ "version": "3.11.1",
+ "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.11.1.tgz",
+ "integrity": "sha512-UCOpIvqBOjwLtk7zVTYWuKU1m1Oe61Q5lNar/GwHaV1nAiSQ8/yYlhr40NkBEs9X3plEfsV28UIpzOrYnu1tPg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/menu": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.0.tgz",
+ "integrity": "sha512-++sm0fzZeUs9GvtRbj5RwrP+KL9KPANp9f4SvtI3s+MP+Y/X3X7LNNePeeccGeyikB5fzMsuyvd82bRRW9IhDQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/overlays": "^3.6.12",
+ "@react-types/menu": "^3.9.13",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/numberfield": {
+ "version": "3.9.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.8.tgz",
+ "integrity": "sha512-J6qGILxDNEtu7yvd3/y+FpbrxEaAeIODwlrFo6z1kvuDlLAm/KszXAc75yoDi0OtakFTCMP6/HR5VnHaQdMJ3w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/number": "^3.6.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/numberfield": "^3.8.7",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/overlays": {
+ "version": "3.6.12",
+ "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.12.tgz",
+ "integrity": "sha512-QinvZhwZgj8obUyPIcyURSCjTZlqZYRRCS60TF8jH8ZpT0tEAuDb3wvhhSXuYA3Xo9EHLwvLjEf3tQKKdAQArw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/overlays": "^3.8.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/radio": {
+ "version": "3.10.9",
+ "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.9.tgz",
+ "integrity": "sha512-kUQ7VdqFke8SDRCatw2jW3rgzMWbvw+n2imN2THETynI47NmNLzNP11dlGO2OllRtTrsLhmBNlYHa3W62pFpAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/radio": "^3.8.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/searchfield": {
+ "version": "3.5.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.8.tgz",
+ "integrity": "sha512-jtquvGadx1DmtQqPKaVO6Qg/xpBjNxsOd59ciig9xRxpxV+90i996EX1E2R6R+tGJdSM1pD++7PVOO4yE++HOg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/searchfield": "^3.5.10",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/select": {
+ "version": "3.6.9",
+ "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.9.tgz",
+ "integrity": "sha512-vASUDv7FhEYQURzM+JIwcusPv7/x/l3zHc/oKJPvoCl3aa9pwS8hZwS82SC00o2iFnrDscfDJju4IE/cd4hucg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-stately/overlays": "^3.6.12",
+ "@react-types/select": "^3.9.8",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/selection": {
+ "version": "3.18.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.18.0.tgz",
+ "integrity": "sha512-6EaNNP3exxBhW2LkcRR4a3pg+3oDguZlBSqIVVR7lyahv/D8xXHRC4dX+m0mgGHJpsgjs7664Xx6c8v193TFxg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/slider": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.6.0.tgz",
+ "integrity": "sha512-w5vJxVh267pmD1X+Ppd9S3ZzV1hcg0cV8q5P4Egr160b9WMcWlUspZPtsthwUlN7qQe/C8y5IAhtde4s29eNag==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/slider": "^3.7.7",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/table": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.13.0.tgz",
+ "integrity": "sha512-mRbNYrwQIE7xzVs09Lk3kPteEVFVyOc20vA8ph6EP54PiUf/RllJpxZe/WUYLf4eom9lUkRYej5sffuUBpxjCA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/flags": "^3.0.5",
+ "@react-stately/grid": "^3.10.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/table": "^3.10.3",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/tabs": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.7.0.tgz",
+ "integrity": "sha512-ox4hTkfZCoR4Oyr3Op3rBlWNq2Wxie04vhEYpTZQ2hobR3l4fYaOkd7CPClILktJ3TC104j8wcb0knWxIBRx9w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/list": "^3.11.1",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/tabs": "^3.3.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/toggle": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.8.0.tgz",
+ "integrity": "sha512-pyt/k/J8BwE/2g6LL6Z6sMSWRx9HEJB83Sm/MtovXnI66sxJ2EfQ1OaXB7Su5PEL9OMdoQF6Mb+N1RcW3zAoPw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/checkbox": "^3.9.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/tooltip": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.0.tgz",
+ "integrity": "sha512-+xzPNztJDd2XJD0X3DgWKlrgOhMqZpSzsIssXeJgO7uCnP8/Z513ESaipJhJCFC8fxj5caO/DK4Uu8hEtlB8cQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/overlays": "^3.6.12",
+ "@react-types/tooltip": "^3.4.13",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/tree": {
+ "version": "3.8.6",
+ "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.6.tgz",
+ "integrity": "sha512-lblUaxf1uAuIz5jm6PYtcJ+rXNNVkqyFWTIMx6g6gW/mYvm8GNx1G/0MLZE7E6CuDGaO9dkLSY2bB1uqyKHidA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/utils": {
+ "version": "3.10.5",
+ "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz",
+ "integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/virtualizer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-4.2.0.tgz",
+ "integrity": "sha512-aTMpa9AQoz/xLqn8AI1BR/caUUY7/OUo9GbuF434w2u5eGCL7+SAn3Fmq7WSCwqYyDsO+jEIERek4JTX7pEW0A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/utils": "^3.26.0",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/breadcrumbs": {
+ "version": "3.7.9",
+ "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.9.tgz",
+ "integrity": "sha512-eARYJo8J+VfNV8vP4uw3L2Qliba9wLV2bx9YQCYf5Lc/OE5B/y4gaTLz+Y2P3Rtn6gBPLXY447zCs5i7gf+ICg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/link": "^3.5.9",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/button": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.10.1.tgz",
+ "integrity": "sha512-XTtap8o04+4QjPNAshFWOOAusUTxQlBjU2ai0BTVLShQEjHhRVDBIWsI2B2FKJ4KXT6AZ25llaxhNrreWGonmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/calendar": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.5.0.tgz",
+ "integrity": "sha512-O3IRE7AGwAWYnvJIJ80cOy7WwoJ0m8GtX/qSmvXQAjC4qx00n+b5aFNBYAQtcyc3RM5QpW6obs9BfwGetFiI8w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/checkbox": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.9.0.tgz",
+ "integrity": "sha512-9hbHx0Oo2Hp5a8nV8Q75LQR0DHtvOIJbFaeqESSopqmV9EZoYjtY/h0NS7cZetgahQgnqYWQi44XGooMDCsmxA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/color": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.1.tgz",
+ "integrity": "sha512-KemFziO3GbmT3HEKrgOGdqNA6Gsmy9xrwFO3f8qXSG7gVz6M27Ic4R9HVQv4iAjap5uti6W13/pk2bc/jLVcEA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0",
+ "@react-types/slider": "^3.7.7"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/combobox": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.1.tgz",
+ "integrity": "sha512-7xr+HknfhReN4QPqKff5tbKTe2kGZvH+DGzPYskAtb51FAAiZsKo+WvnNAvLwg3kRoC9Rkn4TAiVBp/HgymRDw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/datepicker": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.9.0.tgz",
+ "integrity": "sha512-dbKL5Qsm2MQwOTtVQdOcKrrphcXAqDD80WLlSQrBLg+waDuuQ7H+TrvOT0thLKloNBlFUGnZZfXGRHINpih/0g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@react-types/calendar": "^3.5.0",
+ "@react-types/overlays": "^3.8.11",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/dialog": {
+ "version": "3.5.14",
+ "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.14.tgz",
+ "integrity": "sha512-OXWMjrALwrlgw8aHD8SeRm/s3tbAssdaEh2h73KUSeFau3fU3n5mfKv+WnFqsEaOtN261o48l7hTlS6615H9AA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/overlays": "^3.8.11",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/form": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.8.tgz",
+ "integrity": "sha512-0wOS97/X0ijTVuIqik1lHYTZnk13QkvMTKvIEhM7c6YMU3vPiirBwLbT2kJiAdwLiymwcCkrBdDF1NTRG6kPFA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/grid": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.10.tgz",
+ "integrity": "sha512-Z5cG0ITwqjUE4kWyU5/7VqiPl4wqMJ7kG/ZP7poAnLmwRsR8Ai0ceVn+qzp5nTA19cgURi8t3LsXn3Ar1FBoog==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/link": {
+ "version": "3.5.9",
+ "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.9.tgz",
+ "integrity": "sha512-JcKDiDMqrq/5Vpn+BdWQEuXit4KN4HR/EgIi3yKnNbYkLzxBoeQZpQgvTaC7NEQeZnSqkyXQo3/vMUeX/ZNIKw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/listbox": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.5.3.tgz",
+ "integrity": "sha512-v1QXd9/XU3CCKr2Vgs7WLcTr6VMBur7CrxHhWZQQFExsf9bgJ/3wbUdjy4aThY/GsYHiaS38EKucCZFr1QAfqA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/menu": {
+ "version": "3.9.13",
+ "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.13.tgz",
+ "integrity": "sha512-7SuX6E2tDsqQ+HQdSvIda1ji/+ujmR86dtS9CUu5yWX91P25ufRjZ72EvLRqClWNQsj1Xl4+2zBDLWlceznAjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/overlays": "^3.8.11",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/meter": {
+ "version": "3.4.5",
+ "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.5.tgz",
+ "integrity": "sha512-04w1lEtvP/c3Ep8ND8hhH2rwjz2MtQ8o8SNLhahen3u0rX3jKOgD4BvHujsyvXXTMjj1Djp74sGzNawb4Ppi9w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/progress": "^3.5.8"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/numberfield": {
+ "version": "3.8.7",
+ "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.7.tgz",
+ "integrity": "sha512-KccMPi39cLoVkB2T0V7HW6nsxQVAwt89WWCltPZJVGzsebv/k0xTQlPVAgrUake4kDLoE687e3Fr/Oe3+1bDhw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/overlays": {
+ "version": "3.8.11",
+ "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.11.tgz",
+ "integrity": "sha512-aw7T0rwVI3EuyG5AOaEIk8j7dZJQ9m34XAztXJVZ/W2+4pDDkLDbJ/EAPnuo2xGYRGhowuNDn4tDju01eHYi+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/progress": {
+ "version": "3.5.8",
+ "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.8.tgz",
+ "integrity": "sha512-PR0rN5mWevfblR/zs30NdZr+82Gka/ba7UHmYOW9/lkKlWeD7PHgl1iacpd/3zl/jUF22evAQbBHmk1mS6Mpqw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/radio": {
+ "version": "3.8.5",
+ "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.5.tgz",
+ "integrity": "sha512-gSImTPid6rsbJmwCkTliBIU/npYgJHOFaI3PNJo7Y0QTAnFelCtYeFtBiWrFodSArSv7ASqpLLUEj9hZu/rxIg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/searchfield": {
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.10.tgz",
+ "integrity": "sha512-7wW4pJzbReawoGPu8a4l+CODTCDN088EN/ysUzl622ewim57PjArjix+lpO4+aEtJqS9HKpq8UEbjwo9axpcUA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0",
+ "@react-types/textfield": "^3.10.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/select": {
+ "version": "3.9.8",
+ "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.8.tgz",
+ "integrity": "sha512-RGsYj2oFjXpLnfcvWMBQnkcDuKkwT43xwYWZGI214/gp/B64tJiIUgTM5wFTRAeGDX23EePkhCQF+9ctnqFd6g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/shared": {
+ "version": "3.26.0",
+ "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.26.0.tgz",
+ "integrity": "sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/slider": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.7.tgz",
+ "integrity": "sha512-lYTR9zXQV2fSEm/G3gwDENWiki1IXd/oorsgf0zu1DBi2SQDbOsLsGUXiwvD24Xy6OkUuhAqjLPPexezo7+u9g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/switch": {
+ "version": "3.5.7",
+ "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.7.tgz",
+ "integrity": "sha512-1IKiq510rPTHumEZuhxuazuXBa2Cuxz6wBIlwf3NCVmgWEvU+uk1ETG0sH2yymjwCqhtJDKXi+qi9HSgPEDwAg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/table": {
+ "version": "3.10.3",
+ "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.10.3.tgz",
+ "integrity": "sha512-Ac+W+m/zgRzlTU8Z2GEg26HkuJFswF9S6w26r+R3MHwr8z2duGPvv37XRtE1yf3dbpRBgHEAO141xqS2TqGwNg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/tabs": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.11.tgz",
+ "integrity": "sha512-BjF2TqBhZaIcC4lc82R5pDJd1F7kstj1K0Nokhz99AGYn8C0ITdp6lR+DPVY9JZRxKgP9R2EKfWGI90Lo7NQdA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/textfield": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.10.0.tgz",
+ "integrity": "sha512-ShU3d6kLJGQjPXccVFjM3KOXdj3uyhYROqH9YgSIEVxgA9W6LRflvk/IVBamD9pJYTPbwmVzuP0wQkTDupfZ1w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/tooltip": {
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.13.tgz",
+ "integrity": "sha512-KPekFC17RTT8kZlk7ZYubueZnfsGTDOpLw7itzolKOXGddTXsrJGBzSB4Bb060PBVllaDO0MOrhPap8OmrIl1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-types/overlays": "^3.8.11",
+ "@react-types/shared": "^3.26.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
+ "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz",
+ "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz",
+ "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz",
+ "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz",
+ "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz",
+ "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz",
+ "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz",
+ "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz",
+ "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz",
+ "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz",
+ "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz",
+ "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz",
+ "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz",
+ "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz",
+ "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz",
+ "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz",
+ "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz",
+ "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz",
+ "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz",
+ "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@storybook/addon-a11y": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.6.20.tgz",
+ "integrity": "sha512-t19O2KW+8NF8mdxAZdubpe0s/3x7z5cl4LdyiNQgYxcUGjhjAUD+C3UvEUsRxG71ZAID/VC8SX+G2HX5TENGHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/addon-highlight": "7.6.20",
+ "axe-core": "^4.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-actions": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.20.tgz",
+ "integrity": "sha512-c/GkEQ2U9BC/Ew/IMdh+zvsh4N6y6n7Zsn2GIhJgcu9YEAa5aF2a9/pNgEGBMOABH959XE8DAOMERw/5qiLR8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core-events": "7.6.20",
+ "@storybook/global": "^5.0.0",
+ "@types/uuid": "^9.0.1",
+ "dequal": "^2.0.2",
+ "polished": "^4.2.2",
+ "uuid": "^9.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-backgrounds": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.20.tgz",
+ "integrity": "sha512-a7ukoaXT42vpKsMxkseIeO3GqL0Zst2IxpCTq5dSlXiADrcemSF/8/oNpNW9C4L6F1Zdt+WDtECXslEm017FvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "memoizerific": "^1.11.3",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-controls": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.20.tgz",
+ "integrity": "sha512-06ZT5Ce1sZW52B0s6XuokwjkKO9GqHlTUHvuflvd8wifxKlCmRvNUxjBvwh+ccGJ49ZS73LbMSLFgtmBEkCxbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/blocks": "7.6.20",
+ "lodash": "^4.17.21",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-docs": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.20.tgz",
+ "integrity": "sha512-XNfYRhbxH5JP7B9Lh4W06PtMefNXkfpV39Gaoih5HuqngV3eoSL4RikZYOMkvxRGQ738xc6axySU3+JKcP1OZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^29.3.1",
+ "@mdx-js/react": "^2.1.5",
+ "@storybook/blocks": "7.6.20",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/components": "7.6.20",
+ "@storybook/csf-plugin": "7.6.20",
+ "@storybook/csf-tools": "7.6.20",
+ "@storybook/global": "^5.0.0",
+ "@storybook/mdx2-csf": "^1.0.0",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/postinstall": "7.6.20",
+ "@storybook/preview-api": "7.6.20",
+ "@storybook/react-dom-shim": "7.6.20",
+ "@storybook/theming": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "fs-extra": "^11.1.0",
+ "remark-external-links": "^8.0.0",
+ "remark-slug": "^6.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/addon-essentials": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.20.tgz",
+ "integrity": "sha512-hCupSOiJDeOxJKZSgH0x5Mb2Xqii6mps21g5hpxac1XjhQtmGflShxi/xOHhK3sNqrbgTSbScfpUP3hUlZO/2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/addon-actions": "7.6.20",
+ "@storybook/addon-backgrounds": "7.6.20",
+ "@storybook/addon-controls": "7.6.20",
+ "@storybook/addon-docs": "7.6.20",
+ "@storybook/addon-highlight": "7.6.20",
+ "@storybook/addon-measure": "7.6.20",
+ "@storybook/addon-outline": "7.6.20",
+ "@storybook/addon-toolbars": "7.6.20",
+ "@storybook/addon-viewport": "7.6.20",
+ "@storybook/core-common": "7.6.20",
+ "@storybook/manager-api": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/preview-api": "7.6.20",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/addon-highlight": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.20.tgz",
+ "integrity": "sha512-7/x7xFdFyqCki5Dm3uBePldUs9l98/WxJ7rTHQuYqlX7kASwyN5iXPzuhmMRUhlMm/6G6xXtLabIpzwf1sFurA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-interactions": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.20.tgz",
+ "integrity": "sha512-uH+OIxLtvfnnmdN3Uf8MwzfEFYtaqSA6Hir6QNPc643se0RymM8mULN0rzRyvspwd6OagWdtOxsws3aHk02KTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "@storybook/types": "7.6.20",
+ "jest-mock": "^27.0.6",
+ "polished": "^4.2.2",
+ "ts-dedent": "^2.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-links": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.20.tgz",
+ "integrity": "sha512-iomSnBD90CA4MinesYiJkFX2kb3P1Psd/a1Y0ghlFEsHD4uMId9iT6sx2s16DYMja0SlPkrbWYnGukqaCjZpRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/csf": "^0.1.2",
+ "@storybook/global": "^5.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/addon-measure": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.20.tgz",
+ "integrity": "sha512-i2Iq08bGfI7gZbG6Lb8uF/L287tnaGUR+2KFEmdBjH6+kgjWLiwfpanoPQpy4drm23ar0gUjX+L3Ri03VI5/Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "tiny-invariant": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-onboarding": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-1.0.8.tgz",
+ "integrity": "sha512-3WwCocUuTibHWO89uzAbeONEn6x9NkmxA0mOU4rYPhEsMQ4NDNDD1GXcievZmpwt5VviFgw5FRx8+BxPn54YmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/telemetry": "^7.1.0-alpha.32",
+ "react-confetti": "^6.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/addon-outline": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.20.tgz",
+ "integrity": "sha512-TdsIQZf/TcDsGoZ1XpO+9nBc4OKqcMIzY4SrI8Wj9dzyFLQ37s08gnZr9POci8AEv62NTUOVavsxcafllkzqDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-themes": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-7.6.20.tgz",
+ "integrity": "sha512-GYEeukzoZ//BpFqICUEYOlsjiKHoRVT+odxtQMHGFIbpkc+Ba4hgU/KQip/fNeb6gUEPeJx66IFOm2b1gmxxIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-toolbars": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.20.tgz",
+ "integrity": "sha512-5Btg4i8ffWTDHsU72cqxC8nIv9N3E3ObJAc6k0llrmPBG/ybh3jxmRfs8fNm44LlEXaZ5qrK/petsXX3UbpIFg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/addon-viewport": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.20.tgz",
+ "integrity": "sha512-i8mIw8BjLWAVHEQsOTE6UPuEGQvJDpsu1XZnOCkpfTfPMz73m+3td/PmLG7mMT2wPnLu9IZncKLCKTAZRbt/YQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "memoizerific": "^1.11.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/api": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/api/-/api-7.6.20.tgz",
+ "integrity": "sha512-XY57J1fM7mHlhtZ5tgbpOV5OT/FoyBNYbbN1ILgnpot+1gysDwVRaibLwD0zlj+OZEvF8jIjobLpesiIda3KPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/manager-api": "7.6.20"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/blocks": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.20.tgz",
+ "integrity": "sha512-xADKGEOJWkG0UD5jbY4mBXRlmj2C+CIupDL0/hpzvLvwobxBMFPKZIkcZIMvGvVnI/Ui+tJxQxLSuJ5QsPthUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/channels": "7.6.20",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/components": "7.6.20",
+ "@storybook/core-events": "7.6.20",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/docs-tools": "7.6.20",
+ "@storybook/global": "^5.0.0",
+ "@storybook/manager-api": "7.6.20",
+ "@storybook/preview-api": "7.6.20",
+ "@storybook/theming": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/lodash": "^4.14.167",
+ "color-convert": "^2.0.1",
+ "dequal": "^2.0.2",
+ "lodash": "^4.17.21",
+ "markdown-to-jsx": "^7.1.8",
+ "memoizerific": "^1.11.3",
+ "polished": "^4.2.2",
+ "react-colorful": "^5.1.2",
+ "telejson": "^7.2.0",
+ "tocbot": "^4.20.1",
+ "ts-dedent": "^2.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/builder-manager": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.20.tgz",
+ "integrity": "sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@fal-works/esbuild-plugin-global-externals": "^2.1.2",
+ "@storybook/core-common": "7.6.20",
+ "@storybook/manager": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@types/ejs": "^3.1.1",
+ "@types/find-cache-dir": "^3.2.1",
+ "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10",
+ "browser-assert": "^1.2.1",
+ "ejs": "^3.1.8",
+ "esbuild": "^0.18.0",
+ "esbuild-plugin-alias": "^0.2.1",
+ "express": "^4.17.3",
+ "find-cache-dir": "^3.0.0",
+ "fs-extra": "^11.1.0",
+ "process": "^0.11.10",
+ "util": "^0.12.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/builder-vite": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.20.tgz",
+ "integrity": "sha512-q3vf8heE7EaVYTWlm768ewaJ9lh6v/KfoPPeHxXxzSstg4ByP9kg4E1mrfAo/l6broE9E9zo3/Q4gsM/G/rw8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/channels": "7.6.20",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/core-common": "7.6.20",
+ "@storybook/csf-plugin": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/preview": "7.6.20",
+ "@storybook/preview-api": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/find-cache-dir": "^3.2.1",
+ "browser-assert": "^1.2.1",
+ "es-module-lexer": "^0.9.3",
+ "express": "^4.17.3",
+ "find-cache-dir": "^3.0.0",
+ "fs-extra": "^11.1.0",
+ "magic-string": "^0.30.0",
+ "rollup": "^2.25.0 || ^3.3.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "@preact/preset-vite": "*",
+ "typescript": ">= 4.3.x",
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0",
+ "vite-plugin-glimmerx": "*"
+ },
+ "peerDependenciesMeta": {
+ "@preact/preset-vite": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vite-plugin-glimmerx": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/channels": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz",
+ "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/core-events": "7.6.20",
+ "@storybook/global": "^5.0.0",
+ "qs": "^6.10.0",
+ "telejson": "^7.2.0",
+ "tiny-invariant": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/cli": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.20.tgz",
+ "integrity": "sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.2",
+ "@babel/preset-env": "^7.23.2",
+ "@babel/types": "^7.23.0",
+ "@ndelangen/get-tarball": "^3.0.7",
+ "@storybook/codemod": "7.6.20",
+ "@storybook/core-common": "7.6.20",
+ "@storybook/core-events": "7.6.20",
+ "@storybook/core-server": "7.6.20",
+ "@storybook/csf-tools": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/telemetry": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/semver": "^7.3.4",
+ "@yarnpkg/fslib": "2.10.3",
+ "@yarnpkg/libzip": "2.3.0",
+ "chalk": "^4.1.0",
+ "commander": "^6.2.1",
+ "cross-spawn": "^7.0.3",
+ "detect-indent": "^6.1.0",
+ "envinfo": "^7.7.3",
+ "execa": "^5.0.0",
+ "express": "^4.17.3",
+ "find-up": "^5.0.0",
+ "fs-extra": "^11.1.0",
+ "get-npm-tarball-url": "^2.0.3",
+ "get-port": "^5.1.1",
+ "giget": "^1.0.0",
+ "globby": "^11.0.2",
+ "jscodeshift": "^0.15.1",
+ "leven": "^3.1.0",
+ "ora": "^5.4.1",
+ "prettier": "^2.8.0",
+ "prompts": "^2.4.0",
+ "puppeteer-core": "^2.1.1",
+ "read-pkg-up": "^7.0.1",
+ "semver": "^7.3.7",
+ "strip-json-comments": "^3.0.1",
+ "tempy": "^1.0.1",
+ "ts-dedent": "^2.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "bin": {
+ "getstorybook": "bin/index.js",
+ "sb": "bin/index.js"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@storybook/client-logger": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz",
+ "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/codemod": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.20.tgz",
+ "integrity": "sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.2",
+ "@babel/preset-env": "^7.23.2",
+ "@babel/types": "^7.23.0",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/csf-tools": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/cross-spawn": "^6.0.2",
+ "cross-spawn": "^7.0.3",
+ "globby": "^11.0.2",
+ "jscodeshift": "^0.15.1",
+ "lodash": "^4.17.21",
+ "prettier": "^2.8.0",
+ "recast": "^0.23.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/components": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.20.tgz",
+ "integrity": "sha512-0d8u4m558R+W5V+rseF/+e9JnMciADLXTpsILrG+TBhwECk0MctIWW18bkqkujdCm8kDZr5U2iM/5kS1Noy7Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-select": "^1.2.2",
+ "@radix-ui/react-toolbar": "^1.0.4",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/global": "^5.0.0",
+ "@storybook/theming": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "memoizerific": "^1.11.3",
+ "use-resize-observer": "^9.1.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/core": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.7.tgz",
+ "integrity": "sha512-7Z8Z0A+1YnhrrSXoKKwFFI4gnsLbWzr8fnDCU6+6HlDukFYh8GHRcZ9zKfqmy6U3hw2h8H5DrHsxWfyaYUUOoA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@storybook/csf": "^0.1.11",
+ "better-opn": "^3.0.2",
+ "browser-assert": "^1.2.1",
+ "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0",
+ "esbuild-register": "^3.5.0",
+ "jsdoc-type-pratt-parser": "^4.0.0",
+ "process": "^0.11.10",
+ "recast": "^0.23.5",
+ "semver": "^7.6.2",
+ "util": "^0.12.5",
+ "ws": "^8.2.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/core-client": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.20.tgz",
+ "integrity": "sha512-upQuQQinLmlOPKcT8yqXNtwIucZ4E4qegYZXH5HXRWoLAL6GQtW7sUVSIuFogdki8OXRncr/dz8OA+5yQyYS4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/preview-api": "7.6.20"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/core-common": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz",
+ "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core-events": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/find-cache-dir": "^3.2.1",
+ "@types/node": "^18.0.0",
+ "@types/node-fetch": "^2.6.4",
+ "@types/pretty-hrtime": "^1.0.0",
+ "chalk": "^4.1.0",
+ "esbuild": "^0.18.0",
+ "esbuild-register": "^3.5.0",
+ "file-system-cache": "2.3.0",
+ "find-cache-dir": "^3.0.0",
+ "find-up": "^5.0.0",
+ "fs-extra": "^11.1.0",
+ "glob": "^10.0.0",
+ "handlebars": "^4.7.7",
+ "lazy-universal-dotenv": "^4.0.0",
+ "node-fetch": "^2.0.0",
+ "picomatch": "^2.3.0",
+ "pkg-dir": "^5.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "resolve-from": "^5.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/core-common/node_modules/@types/node": {
+ "version": "18.19.68",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz",
+ "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@storybook/core-common/node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/core-events": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz",
+ "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/core-server": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.20.tgz",
+ "integrity": "sha512-qC5BdbqqwMLTdCwMKZ1Hbc3+3AaxHYWLiJaXL9e8s8nJw89xV8c8l30QpbJOGvcDmsgY6UTtXYaJ96OsTr7MrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@aw-web-design/x-default-browser": "1.4.126",
+ "@discoveryjs/json-ext": "^0.5.3",
+ "@storybook/builder-manager": "7.6.20",
+ "@storybook/channels": "7.6.20",
+ "@storybook/core-common": "7.6.20",
+ "@storybook/core-events": "7.6.20",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/csf-tools": "7.6.20",
+ "@storybook/docs-mdx": "^0.1.0",
+ "@storybook/global": "^5.0.0",
+ "@storybook/manager": "7.6.20",
+ "@storybook/node-logger": "7.6.20",
+ "@storybook/preview-api": "7.6.20",
+ "@storybook/telemetry": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/detect-port": "^1.3.0",
+ "@types/node": "^18.0.0",
+ "@types/pretty-hrtime": "^1.0.0",
+ "@types/semver": "^7.3.4",
+ "better-opn": "^3.0.2",
+ "chalk": "^4.1.0",
+ "cli-table3": "^0.6.1",
+ "compression": "^1.7.4",
+ "detect-port": "^1.3.0",
+ "express": "^4.17.3",
+ "fs-extra": "^11.1.0",
+ "globby": "^11.0.2",
+ "lodash": "^4.17.21",
+ "open": "^8.4.0",
+ "pretty-hrtime": "^1.0.3",
+ "prompts": "^2.4.0",
+ "read-pkg-up": "^7.0.1",
+ "semver": "^7.3.7",
+ "telejson": "^7.2.0",
+ "tiny-invariant": "^1.3.1",
+ "ts-dedent": "^2.0.0",
+ "util": "^0.12.4",
+ "util-deprecate": "^1.0.2",
+ "watchpack": "^2.2.0",
+ "ws": "^8.2.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/core-server/node_modules/@types/node": {
+ "version": "18.19.68",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz",
+ "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@storybook/core-server/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@storybook/core-server/node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/core/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@storybook/csf": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz",
+ "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^2.19.0"
+ }
+ },
+ "node_modules/@storybook/csf-plugin": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.20.tgz",
+ "integrity": "sha512-dzBzq0dN+8WLDp6NxYS4G7BCe8+vDeDRBRjHmM0xb0uJ6xgQViL8SDplYVSGnk3bXE/1WmtvyRzQyTffBnaj9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/csf-tools": "7.6.20",
+ "unplugin": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/csf-tools": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.20.tgz",
+ "integrity": "sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/generator": "^7.23.0",
+ "@babel/parser": "^7.23.0",
+ "@babel/traverse": "^7.23.2",
+ "@babel/types": "^7.23.0",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/types": "7.6.20",
+ "fs-extra": "^11.1.0",
+ "recast": "^0.23.1",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/docs-mdx": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz",
+ "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/docs-tools": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.20.tgz",
+ "integrity": "sha512-Bw2CcCKQ5xGLQgtexQsI1EGT6y5epoFzOINi0FSTGJ9Wm738nRp5LH3dLk1GZLlywIXcYwOEThb2pM+pZeRQxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core-common": "7.6.20",
+ "@storybook/preview-api": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/doctrine": "^0.0.3",
+ "assert": "^2.1.0",
+ "doctrine": "^3.0.0",
+ "lodash": "^4.17.21"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/global": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
+ "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/icons": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.3.0.tgz",
+ "integrity": "sha512-Nz/UzeYQdUZUhacrPyfkiiysSjydyjgg/p0P9HxB4p/WaJUUjMAcaoaLgy3EXx61zZJ3iD36WPuDkZs5QYrA0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+ }
+ },
+ "node_modules/@storybook/manager": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.20.tgz",
+ "integrity": "sha512-0Cf6WN0t7yEG2DR29tN5j+i7H/TH5EfPppg9h9/KiQSoFHk+6KLoy2p5do94acFU+Ro4+zzxvdCGbcYGKuArpg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/manager-api": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.20.tgz",
+ "integrity": "sha512-gOB3m8hO3gBs9cBoN57T7jU0wNKDh+hi06gLcyd2awARQlAlywnLnr3s1WH5knih6Aq+OpvGBRVKkGLOkaouCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/channels": "7.6.20",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/core-events": "7.6.20",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/global": "^5.0.0",
+ "@storybook/router": "7.6.20",
+ "@storybook/theming": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "dequal": "^2.0.2",
+ "lodash": "^4.17.21",
+ "memoizerific": "^1.11.3",
+ "store2": "^2.14.2",
+ "telejson": "^7.2.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/mdx2-csf": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz",
+ "integrity": "sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/node-logger": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz",
+ "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/postinstall": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.20.tgz",
+ "integrity": "sha512-AN4WPeNma2xC2/K/wP3I/GMbBUyeSGD3+86ZFFJFO1QmE/Zea6E+1aVlTd1iKHQUcNkZ9bZTrqkhPGVYx10pIw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/preview": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.20.tgz",
+ "integrity": "sha512-cxYlZ5uKbCYMHoFpgleZqqGWEnqHrk5m5fT8bYSsDsdQ+X5wPcwI/V+v8dxYAdQcMphZVIlTjo6Dno9WG8qmVA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/preview-api": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz",
+ "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/channels": "7.6.20",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/core-events": "7.6.20",
+ "@storybook/csf": "^0.1.2",
+ "@storybook/global": "^5.0.0",
+ "@storybook/types": "7.6.20",
+ "@types/qs": "^6.9.5",
+ "dequal": "^2.0.2",
+ "lodash": "^4.17.21",
+ "memoizerific": "^1.11.3",
+ "qs": "^6.10.0",
+ "synchronous-promise": "^2.0.15",
+ "ts-dedent": "^2.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/react": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.20.tgz",
+ "integrity": "sha512-i5tKNgUbTNwlqBWGwPveDhh9ktlS0wGtd97A1ZgKZc3vckLizunlAFc7PRC1O/CMq5PTyxbuUb4RvRD2jWKwDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/core-client": "7.6.20",
+ "@storybook/docs-tools": "7.6.20",
+ "@storybook/global": "^5.0.0",
+ "@storybook/preview-api": "7.6.20",
+ "@storybook/react-dom-shim": "7.6.20",
+ "@storybook/types": "7.6.20",
+ "@types/escodegen": "^0.0.6",
+ "@types/estree": "^0.0.51",
+ "@types/node": "^18.0.0",
+ "acorn": "^7.4.1",
+ "acorn-jsx": "^5.3.1",
+ "acorn-walk": "^7.2.0",
+ "escodegen": "^2.1.0",
+ "html-tags": "^3.1.0",
+ "lodash": "^4.17.21",
+ "prop-types": "^15.7.2",
+ "react-element-to-jsx-string": "^15.0.0",
+ "ts-dedent": "^2.0.0",
+ "type-fest": "~2.19",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/react-dom-shim": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.20.tgz",
+ "integrity": "sha512-SRvPDr9VWcS24ByQOVmbfZ655y5LvjXRlsF1I6Pr9YZybLfYbu3L5IicfEHT4A8lMdghzgbPFVQaJez46DTrkg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/react-vite": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-7.6.20.tgz",
+ "integrity": "sha512-uKuBFyGPZxpfR8vpDU/2OE9v7iTaxwL7ldd7k1swYd1rTSAPacTnEHSMl1R5AjUhkdI7gRmGN9q7qiVfK2XJCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0",
+ "@rollup/pluginutils": "^5.0.2",
+ "@storybook/builder-vite": "7.6.20",
+ "@storybook/react": "7.6.20",
+ "@vitejs/plugin-react": "^3.0.1",
+ "magic-string": "^0.30.0",
+ "react-docgen": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/@storybook/react-vite/node_modules/@vitejs/plugin-react": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz",
+ "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.20.12",
+ "@babel/plugin-transform-react-jsx-self": "^7.18.6",
+ "@babel/plugin-transform-react-jsx-source": "^7.19.6",
+ "magic-string": "^0.27.0",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.1.0-beta.0"
+ }
+ },
+ "node_modules/@storybook/react-vite/node_modules/@vitejs/plugin-react/node_modules/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@storybook/react/node_modules/@types/node": {
+ "version": "18.19.68",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz",
+ "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@storybook/react/node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/router": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.20.tgz",
+ "integrity": "sha512-mCzsWe6GrH47Xb1++foL98Zdek7uM5GhaSlrI7blWVohGa0qIUYbfJngqR4ZsrXmJeeEvqowobh+jlxg3IJh+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/client-logger": "7.6.20",
+ "memoizerific": "^1.11.3",
+ "qs": "^6.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/telemetry": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.20.tgz",
+ "integrity": "sha512-dmAOCWmOscYN6aMbhCMmszQjoycg7tUPRVy2kTaWg6qX10wtMrvEtBV29W4eMvqdsoRj5kcvoNbzRdYcWBUOHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/core-common": "7.6.20",
+ "@storybook/csf-tools": "7.6.20",
+ "chalk": "^4.1.0",
+ "detect-package-manager": "^2.0.1",
+ "fetch-retry": "^5.0.2",
+ "fs-extra": "^11.1.0",
+ "read-pkg-up": "^7.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/test-runner": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@storybook/test-runner/-/test-runner-0.16.0.tgz",
+ "integrity": "sha512-LDmNbKFoEDW/VS9o6KR8e1r5MnbCc5ZojUfi5yqLdq80gFD7BvilgKgV0lUh/xWHryzoy+Ids5LYgrPJZmU2dQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.22.5",
+ "@babel/generator": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5",
+ "@jest/types": "^29.6.3",
+ "@storybook/core-common": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0",
+ "@storybook/csf": "^0.1.1",
+ "@storybook/csf-tools": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0",
+ "@storybook/preview-api": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0",
+ "@swc/core": "^1.3.18",
+ "@swc/jest": "^0.2.23",
+ "can-bind-to-host": "^1.1.1",
+ "commander": "^9.0.0",
+ "expect-playwright": "^0.8.0",
+ "glob": "^10.2.2",
+ "jest": "^29.6.4",
+ "jest-circus": "^29.6.4",
+ "jest-environment-node": "^29.6.4",
+ "jest-junit": "^16.0.0",
+ "jest-playwright-preset": "^4.0.0",
+ "jest-runner": "^29.6.4",
+ "jest-serializer-html": "^7.1.0",
+ "jest-watch-typeahead": "^2.0.0",
+ "node-fetch": "^2",
+ "playwright": "^1.14.0",
+ "read-pkg-up": "^7.0.1",
+ "tempy": "^1.0.1",
+ "ts-dedent": "^2.0.0"
+ },
+ "bin": {
+ "test-storybook": "dist/test-storybook.js"
+ },
+ "engines": {
+ "node": "^16.10.0 || ^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/@storybook/testing-library": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.2.2.tgz",
+ "integrity": "sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==",
+ "deprecated": "In Storybook 8, this package functionality has been integrated to a new package called @storybook/test, which uses Vitest APIs for an improved experience. When upgrading to Storybook 8 with 'npx storybook@latest upgrade', you will get prompted and will get an automigration for the new package. Please migrate when you can.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@testing-library/dom": "^9.0.0",
+ "@testing-library/user-event": "^14.4.0",
+ "ts-dedent": "^2.2.0"
+ }
+ },
+ "node_modules/@storybook/theming": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.20.tgz",
+ "integrity": "sha512-iT1pXHkSkd35JsCte6Qbanmprx5flkqtSHC6Gi6Umqoxlg9IjiLPmpHbaIXzoC06DSW93hPj5Zbi1lPlTvRC7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
+ "@storybook/client-logger": "7.6.20",
+ "@storybook/global": "^5.0.0",
+ "memoizerific": "^1.11.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@storybook/types": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz",
+ "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/channels": "7.6.20",
+ "@types/babel__core": "^7.0.0",
+ "@types/express": "^4.7.0",
+ "file-system-cache": "2.3.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.1.tgz",
+ "integrity": "sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.17"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.10.1",
+ "@swc/core-darwin-x64": "1.10.1",
+ "@swc/core-linux-arm-gnueabihf": "1.10.1",
+ "@swc/core-linux-arm64-gnu": "1.10.1",
+ "@swc/core-linux-arm64-musl": "1.10.1",
+ "@swc/core-linux-x64-gnu": "1.10.1",
+ "@swc/core-linux-x64-musl": "1.10.1",
+ "@swc/core-win32-arm64-msvc": "1.10.1",
+ "@swc/core-win32-ia32-msvc": "1.10.1",
+ "@swc/core-win32-x64-msvc": "1.10.1"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "*"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz",
+ "integrity": "sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz",
+ "integrity": "sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz",
+ "integrity": "sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz",
+ "integrity": "sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz",
+ "integrity": "sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz",
+ "integrity": "sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz",
+ "integrity": "sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz",
+ "integrity": "sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz",
+ "integrity": "sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz",
+ "integrity": "sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@swc/jest": {
+ "version": "0.2.37",
+ "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.37.tgz",
+ "integrity": "sha512-CR2BHhmXKGxTiFr21DYPRHQunLkX3mNIFGFkxBGji6r9uyIR5zftTOVYj1e0sFNMV2H7mf/+vpaglqaryBtqfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/create-cache-key-function": "^29.7.0",
+ "@swc/counter": "^0.1.3",
+ "jsonc-parser": "^3.2.0"
+ },
+ "engines": {
+ "npm": ">= 7.0.0"
+ },
+ "peerDependencies": {
+ "@swc/core": "*"
+ }
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz",
+ "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "9.3.4",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
+ "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.1.3",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@testing-library/user-event": {
+ "version": "14.5.2",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz",
+ "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cross-spawn": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz",
+ "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/detect-port": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz",
+ "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/ejs": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz",
+ "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/emscripten": {
+ "version": "1.39.13",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz",
+ "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/escodegen": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz",
+ "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.51",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/find-cache-dir": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz",
+ "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.15",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
+ "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mime-types": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz",
+ "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.10.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
+ "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz",
+ "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.17",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz",
+ "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
+ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.5",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz",
+ "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz",
+ "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/uuid": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/wait-on": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.4.tgz",
+ "integrity": "sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.2.tgz",
+ "integrity": "sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.18.2",
+ "@typescript-eslint/type-utils": "8.18.2",
+ "@typescript-eslint/utils": "8.18.2",
+ "@typescript-eslint/visitor-keys": "8.18.2",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.2.tgz",
+ "integrity": "sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.18.2",
+ "@typescript-eslint/types": "8.18.2",
+ "@typescript-eslint/typescript-estree": "8.18.2",
+ "@typescript-eslint/visitor-keys": "8.18.2",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.2.tgz",
+ "integrity": "sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.18.2",
+ "@typescript-eslint/visitor-keys": "8.18.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.2.tgz",
+ "integrity": "sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.18.2",
+ "@typescript-eslint/utils": "8.18.2",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.2.tgz",
+ "integrity": "sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.2.tgz",
+ "integrity": "sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.18.2",
+ "@typescript-eslint/visitor-keys": "8.18.2",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.2.tgz",
+ "integrity": "sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.18.2",
+ "@typescript-eslint/types": "8.18.2",
+ "@typescript-eslint/typescript-estree": "8.18.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.2.tgz",
+ "integrity": "sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.18.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz",
+ "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@swc/core": "^1.7.26"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5 || ^6"
+ }
+ },
+ "node_modules/@yarnpkg/esbuild-plugin-pnp": {
+ "version": "3.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz",
+ "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.10.0"
+ }
+ },
+ "node_modules/@yarnpkg/fslib": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz",
+ "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@yarnpkg/libzip": "^2.3.0",
+ "tslib": "^1.13.0"
+ },
+ "engines": {
+ "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0"
+ }
+ },
+ "node_modules/@yarnpkg/fslib/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@yarnpkg/libzip": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz",
+ "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@types/emscripten": "^1.39.6",
+ "tslib": "^1.13.0"
+ },
+ "engines": {
+ "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0"
+ }
+ },
+ "node_modules/@yarnpkg/libzip/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
+ "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/app-root-dir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz",
+ "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+ "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/assert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
+ "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-nan": "^1.3.2",
+ "object-is": "^1.1.5",
+ "object.assign": "^4.1.4",
+ "util": "^0.12.5"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
+ "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/babel-core": {
+ "version": "7.0.0-bridge.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
+ "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+ "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+ "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+ "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base-x": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz",
+ "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/better-opn": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
+ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "open": "^8.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "dev": true,
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
+ "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "big-integer": "^1.6.44"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-assert": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
+ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==",
+ "dev": true
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+ "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pako": "~0.2.0"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
+ "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/caching-transform/node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/can-bind-to-host": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/can-bind-to-host/-/can-bind-to-host-1.1.2.tgz",
+ "integrity": "sha512-CqsgmaqiyFRNtP17Ihqa/uHbZxRirntNVNl/kJz31DLKuNRfzvzionkLoUSkElQ6Cz+cpXKA3mhHq4tjbieujA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "can-bind-to-host": "dist/bin/can-bind-to-host.js"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001690",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
+ "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chromatic": {
+ "version": "11.20.2",
+ "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.20.2.tgz",
+ "integrity": "sha512-c+M3HVl5Y60c7ipGTZTyeWzWubRW70YsJ7PPDpO1D735ib8+Lu3yGF90j61pvgkXGngpkTPHZyBw83lcu2JMxA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "chroma": "dist/bin.js",
+ "chromatic": "dist/bin.js",
+ "chromatic-cli": "dist/bin.js"
+ },
+ "peerDependencies": {
+ "@chromatic-com/cypress": "^0.*.* || ^1.0.0",
+ "@chromatic-com/playwright": "^0.*.* || ^1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@chromatic-com/cypress": {
+ "optional": true
+ },
+ "@chromatic-com/playwright": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "consola": "^3.2.3"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-table3/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cli-table3/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-table3/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-deep/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
+ "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/compression/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-stream/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/concat-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/consola": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.3.1.tgz",
+ "integrity": "sha512-GyKnPG3/I+a4RtJxgHquJXWr70g9I3c4NT3dvqh0LPHQP2nZFQBOBszb7a5u/pGzqr40AKplQA6UxM1BSynSXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.39.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
+ "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cwd": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
+ "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-pkg": "^0.1.2",
+ "fs-exists-sync": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "license": "MIT"
+ },
+ "node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+ "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.5",
+ "es-get-iterator": "^1.1.3",
+ "get-intrinsic": "^1.2.2",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.2",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
+ "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bplist-parser": "^0.2.0",
+ "untildify": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defaults/node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/del": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
+ "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "globby": "^11.0.1",
+ "graceful-fs": "^4.2.4",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.2",
+ "p-map": "^4.0.0",
+ "rimraf": "^3.0.2",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/del/node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-package-manager": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz",
+ "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^5.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/detect-port": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
+ "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "4"
+ },
+ "bin": {
+ "detect": "bin/detect-port.js",
+ "detect-port": "bin/detect-port.js"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/diffable-html": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/diffable-html/-/diffable-html-4.1.0.tgz",
+ "integrity": "sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "htmlparser2": "^3.9.2"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
+ "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/duplexify/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/duplexify/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/duplexify/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/duplexify/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.76",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz",
+ "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/envinfo": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz",
+ "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "node_modules/esbuild-plugin-alias": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz",
+ "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esbuild-register": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+ "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.12 <1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.17.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz",
+ "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.19.0",
+ "@eslint/core": "^0.9.0",
+ "@eslint/eslintrc": "^3.2.0",
+ "@eslint/js": "9.17.0",
+ "@eslint/plugin-kit": "^0.2.3",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.1",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.2.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz",
+ "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.16.tgz",
+ "integrity": "sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-plugin-storybook": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.11.1.tgz",
+ "integrity": "sha512-yGKpAYkBm/Q2hZg476vRUAvd9lAccjjSvzU5nYy3BSQbKTPy7uopx7JEpwk2vSuw4weTMZzWF64z9/gp/K5RCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/csf": "^0.1.11",
+ "@typescript-eslint/utils": "^8.8.1",
+ "ts-dedent": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "eslint": ">=6"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
+ "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "os-homedir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/expect-playwright": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz",
+ "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/express/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/extract-zip": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
+ "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "concat-stream": "^1.6.2",
+ "debug": "^2.6.9",
+ "mkdirp": "^0.5.4",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ }
+ },
+ "node_modules/extract-zip/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/extract-zip/node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/extract-zip/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fetch-retry": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz",
+ "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/file-system-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz",
+ "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fs-extra": "11.1.1",
+ "ramda": "0.29.0"
+ }
+ },
+ "node_modules/file-system-cache/node_modules/fs-extra": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
+ "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-file-up": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
+ "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fs-exists-sync": "^0.1.0",
+ "resolve-dir": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-pkg": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
+ "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-file-up": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-process": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
+ "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "commander": "^5.1.0",
+ "debug": "^4.1.1"
+ },
+ "bin": {
+ "find-process": "bin/find-process.js"
+ }
+ },
+ "node_modules/find-process/node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/flow-parser": {
+ "version": "0.257.1",
+ "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.257.1.tgz",
+ "integrity": "sha512-7+KYDpAXyBPD/wODhbPYO6IGUx+WwtJcLLG/r3DvbNyxaDyuYaTBKbSqeCldWQzuFcj+MsOVx2bpkEwVPB9JRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
+ "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "dunder-proto": "^1.0.0",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-npm-tarball-url": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz",
+ "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.17"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
+ "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/giget": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz",
+ "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.3",
+ "nypm": "^0.3.8",
+ "ohash": "^1.1.3",
+ "pathe": "^1.1.2",
+ "tar": "^6.2.0"
+ },
+ "bin": {
+ "giget": "dist/cli.mjs"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz",
+ "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^0.1.4",
+ "is-windows": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "homedir-polyfill": "^1.0.0",
+ "ini": "^1.3.4",
+ "is-windows": "^0.2.0",
+ "which": "^1.2.12"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.14.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz",
+ "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/gunzip-maybe": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz",
+ "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserify-zlib": "^0.1.4",
+ "is-deflate": "^1.0.0",
+ "is-gzip": "^1.0.0",
+ "peek-stream": "^1.1.0",
+ "pumpify": "^1.3.3",
+ "through2": "^2.0.3"
+ },
+ "bin": {
+ "gunzip-maybe": "bin.js"
+ }
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasha/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
+ "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "5",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-local/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-local/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-local/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-local/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-local/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/intl-messageformat": {
+ "version": "10.7.10",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz",
+ "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.1",
+ "@formatjs/fast-memoize": "2.2.5",
+ "@formatjs/icu-messageformat-parser": "2.9.7",
+ "tslib": "2"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-absolute-url": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
+ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
+ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-deflate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz",
+ "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-gzip": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz",
+ "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-circus/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-config/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-config/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-each/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-junit": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz",
+ "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/tabs": "^3.7.0",
- "@react-types/shared": "^3.26.0",
- "@react-types/tabs": "^3.3.11",
- "@swc/helpers": "^0.5.0"
+ "mkdirp": "^1.0.4",
+ "strip-ansi": "^6.0.1",
+ "uuid": "^8.3.2",
+ "xml": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/jest-junit/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-junit/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-leak-detector/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@react-aria/tag": {
- "version": "3.4.8",
- "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.4.8.tgz",
- "integrity": "sha512-exWl52bsFtJuzaqMYvSnLteUoPqb3Wf+uICru/yRtREJsWVqjJF38NCVlU73Yqd9qMPTctDrboSZFAWAWKDxoA==",
- "license": "Apache-2.0",
+ "node_modules/jest-message-util/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/gridlist": "^3.10.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/list": "^3.11.1",
- "@react-types/button": "^3.10.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
- "node_modules/@react-aria/textfield": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.15.0.tgz",
- "integrity": "sha512-V5mg7y1OR6WXYHdhhm4FC7QyGc9TideVRDFij1SdOJrIo5IFB7lvwpOS0GmgwkVbtr71PTRMjZnNbrJUFU6VNA==",
- "license": "Apache-2.0",
+ "node_modules/jest-mock/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/form": "^3.0.11",
- "@react-aria/label": "^3.7.13",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/form": "^3.1.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@react-types/textfield": "^3.10.0",
- "@swc/helpers": "^0.5.0"
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-mock/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-playwright-preset": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-4.0.0.tgz",
+ "integrity": "sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect-playwright": "^0.8.0",
+ "jest-process-manager": "^0.4.0",
+ "nyc": "^15.1.0",
+ "playwright-core": ">=1.2.0",
+ "rimraf": "^3.0.2",
+ "uuid": "^8.3.2"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "jest": "^29.3.1",
+ "jest-circus": "^29.3.1",
+ "jest-environment-node": "^29.3.1",
+ "jest-runner": "^29.3.1"
+ }
+ },
+ "node_modules/jest-playwright-preset/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-process-manager": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.4.0.tgz",
+ "integrity": "sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/wait-on": "^5.2.0",
+ "chalk": "^4.1.0",
+ "cwd": "^0.10.0",
+ "exit": "^0.1.2",
+ "find-process": "^1.4.4",
+ "prompts": "^2.4.1",
+ "signal-exit": "^3.0.3",
+ "spawnd": "^5.0.0",
+ "tree-kill": "^1.2.2",
+ "wait-on": "^7.0.0"
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-serializer-html": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/jest-serializer-html/-/jest-serializer-html-7.1.0.tgz",
+ "integrity": "sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "diffable-html": "^4.1.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-aria/toggle": {
- "version": "3.10.10",
- "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.10.tgz",
- "integrity": "sha512-QwMT/vTNrbrILxWVHfd9zVQ3mV2NdBwyRu+DphVQiFAXcmc808LEaIX2n0lI6FCsUDC9ZejCyvzd91/YemdZ1Q==",
- "license": "Apache-2.0",
+ "node_modules/jest-validate/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/toggle": "^3.8.0",
- "@react-types/checkbox": "^3.9.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@react-aria/toolbar": {
- "version": "3.0.0-beta.11",
- "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.11.tgz",
- "integrity": "sha512-LM3jTRFNDgoEpoL568WaiuqiVM7eynSQLJis1hV0vlVnhTd7M7kzt7zoOjzxVb5Uapz02uCp1Fsm4wQMz09qwQ==",
- "license": "Apache-2.0",
+ "node_modules/jest-validate/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-watch-typeahead": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.2.tgz",
+ "integrity": "sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "ansi-escapes": "^6.0.0",
+ "chalk": "^5.2.0",
+ "jest-regex-util": "^29.0.0",
+ "jest-watcher": "^29.0.0",
+ "slash": "^5.0.0",
+ "string-length": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "jest": "^27.0.0 || ^28.0.0 || ^29.0.0"
}
},
- "node_modules/@react-aria/tooltip": {
- "version": "3.7.10",
- "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.10.tgz",
- "integrity": "sha512-Udi3XOnrF/SYIz72jw9bgB74MG/yCOzF5pozHj2FH2HiJlchYv/b6rHByV/77IZemdlkmL/uugrv/7raPLSlnw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/focus": "^3.19.0",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/tooltip": "^3.5.0",
- "@react-types/shared": "^3.26.0",
- "@react-types/tooltip": "^3.4.13",
- "@swc/helpers": "^0.5.0"
+ "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+ "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-aria/tree": {
- "version": "3.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.0-beta.2.tgz",
- "integrity": "sha512-lH3hVl2VgG3YLN+ee1zQzm+2F+BGLd/HBhfMYPuI3IjHvDb+m+jCJXHdBOGrfG2Qydk2LYheqX8QXCluulu0qQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/gridlist": "^3.10.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/tree": "^3.8.6",
- "@react-types/button": "^3.10.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "node_modules/jest-watch-typeahead/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/@react-aria/utils": {
- "version": "3.26.0",
- "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.26.0.tgz",
- "integrity": "sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-aria/ssr": "^3.9.7",
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0",
- "clsx": "^2.0.0"
+ "node_modules/jest-watch-typeahead/node_modules/char-regex": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz",
+ "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-aria/virtualizer": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-4.1.0.tgz",
- "integrity": "sha512-ziSq3Y7iuaAMJWGZU1RRs/TykuPapQfx8dyH2eyKPLgEjBUoXRGWE7n6jklBwal14b0lPK0wkCzRoQbkUvX3cg==",
- "license": "Apache-2.0",
+ "node_modules/jest-watch-typeahead/node_modules/string-length": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
+ "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-stately/virtualizer": "^4.2.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-aria/visually-hidden": {
- "version": "3.8.18",
- "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.18.tgz",
- "integrity": "sha512-l/0igp+uub/salP35SsNWq5mGmg3G5F5QMS1gDZ8p28n7CgjvzyiGhJbbca7Oxvaw1HRFzVl9ev+89I7moNnFQ==",
- "license": "Apache-2.0",
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@react-stately/calendar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.6.0.tgz",
- "integrity": "sha512-GqUtOtGnwWjtNrJud8nY/ywI4VBP5byToNVRTnxbMl+gYO1Qe/uc5NG7zjwMxhb2kqSBHZFdkF0DXVqG2Ul+BA==",
- "license": "Apache-2.0",
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/date": "^3.6.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/calendar": "^3.5.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@react-stately/checkbox": {
- "version": "3.6.10",
- "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.10.tgz",
- "integrity": "sha512-LHm7i4YI8A/RdgWAuADrnSAYIaYYpQeZqsp1a03Og0pJHAlZL0ymN3y2IFwbZueY0rnfM+yF+kWNXjJqbKrFEQ==",
- "license": "Apache-2.0",
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/form": "^3.1.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/checkbox": "^3.9.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "has-flag": "^4.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/@react-stately/collections": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.12.0.tgz",
- "integrity": "sha512-MfR9hwCxe5oXv4qrLUnjidwM50U35EFmInUeFf8i9mskYwWlRYS0O1/9PZ0oF1M0cKambaRHKEy98jczgb9ycA==",
- "license": "Apache-2.0",
+ "node_modules/joi": {
+ "version": "17.13.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@hapi/hoek": "^9.3.0",
+ "@hapi/topo": "^5.1.0",
+ "@sideway/address": "^4.1.5",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
}
},
- "node_modules/@react-stately/color": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.8.1.tgz",
- "integrity": "sha512-7eN7K+KJRu+rxK351eGrzoq2cG+yipr90i5b1cUu4lioYmcH4WdsfjmM5Ku6gypbafH+kTDfflvO6hiY1NZH+A==",
- "license": "Apache-2.0",
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/number": "^3.6.0",
- "@internationalized/string": "^3.2.5",
- "@react-aria/i18n": "^3.12.4",
- "@react-stately/form": "^3.1.0",
- "@react-stately/numberfield": "^3.9.8",
- "@react-stately/slider": "^3.6.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/color": "^3.0.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/@react-stately/combobox": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.10.1.tgz",
- "integrity": "sha512-Rso+H+ZEDGFAhpKWbnRxRR/r7YNmYVtt+Rn0eNDNIUp3bYaxIBCdCySyAtALs4I8RZXZQ9zoUznP7YeVwG3cLg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/form": "^3.1.0",
- "@react-stately/list": "^3.11.1",
- "@react-stately/overlays": "^3.6.12",
- "@react-stately/select": "^3.6.9",
- "@react-stately/utils": "^3.10.5",
- "@react-types/combobox": "^3.13.1",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "node_modules/jscodeshift": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz",
+ "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.0",
+ "@babel/parser": "^7.23.0",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.0",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
+ "@babel/plugin-transform-optional-chaining": "^7.23.0",
+ "@babel/plugin-transform-private-methods": "^7.22.5",
+ "@babel/preset-flow": "^7.22.15",
+ "@babel/preset-typescript": "^7.23.0",
+ "@babel/register": "^7.22.15",
+ "babel-core": "^7.0.0-bridge.0",
+ "chalk": "^4.1.2",
+ "flow-parser": "0.*",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.4",
+ "neo-async": "^2.5.0",
+ "node-dir": "^0.1.17",
+ "recast": "^0.23.3",
+ "temp": "^0.8.4",
+ "write-file-atomic": "^2.3.0"
+ },
+ "bin": {
+ "jscodeshift": "bin/jscodeshift.js"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@babel/preset-env": "^7.1.6"
+ },
+ "peerDependenciesMeta": {
+ "@babel/preset-env": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jscodeshift/node_modules/write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
+ "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "node_modules/@react-stately/data": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.12.0.tgz",
- "integrity": "sha512-6PiW2oA56lcH1CVjDcajutzsv91w/PER8K61/OGxtNFFUWaIZH80RWmK4kjU/Lf0vygzXCxout3kEb388lUk0w==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-stately/datepicker": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.11.0.tgz",
- "integrity": "sha512-d9MJF34A0VrhL5y5S8mAISA8uwfNCQKmR2k4KoQJm3De1J8SQeNzSjLviAwh1faDow6FXGlA6tVbTrHyDcBgBg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@internationalized/date": "^3.6.0",
- "@internationalized/string": "^3.2.5",
- "@react-stately/form": "^3.1.0",
- "@react-stately/overlays": "^3.6.12",
- "@react-stately/utils": "^3.10.5",
- "@react-types/datepicker": "^3.9.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-stately/disclosure": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@react-stately/disclosure/-/disclosure-3.0.0.tgz",
- "integrity": "sha512-Z9+fi0/41ZXHjGopORQza7mk4lFEFslKhy65ehEo6O6j2GuIV0659ExIVDsmJoJSFjXCfGh0sX8oTSOlXi9gqg==",
- "license": "Apache-2.0",
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@react-stately/dnd": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.5.0.tgz",
- "integrity": "sha512-ZcWFw1npEDnATiy3TEdzA1skQ3UEIyfbNA6VhPNO8yiSVLxoxBOaEaq8VVS72fRGAtxud6dgOy8BnsP9JwDClQ==",
- "license": "Apache-2.0",
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/selection": "^3.18.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "json-buffer": "3.0.1"
}
},
- "node_modules/@react-stately/flags": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.5.tgz",
- "integrity": "sha512-6wks4csxUwPCp23LgJSnkBRhrWpd9jGd64DjcCTNB2AHIFu7Ab1W59pJpUL6TW7uAxVxdNKjgn6D1hlBy8qWsA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/helpers": "^0.5.0"
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@react-stately/form": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.1.0.tgz",
- "integrity": "sha512-E2wxNQ0QaTyDHD0nJFtTSnEH9A3bpJurwxhS4vgcUmESHgjFEMLlC9irUSZKgvOgb42GAq+fHoWBsgKeTp9Big==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-stately/grid": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.10.0.tgz",
- "integrity": "sha512-ii+DdsOBvCnHMgL0JvUfFwO1kiAPP19Bpdpl6zn/oOltk6F5TmnoyNrzyz+2///1hCiySI3FE1O7ujsAQs7a6Q==",
+ "node_modules/lazy-universal-dotenv": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz",
+ "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/selection": "^3.18.0",
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "app-root-dir": "^1.0.2",
+ "dotenv": "^16.0.0",
+ "dotenv-expand": "^10.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=14.0.0"
}
},
- "node_modules/@react-stately/layout": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-4.1.0.tgz",
- "integrity": "sha512-pSBqn+4EeOaf2QMK+w2SHgsWKYHdgMZWY3qgJijdzWGZ4JpYmHuiD0yOq80qFdUwxcexPW3vFg3hqIQlMpXeCw==",
- "license": "Apache-2.0",
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/table": "^3.13.0",
- "@react-stately/virtualizer": "^4.2.0",
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0",
- "@react-types/table": "^3.10.3",
- "@swc/helpers": "^0.5.0"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/@react-stately/list": {
- "version": "3.11.1",
- "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.11.1.tgz",
- "integrity": "sha512-UCOpIvqBOjwLtk7zVTYWuKU1m1Oe61Q5lNar/GwHaV1nAiSQ8/yYlhr40NkBEs9X3plEfsV28UIpzOrYnu1tPg==",
- "license": "Apache-2.0",
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lmdb": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz",
+ "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/selection": "^3.18.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "msgpackr": "^1.9.5",
+ "node-addon-api": "^6.1.0",
+ "node-gyp-build-optional-packages": "5.1.1",
+ "ordered-binary": "^1.4.1",
+ "weak-lru-cache": "^1.2.2"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "download-lmdb-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@lmdb/lmdb-darwin-arm64": "2.8.5",
+ "@lmdb/lmdb-darwin-x64": "2.8.5",
+ "@lmdb/lmdb-linux-arm": "2.8.5",
+ "@lmdb/lmdb-linux-arm64": "2.8.5",
+ "@lmdb/lmdb-linux-x64": "2.8.5",
+ "@lmdb/lmdb-win32-x64": "2.8.5"
}
},
- "node_modules/@react-stately/menu": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.0.tgz",
- "integrity": "sha512-++sm0fzZeUs9GvtRbj5RwrP+KL9KPANp9f4SvtI3s+MP+Y/X3X7LNNePeeccGeyikB5fzMsuyvd82bRRW9IhDQ==",
- "license": "Apache-2.0",
+ "node_modules/lmdb/node_modules/node-addon-api": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/overlays": "^3.6.12",
- "@react-types/menu": "^3.9.13",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "p-locate": "^5.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-stately/numberfield": {
- "version": "3.9.8",
- "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.8.tgz",
- "integrity": "sha512-J6qGILxDNEtu7yvd3/y+FpbrxEaAeIODwlrFo6z1kvuDlLAm/KszXAc75yoDi0OtakFTCMP6/HR5VnHaQdMJ3w==",
- "license": "Apache-2.0",
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/number": "^3.6.0",
- "@react-stately/form": "^3.1.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/numberfield": "^3.8.7",
- "@swc/helpers": "^0.5.0"
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-stately/overlays": {
- "version": "3.6.12",
- "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.12.tgz",
- "integrity": "sha512-QinvZhwZgj8obUyPIcyURSCjTZlqZYRRCS60TF8jH8ZpT0tEAuDb3wvhhSXuYA3Xo9EHLwvLjEf3tQKKdAQArw==",
- "license": "Apache-2.0",
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
"dependencies": {
- "@react-stately/utils": "^3.10.5",
- "@react-types/overlays": "^3.8.11",
- "@swc/helpers": "^0.5.0"
+ "js-tokens": "^3.0.0 || ^4.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "loose-envify": "cli.js"
}
},
- "node_modules/@react-stately/radio": {
- "version": "3.10.9",
- "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.9.tgz",
- "integrity": "sha512-kUQ7VdqFke8SDRCatw2jW3rgzMWbvw+n2imN2THETynI47NmNLzNP11dlGO2OllRtTrsLhmBNlYHa3W62pFpAw==",
- "license": "Apache-2.0",
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@react-stately/form": "^3.1.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/radio": "^3.8.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "yallist": "^3.0.2"
}
},
- "node_modules/@react-stately/searchfield": {
- "version": "3.5.8",
- "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.8.tgz",
- "integrity": "sha512-jtquvGadx1DmtQqPKaVO6Qg/xpBjNxsOd59ciig9xRxpxV+90i996EX1E2R6R+tGJdSM1pD++7PVOO4yE++HOg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-stately/utils": "^3.10.5",
- "@react-types/searchfield": "^3.5.10",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "lz-string": "bin/bin.js"
}
},
- "node_modules/@react-stately/select": {
- "version": "3.6.9",
- "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.9.tgz",
- "integrity": "sha512-vASUDv7FhEYQURzM+JIwcusPv7/x/l3zHc/oKJPvoCl3aa9pwS8hZwS82SC00o2iFnrDscfDJju4IE/cd4hucg==",
- "license": "Apache-2.0",
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/form": "^3.1.0",
- "@react-stately/list": "^3.11.1",
- "@react-stately/overlays": "^3.6.12",
- "@react-types/select": "^3.9.8",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
- "node_modules/@react-stately/selection": {
- "version": "3.18.0",
- "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.18.0.tgz",
- "integrity": "sha512-6EaNNP3exxBhW2LkcRR4a3pg+3oDguZlBSqIVVR7lyahv/D8xXHRC4dX+m0mgGHJpsgjs7664Xx6c8v193TFxg==",
- "license": "Apache-2.0",
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "semver": "^6.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-stately/slider": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.6.0.tgz",
- "integrity": "sha512-w5vJxVh267pmD1X+Ppd9S3ZzV1hcg0cV8q5P4Egr160b9WMcWlUspZPtsthwUlN7qQe/C8y5IAhtde4s29eNag==",
- "license": "Apache-2.0",
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@react-types/slider": "^3.7.7",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "tmpl": "1.0.5"
}
},
- "node_modules/@react-stately/table": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.13.0.tgz",
- "integrity": "sha512-mRbNYrwQIE7xzVs09Lk3kPteEVFVyOc20vA8ph6EP54PiUf/RllJpxZe/WUYLf4eom9lUkRYej5sffuUBpxjCA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/flags": "^3.0.5",
- "@react-stately/grid": "^3.10.0",
- "@react-stately/selection": "^3.18.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0",
- "@react-types/table": "^3.10.3",
- "@swc/helpers": "^0.5.0"
+ "node_modules/map-or-similar": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
+ "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/markdown-to-jsx": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz",
+ "integrity": "sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "react": ">= 0.14.0"
}
},
- "node_modules/@react-stately/tabs": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.7.0.tgz",
- "integrity": "sha512-ox4hTkfZCoR4Oyr3Op3rBlWNq2Wxie04vhEYpTZQ2hobR3l4fYaOkd7CPClILktJ3TC104j8wcb0knWxIBRx9w==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-stately/list": "^3.11.1",
- "@react-types/shared": "^3.26.0",
- "@react-types/tabs": "^3.3.11",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/@react-stately/toggle": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.8.0.tgz",
- "integrity": "sha512-pyt/k/J8BwE/2g6LL6Z6sMSWRx9HEJB83Sm/MtovXnI66sxJ2EfQ1OaXB7Su5PEL9OMdoQF6Mb+N1RcW3zAoPw==",
- "license": "Apache-2.0",
+ "node_modules/mdast-util-definitions": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+ "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/utils": "^3.10.5",
- "@react-types/checkbox": "^3.9.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "unist-util-visit": "^2.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/@react-stately/tooltip": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.0.tgz",
- "integrity": "sha512-+xzPNztJDd2XJD0X3DgWKlrgOhMqZpSzsIssXeJgO7uCnP8/Z513ESaipJhJCFC8fxj5caO/DK4Uu8hEtlB8cQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-stately/overlays": "^3.6.12",
- "@react-types/tooltip": "^3.4.13",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/@react-stately/tree": {
- "version": "3.8.6",
- "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.6.tgz",
- "integrity": "sha512-lblUaxf1uAuIz5jm6PYtcJ+rXNNVkqyFWTIMx6g6gW/mYvm8GNx1G/0MLZE7E6CuDGaO9dkLSY2bB1uqyKHidA==",
- "license": "Apache-2.0",
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memoizerific": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz",
+ "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-stately/collections": "^3.12.0",
- "@react-stately/selection": "^3.18.0",
- "@react-stately/utils": "^3.10.5",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "map-or-similar": "^1.5.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@react-stately/utils": {
- "version": "3.10.5",
- "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz",
- "integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/helpers": "^0.5.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/@react-stately/virtualizer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-4.2.0.tgz",
- "integrity": "sha512-aTMpa9AQoz/xLqn8AI1BR/caUUY7/OUo9GbuF434w2u5eGCL7+SAn3Fmq7WSCwqYyDsO+jEIERek4JTX7pEW0A==",
- "license": "Apache-2.0",
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-aria/utils": "^3.26.0",
- "@react-types/shared": "^3.26.0",
- "@swc/helpers": "^0.5.0"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8.6"
}
},
- "node_modules/@react-types/breadcrumbs": {
- "version": "3.7.9",
- "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.9.tgz",
- "integrity": "sha512-eARYJo8J+VfNV8vP4uw3L2Qliba9wLV2bx9YQCYf5Lc/OE5B/y4gaTLz+Y2P3Rtn6gBPLXY447zCs5i7gf+ICg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/link": "^3.5.9",
- "@react-types/shared": "^3.26.0"
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/@react-types/button": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.10.1.tgz",
- "integrity": "sha512-XTtap8o04+4QjPNAshFWOOAusUTxQlBjU2ai0BTVLShQEjHhRVDBIWsI2B2FKJ4KXT6AZ25llaxhNrreWGonmA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/@react-types/calendar": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.5.0.tgz",
- "integrity": "sha512-O3IRE7AGwAWYnvJIJ80cOy7WwoJ0m8GtX/qSmvXQAjC4qx00n+b5aFNBYAQtcyc3RM5QpW6obs9BfwGetFiI8w==",
- "license": "Apache-2.0",
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@internationalized/date": "^3.6.0",
- "@react-types/shared": "^3.26.0"
+ "mime-db": "1.52.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/@react-types/checkbox": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.9.0.tgz",
- "integrity": "sha512-9hbHx0Oo2Hp5a8nV8Q75LQR0DHtvOIJbFaeqESSopqmV9EZoYjtY/h0NS7cZetgahQgnqYWQi44XGooMDCsmxA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@react-types/color": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.1.tgz",
- "integrity": "sha512-KemFziO3GbmT3HEKrgOGdqNA6Gsmy9xrwFO3f8qXSG7gVz6M27Ic4R9HVQv4iAjap5uti6W13/pk2bc/jLVcEA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0",
- "@react-types/slider": "^3.7.7"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/@react-types/combobox": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.1.tgz",
- "integrity": "sha512-7xr+HknfhReN4QPqKff5tbKTe2kGZvH+DGzPYskAtb51FAAiZsKo+WvnNAvLwg3kRoC9Rkn4TAiVBp/HgymRDw==",
- "license": "Apache-2.0",
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "brace-expansion": "^1.1.7"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "*"
}
},
- "node_modules/@react-types/datepicker": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.9.0.tgz",
- "integrity": "sha512-dbKL5Qsm2MQwOTtVQdOcKrrphcXAqDD80WLlSQrBLg+waDuuQ7H+TrvOT0thLKloNBlFUGnZZfXGRHINpih/0g==",
- "license": "Apache-2.0",
- "dependencies": {
- "@internationalized/date": "^3.6.0",
- "@react-types/calendar": "^3.5.0",
- "@react-types/overlays": "^3.8.11",
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@react-types/dialog": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.14.tgz",
- "integrity": "sha512-OXWMjrALwrlgw8aHD8SeRm/s3tbAssdaEh2h73KUSeFau3fU3n5mfKv+WnFqsEaOtN261o48l7hTlS6615H9AA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/overlays": "^3.8.11",
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/@react-types/form": {
- "version": "3.7.8",
- "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.8.tgz",
- "integrity": "sha512-0wOS97/X0ijTVuIqik1lHYTZnk13QkvMTKvIEhM7c6YMU3vPiirBwLbT2kJiAdwLiymwcCkrBdDF1NTRG6kPFA==",
- "license": "Apache-2.0",
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@react-types/grid": {
- "version": "3.2.10",
- "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.10.tgz",
- "integrity": "sha512-Z5cG0ITwqjUE4kWyU5/7VqiPl4wqMJ7kG/ZP7poAnLmwRsR8Ai0ceVn+qzp5nTA19cgURi8t3LsXn3Ar1FBoog==",
- "license": "Apache-2.0",
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "yallist": "^4.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@react-types/link": {
- "version": "3.5.9",
- "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.9.tgz",
- "integrity": "sha512-JcKDiDMqrq/5Vpn+BdWQEuXit4KN4HR/EgIi3yKnNbYkLzxBoeQZpQgvTaC7NEQeZnSqkyXQo3/vMUeX/ZNIKw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0"
+ "node_modules/minizlib/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@react-types/listbox": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.5.3.tgz",
- "integrity": "sha512-v1QXd9/XU3CCKr2Vgs7WLcTr6VMBur7CrxHhWZQQFExsf9bgJ/3wbUdjy4aThY/GsYHiaS38EKucCZFr1QAfqA==",
- "license": "Apache-2.0",
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mlly": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz",
+ "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "acorn": "^8.14.0",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.1",
+ "ufo": "^1.5.4"
}
},
- "node_modules/@react-types/menu": {
- "version": "3.9.13",
- "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.13.tgz",
- "integrity": "sha512-7SuX6E2tDsqQ+HQdSvIda1ji/+ujmR86dtS9CUu5yWX91P25ufRjZ72EvLRqClWNQsj1Xl4+2zBDLWlceznAjw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/overlays": "^3.8.11",
- "@react-types/shared": "^3.26.0"
+ "node_modules/mlly/node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/msgpackr": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz",
+ "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "msgpackr-extract": "^3.0.2"
}
},
- "node_modules/@react-types/meter": {
- "version": "3.4.5",
- "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.5.tgz",
- "integrity": "sha512-04w1lEtvP/c3Ep8ND8hhH2rwjz2MtQ8o8SNLhahen3u0rX3jKOgD4BvHujsyvXXTMjj1Djp74sGzNawb4Ppi9w==",
- "license": "Apache-2.0",
+ "node_modules/msgpackr-extract": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz",
+ "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@react-types/progress": "^3.5.8"
+ "node-gyp-build-optional-packages": "5.2.2"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3"
}
},
- "node_modules/@react-types/numberfield": {
- "version": "3.8.7",
- "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.7.tgz",
- "integrity": "sha512-KccMPi39cLoVkB2T0V7HW6nsxQVAwt89WWCltPZJVGzsebv/k0xTQlPVAgrUake4kDLoE687e3Fr/Oe3+1bDhw==",
+ "node_modules/msgpackr-extract/node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "dev": true,
"license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "optional": true,
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@react-types/overlays": {
- "version": "3.8.11",
- "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.11.tgz",
- "integrity": "sha512-aw7T0rwVI3EuyG5AOaEIk8j7dZJQ9m34XAztXJVZ/W2+4pDDkLDbJ/EAPnuo2xGYRGhowuNDn4tDju01eHYi+w==",
- "license": "Apache-2.0",
+ "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
+ "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "detect-libc": "^2.0.1"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
}
},
- "node_modules/@react-types/progress": {
- "version": "3.5.8",
- "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.8.tgz",
- "integrity": "sha512-PR0rN5mWevfblR/zs30NdZr+82Gka/ba7UHmYOW9/lkKlWeD7PHgl1iacpd/3zl/jUF22evAQbBHmk1mS6Mpqw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@react-types/shared": "^3.26.0"
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/@react-types/radio": {
- "version": "3.8.5",
- "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.5.tgz",
- "integrity": "sha512-gSImTPid6rsbJmwCkTliBIU/npYgJHOFaI3PNJo7Y0QTAnFelCtYeFtBiWrFodSArSv7ASqpLLUEj9hZu/rxIg==",
- "license": "Apache-2.0",
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-dir": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
+ "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "minimatch": "^3.0.2"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">= 0.10.5"
}
},
- "node_modules/@react-types/searchfield": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.10.tgz",
- "integrity": "sha512-7wW4pJzbReawoGPu8a4l+CODTCDN088EN/ysUzl622ewim57PjArjix+lpO4+aEtJqS9HKpq8UEbjwo9axpcUA==",
- "license": "Apache-2.0",
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/shared": "^3.26.0",
- "@react-types/textfield": "^3.10.0"
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
}
},
- "node_modules/@react-types/select": {
- "version": "3.9.8",
- "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.8.tgz",
- "integrity": "sha512-RGsYj2oFjXpLnfcvWMBQnkcDuKkwT43xwYWZGI214/gp/B64tJiIUgTM5wFTRAeGDX23EePkhCQF+9ctnqFd6g==",
- "license": "Apache-2.0",
+ "node_modules/node-fetch-native": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
+ "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-gyp-build-optional-packages": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz",
+ "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "detect-libc": "^2.0.1"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
}
},
- "node_modules/@react-types/shared": {
- "version": "3.26.0",
- "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.26.0.tgz",
- "integrity": "sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw==",
+ "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "dev": true,
"license": "Apache-2.0",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@react-types/slider": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.7.tgz",
- "integrity": "sha512-lYTR9zXQV2fSEm/G3gwDENWiki1IXd/oorsgf0zu1DBi2SQDbOsLsGUXiwvD24Xy6OkUuhAqjLPPexezo7+u9g==",
- "license": "Apache-2.0",
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "process-on-spawn": "^1.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@react-types/switch": {
- "version": "3.5.7",
- "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.7.tgz",
- "integrity": "sha512-1IKiq510rPTHumEZuhxuazuXBa2Cuxz6wBIlwf3NCVmgWEvU+uk1ETG0sH2yymjwCqhtJDKXi+qi9HSgPEDwAg==",
- "license": "Apache-2.0",
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
}
},
- "node_modules/@react-types/table": {
- "version": "3.10.3",
- "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.10.3.tgz",
- "integrity": "sha512-Ac+W+m/zgRzlTU8Z2GEg26HkuJFswF9S6w26r+R3MHwr8z2duGPvv37XRtE1yf3dbpRBgHEAO141xqS2TqGwNg==",
- "license": "Apache-2.0",
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0"
+ "path-key": "^3.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@react-types/tabs": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.11.tgz",
- "integrity": "sha512-BjF2TqBhZaIcC4lc82R5pDJd1F7kstj1K0Nokhz99AGYn8C0ITdp6lR+DPVY9JZRxKgP9R2EKfWGI90Lo7NQdA==",
- "license": "Apache-2.0",
+ "node_modules/nullthrows": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
+ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@react-types/shared": "^3.26.0"
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
}
},
- "node_modules/@react-types/textfield": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.10.0.tgz",
- "integrity": "sha512-ShU3d6kLJGQjPXccVFjM3KOXdj3uyhYROqH9YgSIEVxgA9W6LRflvk/IVBamD9pJYTPbwmVzuP0wQkTDupfZ1w==",
- "license": "Apache-2.0",
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@react-types/shared": "^3.26.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
}
},
- "node_modules/@react-types/tooltip": {
- "version": "3.4.13",
- "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.13.tgz",
- "integrity": "sha512-KPekFC17RTT8kZlk7ZYubueZnfsGTDOpLw7itzolKOXGddTXsrJGBzSB4Bb060PBVllaDO0MOrhPap8OmrIl1Q==",
- "license": "Apache-2.0",
+ "node_modules/nyc/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nyc/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nyc/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-types/overlays": "^3.8.11",
- "@react-types/shared": "^3.26.0"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@rollup/pluginutils": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
- "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
+ "node_modules/nyc/node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^4.0.2"
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "node": ">=8.0.0"
}
},
- "node_modules/@rollup/pluginutils/node_modules/picomatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "node_modules/nyc/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
"engines": {
- "node": ">=12"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.0.tgz",
- "integrity": "sha512-TnF0md3qWSRDlU96y9+0dd5RNrlXiQUp1K2pK1UpNmjeND+o9ts9Jxv3G6ntagkt8jVh0KAT1VYgU0nCz5gt2w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.0.tgz",
- "integrity": "sha512-L/7oX07eY6ACt2NXDrku1JIPdf9VGV/DI92EjAd8FRDzMMub5hXFpT1OegBqimJh9xy9Vv+nToaVtZp4Ku9SEA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.0.tgz",
- "integrity": "sha512-I1ZucWPVS96hjAsMSJiGosHTqMulMynrmTN+Xde5OsLcU5SjE0xylBmQ/DbB2psJ+HasINrJYz8HQpojtAw2eA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.0.tgz",
- "integrity": "sha512-CTZ+lHMsTbH1q/XLKzmnJWxl2r/1xdv7cnjwbi5v+95nVA1syikxWLvqur4nDoGDHjC8oNMBGurnQptpuFJHXA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/nyc/node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.0.tgz",
- "integrity": "sha512-BB8+4OMzk2JiKL5+aK8A0pi9DPB5pkIBZWXr19+grdez9b0VKihvV432uSwuZLO0sI6zCyxak8NO3mZ1yjM1jA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/nyc/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.0.tgz",
- "integrity": "sha512-Udz9Uh26uEE6phGMG2++TfpsLK/z4cYJqrIOyVhig/PMoWiZLghpjZUQvsAylsoztbpg0/QmplkDAyyVq0x6Jg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/nyc/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.0.tgz",
- "integrity": "sha512-IPSCTzP8GRYzY+siSnggIKrckC2U+kVXoen6eSHRDgU9a4EZCHHWWOiKio1EkieOOk2j6EvZaaHfQUCmt8UJBg==",
- "cpu": [
- "arm"
- ],
+ "node_modules/nyc/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.0.tgz",
- "integrity": "sha512-GvHPu0UIDx+ohyS8vTYnwoSVMM5BH3NO+JwQs6GWNCuQVlC5rKxnH2WClTGu3NxiIfhKLai08IKUwn3QbzX1UQ==",
- "cpu": [
- "arm"
- ],
+ "node_modules/nyc/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.0.tgz",
- "integrity": "sha512-Pnnn/2CAZWcH9GQoj1nnr85Ejh7aNDe5MsEV0xhuFNUPF0SdnutJ7b2muOI5Kx12T0/i2ol5B/tlhMviZQDL3g==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/nyc/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.0.tgz",
- "integrity": "sha512-AP+DLj4q9FT22ZL43ssA3gizEn7/MfJcZ1BOuyEPqoriuH3a8VRuDddN0MtpUwEtiZL6jc1GY5/eL99hkloQ1Q==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.0.tgz",
- "integrity": "sha512-1+jPFClHmDATqbk0Cwi74KEOymVcs09Vbqe/CTKqLwCP0TeP2CACfnMnjYBs5CJgO20e/4bxFtmbR/9fKE1gug==",
- "cpu": [
- "loong64"
- ],
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "license": "ISC"
},
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.0.tgz",
- "integrity": "sha512-Nmt5Us5w2dL8eh7QVyAIDVVwBv4wk8ljrBQe7lWkLaOcwABDaFQ3K4sAAC6IsOdJwaXXW+d85zVaMN+Xl8Co2w==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.0.tgz",
- "integrity": "sha512-KGuQ8WGhnq09LR7eOru7P9jfBSYXTMhq6TyavWfmEo+TxvkvuRwOCee5lPIa6HYjblOuFr4GeOxSE0c8iyw2Fg==",
- "cpu": [
- "riscv64"
- ],
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.0.tgz",
- "integrity": "sha512-lSQtvrYIONme7a4gbf4O9d3zbZat3/5covIeoqk27ZIkTgBeL/67x+wq2bZfpLjkqQQp5SjBPQ/n0sg8iArzTg==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/nypm": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.12.tgz",
+ "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
+ "execa": "^8.0.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.0",
+ "ufo": "^1.5.4"
+ },
+ "bin": {
+ "nypm": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": "^14.16.0 || >=16.10.0"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.0.tgz",
- "integrity": "sha512-qh0ussrXBwnF4L07M9t1+jpHRhiGSae+wpNQDbmlXHXciT7pqpZ5zpk4dyGZPtDGB2l2clDiufE16BufXPGRWQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/nypm/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.0.tgz",
- "integrity": "sha512-YEABzSaRS7+v14yw6MVBZoMqLoUyTX1/sJoGeC0euvgMrzvw0i+jHo4keDZgYeOblfwdseVAf6ylxWSvcBAKTA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/nypm/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.0.tgz",
- "integrity": "sha512-jA4+oxG7QTTtSQxwSHzFVwShcppHO2DpkbAM59pfD5WMG/da79yQaeBtXAfGTI+ciUx8hqK3RF3H2KWByITXtQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/nypm/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.0.tgz",
- "integrity": "sha512-4TQbLoAQVu9uE+cvh47JnjRZylXVdRCoOkRSVF2Rr2T0U1YwphGRjR0sHyRPEt95y3ETT4YFTTzQPq1O4bcjmw==",
- "cpu": [
- "ia32"
- ],
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/nypm/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.0.tgz",
- "integrity": "sha512-GsFvcTZ7Yj9k94Qm0qgav7pxmQ7lQDR9NjoelRaxeV1UF6JSDfanR/2tHZ8hS7Ps4KPIVf5AElYPRPmN/Q0ZkQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/nypm/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/@storybook/addon-actions": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.7.tgz",
- "integrity": "sha512-mjtD5JxcPuW74T6h7nqMxWTvDneFtokg88p6kQ5OnC1M259iAXb//yiSZgu/quunMHPCXSiqn4FNOSgASTSbsA==",
+ "node_modules/nypm/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0",
- "@types/uuid": "^9.0.1",
- "dequal": "^2.0.2",
- "polished": "^4.2.2",
- "uuid": "^9.0.0"
+ "path-key": "^4.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/addon-backgrounds": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.7.tgz",
- "integrity": "sha512-I4/aErqtFiazcoWyKafOAm3bLpxTj6eQuH/woSbk1Yx+EzN+Dbrgx1Updy8//bsNtKkcrXETITreqHC+a57DHQ==",
+ "node_modules/nypm/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0",
- "memoizerific": "^1.11.3",
- "ts-dedent": "^2.0.0"
+ "mimic-fn": "^4.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">=12"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/addon-controls": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.7.tgz",
- "integrity": "sha512-377uo5IsJgXLnQLJixa47+11V+7Wn9KcDEw+96aGCBCfLbWNH8S08tJHHnSu+jXg9zoqCAC23MetntVp6LetHA==",
+ "node_modules/nypm/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "dequal": "^2.0.2",
- "ts-dedent": "^2.0.0"
+ "engines": {
+ "node": ">=12"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@storybook/addon-docs": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.7.tgz",
- "integrity": "sha512-NwWaiTDT5puCBSUOVuf6ME7Zsbwz7Y79WF5tMZBx/sLQ60vpmJVQsap6NSjvK1Ravhc21EsIXqemAcBjAWu80w==",
+ "node_modules/nypm/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@mdx-js/react": "^3.0.0",
- "@storybook/blocks": "8.4.7",
- "@storybook/csf-plugin": "8.4.7",
- "@storybook/react-dom-shim": "8.4.7",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "ts-dedent": "^2.0.0"
+ "engines": {
+ "node": ">=12"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/addon-essentials": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.4.7.tgz",
- "integrity": "sha512-+BtZHCBrYtQKILtejKxh0CDRGIgTl9PumfBOKRaihYb4FX1IjSAxoV/oo/IfEjlkF5f87vouShWsRa8EUauFDw==",
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@storybook/addon-actions": "8.4.7",
- "@storybook/addon-backgrounds": "8.4.7",
- "@storybook/addon-controls": "8.4.7",
- "@storybook/addon-docs": "8.4.7",
- "@storybook/addon-highlight": "8.4.7",
- "@storybook/addon-measure": "8.4.7",
- "@storybook/addon-outline": "8.4.7",
- "@storybook/addon-toolbars": "8.4.7",
- "@storybook/addon-viewport": "8.4.7",
- "ts-dedent": "^2.0.0"
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
+ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@storybook/addon-highlight": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.7.tgz",
- "integrity": "sha512-whQIDBd3PfVwcUCrRXvCUHWClXe9mQ7XkTPCdPo4B/tZ6Z9c6zD8JUHT76ddyHivixFLowMnA8PxMU6kCMAiNw==",
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@storybook/addon-interactions": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.4.7.tgz",
- "integrity": "sha512-fnufT3ym8ht3HHUIRVXAH47iOJW/QOb0VSM+j269gDuvyDcY03D1civCu1v+eZLGaXPKJ8vtjr0L8zKQ/4P0JQ==",
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.4.7",
- "@storybook/test": "8.4.7",
- "polished": "^4.2.2",
- "ts-dedent": "^2.2.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@storybook/addon-measure": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.4.7.tgz",
- "integrity": "sha512-QfvqYWDSI5F68mKvafEmZic3SMiK7zZM8VA0kTXx55hF/+vx61Mm0HccApUT96xCXIgmwQwDvn9gS4TkX81Dmw==",
+ "node_modules/ohash": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz",
+ "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0",
- "tiny-invariant": "^1.3.1"
+ "ee-first": "1.1.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/@storybook/addon-onboarding": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.4.7.tgz",
- "integrity": "sha512-FdC2NV60VNYeMxf6DVe0qV9ucSBAzMh1//C0Qqwq8CcjthMbmKlVZ7DqbVsbIHKnFaSCaUC88eR5olAfMaauCQ==",
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"dev": true,
"license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "react-confetti": "^6.1.0"
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">=6"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/addon-outline": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.4.7.tgz",
- "integrity": "sha512-6LYRqUZxSodmAIl8icr585Oi8pmzbZ90aloZJIpve+dBAzo7ydYrSQxxoQEVltXbKf3VeVcrs64ouAYqjisMYA==",
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0",
- "ts-dedent": "^2.0.0"
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">=12"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/addon-toolbars": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.7.tgz",
- "integrity": "sha512-OSfdv5UZs+NdGB+nZmbafGUWimiweJ/56gShlw8Neo/4jOJl1R3rnRqqY7MYx8E4GwoX+i3GF5C3iWFNQqlDcw==",
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/@storybook/addon-viewport": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.7.tgz",
- "integrity": "sha512-hvczh/jjuXXcOogih09a663sRDDSATXwbE866al1DXgbDFraYD/LxX/QDb38W9hdjU9+Qhx8VFIcNWoMQns5HQ==",
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "memoizerific": "^1.11.3"
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">=10"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/blocks": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.7.tgz",
- "integrity": "sha512-+QH7+JwXXXIyP3fRCxz/7E2VZepAanXJM7G8nbR3wWsqWgrRp4Wra6MvybxAYCxU7aNfJX5c+RW84SNikFpcIA==",
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/csf": "^0.1.11",
- "@storybook/icons": "^1.2.12",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "ansi-regex": "^5.0.1"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.4.7"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ordered-binary": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz",
+ "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@storybook/builder-vite": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.4.7.tgz",
- "integrity": "sha512-LovyXG5VM0w7CovI/k56ZZyWCveQFVDl0m7WwetpmMh2mmFJ+uPQ35BBsgTvTfc8RHi+9Q3F58qP1MQSByXi9g==",
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/csf-plugin": "8.4.7",
- "browser-assert": "^1.2.1",
- "ts-dedent": "^2.0.0"
+ "yocto-queue": "^0.1.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">=10"
},
- "peerDependencies": {
- "storybook": "^8.4.7",
- "vite": "^4.0.0 || ^5.0.0 || ^6.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/components": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.7.tgz",
- "integrity": "sha512-uyJIcoyeMWKAvjrG9tJBUCKxr2WZk+PomgrgrUwejkIfXMO76i6jw9BwLa0NZjYdlthDv30r9FfbYZyeNPmF0g==",
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "dependencies": {
+ "p-limit": "^3.0.2"
},
- "peerDependencies": {
- "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/core": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.7.tgz",
- "integrity": "sha512-7Z8Z0A+1YnhrrSXoKKwFFI4gnsLbWzr8fnDCU6+6HlDukFYh8GHRcZ9zKfqmy6U3hw2h8H5DrHsxWfyaYUUOoA==",
+ "node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/csf": "^0.1.11",
- "better-opn": "^3.0.2",
- "browser-assert": "^1.2.1",
- "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0",
- "esbuild-register": "^3.5.0",
- "jsdoc-type-pratt-parser": "^4.0.0",
- "process": "^0.11.10",
- "recast": "^0.23.5",
- "semver": "^7.6.2",
- "util": "^0.12.5",
- "ws": "^8.2.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "prettier": "^2 || ^3"
+ "aggregate-error": "^3.0.0"
},
- "peerDependenciesMeta": {
- "prettier": {
- "optional": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@storybook/csf": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz",
- "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==",
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "type-fest": "^2.19.0"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@storybook/csf-plugin": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.7.tgz",
- "integrity": "sha512-Fgogplu4HImgC+AYDcdGm1rmL6OR1rVdNX1Be9C/NEXwOCpbbBwi0BxTf/2ZxHRk9fCeaPEcOdP5S8QHfltc1g==",
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "unplugin": "^1.3.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@storybook/global": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
- "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
"dev": true,
"license": "MIT"
},
- "node_modules/@storybook/icons": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.3.0.tgz",
- "integrity": "sha512-Nz/UzeYQdUZUhacrPyfkiiysSjydyjgg/p0P9HxB4p/WaJUUjMAcaoaLgy3EXx61zZJ3iD36WPuDkZs5QYrA0A==",
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=14.0.0"
+ "dependencies": {
+ "callsites": "^3.0.0"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@storybook/instrumenter": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.4.7.tgz",
- "integrity": "sha512-k6NSD3jaRCCHAFtqXZ7tw8jAzD/yTEWXGya+REgZqq5RCkmJ+9S4Ytp/6OhQMPtPFX23gAuJJzTQVLcCr+gjRg==",
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/global": "^5.0.0",
- "@vitest/utils": "^2.1.1"
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "engines": {
+ "node": ">=8"
},
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/manager-api": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.7.tgz",
- "integrity": "sha512-ELqemTviCxAsZ5tqUz39sDmQkvhVAvAgiplYy9Uf15kO0SP2+HKsCMzlrm2ue2FfkUNyqbDayCPPCB0Cdn/mpQ==",
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
"dev": true,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@storybook/preview-api": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.7.tgz",
- "integrity": "sha512-0QVQwHw+OyZGHAJEXo6Knx+6/4er7n2rTDE5RYJ9F2E2Lg42E19pfdLlq2Jhoods2Xrclo3wj6GWR//Ahi39Eg==",
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/@storybook/react": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.4.7.tgz",
- "integrity": "sha512-nQ0/7i2DkaCb7dy0NaT95llRVNYWQiPIVuhNfjr1mVhEP7XD090p0g7eqUmsx8vfdHh2BzWEo6CoBFRd3+EXxw==",
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@storybook/components": "8.4.7",
- "@storybook/global": "^5.0.0",
- "@storybook/manager-api": "8.4.7",
- "@storybook/preview-api": "8.4.7",
- "@storybook/react-dom-shim": "8.4.7",
- "@storybook/theming": "8.4.7"
- },
"engines": {
- "node": ">=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "@storybook/test": "8.4.7",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.4.7",
- "typescript": ">= 4.2.x"
- },
- "peerDependenciesMeta": {
- "@storybook/test": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
+ "node": ">=8"
}
},
- "node_modules/@storybook/react-dom-shim": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.7.tgz",
- "integrity": "sha512-6bkG2jvKTmWrmVzCgwpTxwIugd7Lu+2btsLAqhQSzDyIj2/uhMNp8xIMr/NBDtLgq3nomt9gefNa9xxLwk/OMg==",
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.4.7"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@storybook/react-vite": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.4.7.tgz",
- "integrity": "sha512-iiY9iLdMXhDnilCEVxU6vQsN72pW3miaf0WSenOZRyZv3HdbpgOxI0qapOS0KCyRUnX9vTlmrSPTMchY4cAeOg==",
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "@joshwooding/vite-plugin-react-docgen-typescript": "0.4.2",
- "@rollup/pluginutils": "^5.0.2",
- "@storybook/builder-vite": "8.4.7",
- "@storybook/react": "8.4.7",
- "find-up": "^5.0.0",
- "magic-string": "^0.30.0",
- "react-docgen": "^7.0.0",
- "resolve": "^1.22.8",
- "tsconfig-paths": "^4.2.0"
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.4.7",
- "vite": "^4.0.0 || ^5.0.0 || ^6.0.0"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@storybook/test": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.4.7.tgz",
- "integrity": "sha512-AhvJsu5zl3uG40itSQVuSy5WByp3UVhS6xAnme4FWRwgSxhvZjATJ3AZkkHWOYjnnk+P2/sbz/XuPli1FVCWoQ==",
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.4.7",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.5.0",
- "@testing-library/user-event": "14.5.2",
- "@vitest/expect": "2.0.5",
- "@vitest/spy": "2.0.5"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.4.7"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@storybook/theming": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.7.tgz",
- "integrity": "sha512-99rgLEjf7iwfSEmdqlHkSG3AyLcK0sfExcr0jnc6rLiAkBhzuIsvcHjjUwkR210SOCgXqBPW0ZA6uhnuyppHLw==",
+ "node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/peek-stream": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+ "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
"dev": true,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "duplexify": "^3.5.0",
+ "through2": "^2.0.3"
}
},
- "node_modules/@swc/core": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.1.tgz",
- "integrity": "sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==",
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/counter": "^0.1.3",
- "@swc/types": "^0.1.17"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=8.6"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/swc"
- },
- "optionalDependencies": {
- "@swc/core-darwin-arm64": "1.10.1",
- "@swc/core-darwin-x64": "1.10.1",
- "@swc/core-linux-arm-gnueabihf": "1.10.1",
- "@swc/core-linux-arm64-gnu": "1.10.1",
- "@swc/core-linux-arm64-musl": "1.10.1",
- "@swc/core-linux-x64-gnu": "1.10.1",
- "@swc/core-linux-x64-musl": "1.10.1",
- "@swc/core-win32-arm64-msvc": "1.10.1",
- "@swc/core-win32-ia32-msvc": "1.10.1",
- "@swc/core-win32-x64-msvc": "1.10.1"
- },
- "peerDependencies": {
- "@swc/helpers": "*"
- },
- "peerDependenciesMeta": {
- "@swc/helpers": {
- "optional": true
- }
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@swc/core-darwin-arm64": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz",
- "integrity": "sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=6"
}
},
- "node_modules/@swc/core-darwin-x64": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz",
- "integrity": "sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 6"
}
},
- "node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz",
- "integrity": "sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==",
- "cpu": [
- "arm"
- ],
+ "node_modules/pkg-dir": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+ "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
"dev": true,
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^5.0.0"
+ },
"engines": {
"node": ">=10"
}
},
- "node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz",
- "integrity": "sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/pkg-types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz",
+ "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.2",
+ "pathe": "^1.1.2"
}
},
- "node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz",
- "integrity": "sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/playwright": {
+ "version": "1.49.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz",
+ "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.49.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
}
},
- "node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz",
- "integrity": "sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/playwright-core": {
+ "version": "1.49.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz",
+ "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/@swc/core-linux-x64-musl": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz",
- "integrity": "sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
+ "hasInstallScript": true,
+ "license": "MIT",
"optional": true,
"os": [
- "linux"
+ "darwin"
],
"engines": {
- "node": ">=10"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz",
- "integrity": "sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/polished": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz",
+ "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.17.8"
+ },
"engines": {
"node": ">=10"
}
},
- "node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz",
- "integrity": "sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
}
},
- "node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz",
- "integrity": "sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/postcss": {
+ "version": "8.4.49",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
"dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/counter": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
- "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/@swc/helpers": {
- "version": "0.5.15",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
- "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.8.0"
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
}
- },
- "node_modules/@swc/types": {
- "version": "0.1.17",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz",
- "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==",
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/counter": "^0.1.3"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/@testing-library/dom": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
- "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
+ "bin": {
+ "prettier": "bin-prettier.js"
},
"engines": {
- "node": ">=18"
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/@testing-library/jest-dom": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
- "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "lodash": "^4.17.21",
- "redent": "^3.0.0"
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
},
"engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=1"
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
- "node_modules/@testing-library/jest-dom/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
},
- "node_modules/@testing-library/user-event": {
- "version": "14.5.2",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz",
- "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==",
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=12",
- "npm": ">=6"
- },
- "peerDependencies": {
- "@testing-library/dom": ">=7.21.4"
+ "node": ">= 0.6.0"
}
},
- "node_modules/@types/aria-query": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true,
"license": "MIT"
},
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "node_modules/process-on-spawn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz",
+ "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
+ "fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
+ "engines": {
+ "node": ">=0.4.0"
}
},
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/@types/babel__traverse": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
- "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.20.7"
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
}
},
- "node_modules/@types/doctrine": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
- "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true,
"license": "MIT"
},
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
},
- "node_modules/@types/mdx": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
- "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true,
"license": "MIT"
},
- "node_modules/@types/prop-types": {
- "version": "15.7.14",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
- "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
},
- "node_modules/@types/react": {
- "version": "18.3.18",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
- "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
+ "node_modules/pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.0.2"
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
}
},
- "node_modules/@types/react-dom": {
- "version": "18.3.5",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz",
- "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==",
+ "node_modules/pumpify/node_modules/pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
"dev": true,
"license": "MIT",
- "peerDependencies": {
- "@types/react": "^18.0.0"
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
- "node_modules/@types/resolve": {
- "version": "1.20.6",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz",
- "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==",
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/@types/uuid": {
- "version": "9.0.8",
- "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
- "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "node_modules/puppeteer-core": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz",
+ "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==",
"dev": true,
- "license": "MIT"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/mime-types": "^2.1.0",
+ "debug": "^4.1.0",
+ "extract-zip": "^1.6.6",
+ "https-proxy-agent": "^4.0.0",
+ "mime": "^2.0.3",
+ "mime-types": "^2.1.25",
+ "progress": "^2.0.1",
+ "proxy-from-env": "^1.0.0",
+ "rimraf": "^2.6.1",
+ "ws": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=8.16.0"
+ }
},
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz",
- "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==",
+ "node_modules/puppeteer-core/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.18.1",
- "@typescript-eslint/type-utils": "8.18.1",
- "@typescript-eslint/utils": "8.18.1",
- "@typescript-eslint/visitor-keys": "8.18.1",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "*"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@typescript-eslint/parser": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz",
- "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==",
+ "node_modules/puppeteer-core/node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.18.1",
- "@typescript-eslint/types": "8.18.1",
- "@typescript-eslint/typescript-estree": "8.18.1",
- "@typescript-eslint/visitor-keys": "8.18.1",
- "debug": "^4.3.4"
+ "bin": {
+ "mime": "cli.js"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/puppeteer-core/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
},
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz",
- "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==",
+ "node_modules/puppeteer-core/node_modules/ws": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.18.1",
- "@typescript-eslint/visitor-keys": "8.18.1"
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/qs": {
+ "version": "6.13.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz",
+ "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=0.6"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz",
- "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==",
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ramda": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz",
+ "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.18.1",
- "@typescript-eslint/utils": "8.18.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "url": "https://opencollective.com/ramda"
}
},
- "node_modules/@typescript-eslint/types": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz",
- "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==",
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "node": ">= 0.6"
}
},
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz",
- "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==",
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.18.1",
- "@typescript-eslint/visitor-keys": "8.18.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.8.0"
+ "node": ">= 0.8"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
+ "node_modules/react-aria": {
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.36.0.tgz",
+ "integrity": "sha512-AK5XyIhAN+e5HDlwlF+YwFrOrVI7RYmZ6kg/o7ZprQjkYqYKapXeUpWscmNm/3H2kDboE5Z4ymUnK6ZhobLqOw==",
+ "license": "Apache-2.0",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "@internationalized/string": "^3.2.5",
+ "@react-aria/breadcrumbs": "^3.5.19",
+ "@react-aria/button": "^3.11.0",
+ "@react-aria/calendar": "^3.6.0",
+ "@react-aria/checkbox": "^3.15.0",
+ "@react-aria/color": "^3.0.2",
+ "@react-aria/combobox": "^3.11.0",
+ "@react-aria/datepicker": "^3.12.0",
+ "@react-aria/dialog": "^3.5.20",
+ "@react-aria/disclosure": "^3.0.0",
+ "@react-aria/dnd": "^3.8.0",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/gridlist": "^3.10.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/link": "^3.7.7",
+ "@react-aria/listbox": "^3.13.6",
+ "@react-aria/menu": "^3.16.0",
+ "@react-aria/meter": "^3.4.18",
+ "@react-aria/numberfield": "^3.11.9",
+ "@react-aria/overlays": "^3.24.0",
+ "@react-aria/progress": "^3.4.18",
+ "@react-aria/radio": "^3.10.10",
+ "@react-aria/searchfield": "^3.7.11",
+ "@react-aria/select": "^3.15.0",
+ "@react-aria/selection": "^3.21.0",
+ "@react-aria/separator": "^3.4.4",
+ "@react-aria/slider": "^3.7.14",
+ "@react-aria/ssr": "^3.9.7",
+ "@react-aria/switch": "^3.6.10",
+ "@react-aria/table": "^3.16.0",
+ "@react-aria/tabs": "^3.9.8",
+ "@react-aria/tag": "^3.4.8",
+ "@react-aria/textfield": "^3.15.0",
+ "@react-aria/tooltip": "^3.7.10",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/visually-hidden": "^3.8.18",
+ "@react-types/shared": "^3.26.0"
},
- "engines": {
- "node": ">=16 || 14 >=14.17"
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/react-aria-components": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.5.0.tgz",
+ "integrity": "sha512-wzf0g6cvWrqAJd4FkisAfFnslx6AJREgOd/NEmVE/RGuDxGTzss4awcwbo98rIVmqbTTFApiygy0SyWGrRZfDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@internationalized/string": "^3.2.5",
+ "@react-aria/collections": "3.0.0-alpha.6",
+ "@react-aria/color": "^3.0.2",
+ "@react-aria/disclosure": "^3.0.0",
+ "@react-aria/dnd": "^3.8.0",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/menu": "^3.16.0",
+ "@react-aria/toolbar": "3.0.0-beta.11",
+ "@react-aria/tree": "3.0.0-beta.2",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/virtualizer": "^4.1.0",
+ "@react-stately/color": "^3.8.1",
+ "@react-stately/disclosure": "^3.0.0",
+ "@react-stately/layout": "^4.1.0",
+ "@react-stately/menu": "^3.9.0",
+ "@react-stately/selection": "^3.18.0",
+ "@react-stately/table": "^3.13.0",
+ "@react-stately/utils": "^3.10.5",
+ "@react-stately/virtualizer": "^4.2.0",
+ "@react-types/color": "^3.0.1",
+ "@react-types/form": "^3.7.8",
+ "@react-types/grid": "^3.2.10",
+ "@react-types/shared": "^3.26.0",
+ "@react-types/table": "^3.10.3",
+ "@swc/helpers": "^0.5.0",
+ "client-only": "^0.0.1",
+ "react-aria": "^3.36.0",
+ "react-stately": "^3.34.0",
+ "use-sync-external-store": "^1.2.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
- "node_modules/@typescript-eslint/utils": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz",
- "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==",
+ "node_modules/react-colorful": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz",
+ "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.18.1",
- "@typescript-eslint/types": "8.18.1",
- "@typescript-eslint/typescript-estree": "8.18.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
}
},
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz",
- "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==",
+ "node_modules/react-confetti": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz",
+ "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.18.1",
- "eslint-visitor-keys": "^4.2.0"
+ "tween-functions": "^1.2.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=10.18"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "peerDependencies": {
+ "react": "^16.3.0 || ^17.0.1 || ^18.0.0"
}
},
- "node_modules/@vitejs/plugin-react-swc": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz",
- "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==",
+ "node_modules/react-docgen": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.0.tgz",
+ "integrity": "sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@swc/core": "^1.7.26"
+ "@babel/core": "^7.18.9",
+ "@babel/traverse": "^7.18.9",
+ "@babel/types": "^7.18.9",
+ "@types/babel__core": "^7.18.0",
+ "@types/babel__traverse": "^7.18.0",
+ "@types/doctrine": "^0.0.9",
+ "@types/resolve": "^1.20.2",
+ "doctrine": "^3.0.0",
+ "resolve": "^1.22.1",
+ "strip-indent": "^4.0.0"
},
- "peerDependencies": {
- "vite": "^4 || ^5 || ^6"
+ "engines": {
+ "node": ">=16.14.0"
}
},
- "node_modules/@vitest/expect": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz",
- "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==",
+ "node_modules/react-docgen-typescript": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
+ "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@vitest/spy": "2.0.5",
- "@vitest/utils": "2.0.5",
- "chai": "^5.1.1",
- "tinyrainbow": "^1.2.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
+ "peerDependencies": {
+ "typescript": ">= 4.3.x"
}
},
- "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz",
- "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==",
+ "node_modules/react-docgen/node_modules/@types/doctrine": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
+ "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT",
"dependencies": {
- "tinyrainbow": "^1.2.0"
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
},
- "funding": {
- "url": "https://opencollective.com/vitest"
+ "peerDependencies": {
+ "react": "^18.3.1"
}
},
- "node_modules/@vitest/expect/node_modules/@vitest/utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz",
- "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==",
+ "node_modules/react-element-to-jsx-string": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
+ "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "2.0.5",
- "estree-walker": "^3.0.3",
- "loupe": "^3.1.1",
- "tinyrainbow": "^1.2.0"
+ "@base2/pretty-print-object": "1.0.1",
+ "is-plain-object": "5.0.0",
+ "react-is": "18.1.0"
},
- "funding": {
- "url": "https://opencollective.com/vitest"
+ "peerDependencies": {
+ "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0",
+ "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0"
}
},
- "node_modules/@vitest/expect/node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "node_modules/react-element-to-jsx-string/node_modules/react-is": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
+ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
+ "license": "MIT"
},
- "node_modules/@vitest/pretty-format": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz",
- "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==",
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "tinyrainbow": "^1.2.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
+ "license": "MIT"
},
- "node_modules/@vitest/spy": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz",
- "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==",
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "tinyspy": "^3.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@vitest/utils": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz",
- "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==",
+ "node_modules/react-remove-scroll": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
+ "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "2.1.8",
- "loupe": "^3.1.2",
- "tinyrainbow": "^1.2.0"
+ "react-remove-scroll-bar": "^2.3.3",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
},
- "funding": {
- "url": "https://opencollective.com/vitest"
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
"dev": true,
"license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">=0.4.0"
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "license": "MIT",
+ "node_modules/react-stately": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.34.0.tgz",
+ "integrity": "sha512-0N9tZ8qQ/CxpJH7ao0O6gr+8955e7VrOskg9N+TIxkFknPetwOCtgppMYhnTfteBV8WfM/vv4OC1NbkgYTqXJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-stately/calendar": "^3.6.0",
+ "@react-stately/checkbox": "^3.6.10",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/color": "^3.8.1",
+ "@react-stately/combobox": "^3.10.1",
+ "@react-stately/data": "^3.12.0",
+ "@react-stately/datepicker": "^3.11.0",
+ "@react-stately/disclosure": "^3.0.0",
+ "@react-stately/dnd": "^3.5.0",
+ "@react-stately/form": "^3.1.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-stately/menu": "^3.9.0",
+ "@react-stately/numberfield": "^3.9.8",
+ "@react-stately/overlays": "^3.6.12",
+ "@react-stately/radio": "^3.10.9",
+ "@react-stately/searchfield": "^3.5.8",
+ "@react-stately/select": "^3.6.9",
+ "@react-stately/selection": "^3.18.0",
+ "@react-stately/slider": "^3.6.0",
+ "@react-stately/table": "^3.13.0",
+ "@react-stately/tabs": "^3.7.0",
+ "@react-stately/toggle": "^3.8.0",
+ "@react-stately/tooltip": "^3.5.0",
+ "@react-stately/tree": "^3.8.6",
+ "@react-types/shared": "^3.26.0"
+ },
"peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
},
"engines": {
"node": ">=8"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "dequal": "^2.0.3"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/assertion-error": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=8"
}
},
- "node_modules/ast-types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
- "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+ "node_modules/read-pkg-up/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "^2.0.1"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "node_modules/read-pkg-up/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "possible-typed-array-names": "^1.0.0"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/better-opn": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
- "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
+ "node_modules/read-pkg-up/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "open": "^8.0.4"
+ "p-limit": "^2.2.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=8"
}
},
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
+ "license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=8"
}
},
- "node_modules/browser-assert": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
- "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==",
- "dev": true
- },
- "node_modules/browserslist": {
- "version": "4.24.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
- "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
"license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
- },
- "bin": {
- "browserslist": "cli.js"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
},
"engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ "node": ">= 6"
}
},
- "node_modules/call-bind": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
- "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "node_modules/recast": {
+ "version": "0.23.9",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
+ "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.0",
- "es-define-property": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.2"
+ "ast-types": "^0.16.1",
+ "esprima": "~4.0.0",
+ "source-map": "~0.6.1",
+ "tiny-invariant": "^1.3.3",
+ "tslib": "^2.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 4"
}
},
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
- "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
+ "regenerate": "^1.4.2"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=4"
}
},
- "node_modules/call-bound": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
- "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "get-intrinsic": "^1.2.6"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -4712,1139 +19374,1179 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001690",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
- "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
+ "license": "MIT"
},
- "node_modules/chai": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
- "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
"dev": true,
"license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "assertion-error": "^2.0.1",
- "check-error": "^2.1.1",
- "deep-eql": "^5.0.1",
- "loupe": "^3.1.0",
- "pathval": "^2.0.0"
+ "es6-error": "^4.0.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=4"
}
},
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/remark-external-links": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz",
+ "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "extend": "^3.0.0",
+ "is-absolute-url": "^3.0.0",
+ "mdast-util-definitions": "^4.0.0",
+ "space-separated-tokens": "^1.0.0",
+ "unist-util-visit": "^2.0.0"
},
- "engines": {
- "node": ">=10"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-slug": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz",
+ "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "github-slugger": "^1.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "unist-util-visit": "^2.0.0"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/check-error": {
+ "node_modules/require-directory": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
- "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 16"
+ "node": ">=0.10.0"
}
},
- "node_modules/chromatic": {
- "version": "11.20.2",
- "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.20.2.tgz",
- "integrity": "sha512-c+M3HVl5Y60c7ipGTZTyeWzWubRW70YsJ7PPDpO1D735ib8+Lu3yGF90j61pvgkXGngpkTPHZyBw83lcu2JMxA==",
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true,
- "license": "MIT",
- "bin": {
- "chroma": "dist/bin.js",
- "chromatic": "dist/bin.js",
- "chromatic-cli": "dist/bin.js"
- },
- "peerDependencies": {
- "@chromatic-com/cypress": "^0.*.* || ^1.0.0",
- "@chromatic-com/playwright": "^0.*.* || ^1.0.0"
- },
- "peerDependenciesMeta": {
- "@chromatic-com/cypress": {
- "optional": true
- },
- "@chromatic-com/playwright": {
- "optional": true
- }
- }
+ "license": "ISC"
},
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "resolve-from": "^5.0.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=8"
}
},
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "node_modules/resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "expand-tilde": "^1.2.2",
+ "global-modules": "^0.2.3"
},
"engines": {
- "node": ">= 8"
+ "node": ">=0.10.0"
}
},
- "node_modules/css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "node_modules/resolve.exports": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
+ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
},
- "node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">=8"
}
},
- "node_modules/decimal.js": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
- "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
- "license": "MIT"
- },
- "node_modules/deep-eql": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
- "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
}
},
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
- "license": "MIT"
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
},
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "node_modules/rollup": {
+ "version": "3.29.5",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
+ "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
"dev": true,
"license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
}
},
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
}
},
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
+ "tslib": "^2.1.0"
}
},
- "node_modules/dom-accessibility-api": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
- "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
"license": "MIT"
},
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
- "gopd": "^1.2.0"
+ "is-regex": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/electron-to-chromium": {
- "version": "1.5.75",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz",
- "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==",
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "loose-envify": "^1.1.0"
}
},
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0"
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 0.8.0"
}
},
- "node_modules/esbuild": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
- "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
- "hasInstallScript": true,
"license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.24.0",
- "@esbuild/android-arm": "0.24.0",
- "@esbuild/android-arm64": "0.24.0",
- "@esbuild/android-x64": "0.24.0",
- "@esbuild/darwin-arm64": "0.24.0",
- "@esbuild/darwin-x64": "0.24.0",
- "@esbuild/freebsd-arm64": "0.24.0",
- "@esbuild/freebsd-x64": "0.24.0",
- "@esbuild/linux-arm": "0.24.0",
- "@esbuild/linux-arm64": "0.24.0",
- "@esbuild/linux-ia32": "0.24.0",
- "@esbuild/linux-loong64": "0.24.0",
- "@esbuild/linux-mips64el": "0.24.0",
- "@esbuild/linux-ppc64": "0.24.0",
- "@esbuild/linux-riscv64": "0.24.0",
- "@esbuild/linux-s390x": "0.24.0",
- "@esbuild/linux-x64": "0.24.0",
- "@esbuild/netbsd-x64": "0.24.0",
- "@esbuild/openbsd-arm64": "0.24.0",
- "@esbuild/openbsd-x64": "0.24.0",
- "@esbuild/sunos-x64": "0.24.0",
- "@esbuild/win32-arm64": "0.24.0",
- "@esbuild/win32-ia32": "0.24.0",
- "@esbuild/win32-x64": "0.24.0"
+ "dependencies": {
+ "ms": "2.0.0"
}
},
- "node_modules/esbuild-register": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
- "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.4"
- },
- "peerDependencies": {
- "esbuild": ">=0.12 <1"
- }
+ "license": "MIT"
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.8"
}
},
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/eslint": {
- "version": "9.17.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz",
- "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==",
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.19.0",
- "@eslint/core": "^0.9.0",
- "@eslint/eslintrc": "^3.2.0",
- "@eslint/js": "9.17.0",
- "@eslint/plugin-kit": "^0.2.3",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.1",
- "@types/estree": "^1.0.6",
- "@types/json-schema": "^7.0.15",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.2.0",
- "eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0",
- "esquery": "^1.5.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
+ "node": ">= 0.4"
}
},
- "node_modules/eslint-plugin-react-hooks": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz",
- "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==",
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
},
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.16",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.16.tgz",
- "integrity": "sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==",
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true,
- "license": "MIT",
- "peerDependencies": {
- "eslint": ">=8.40"
- }
+ "license": "ISC"
},
- "node_modules/eslint-plugin-storybook": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.11.1.tgz",
- "integrity": "sha512-yGKpAYkBm/Q2hZg476vRUAvd9lAccjjSvzU5nYy3BSQbKTPy7uopx7JEpwk2vSuw4weTMZzWF64z9/gp/K5RCg==",
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@storybook/csf": "^0.1.11",
- "@typescript-eslint/utils": "^8.8.1",
- "ts-dedent": "^2.2.0"
+ "kind-of": "^6.0.2"
},
"engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "eslint": ">=6"
+ "node": ">=8"
}
},
- "node_modules/eslint-scope": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
- "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "shebang-regex": "^3.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": ">=8"
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": ">=8"
}
},
- "node_modules/espree": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
- "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "acorn": "^8.14.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "estraverse": "^5.1.0"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
},
"engines": {
- "node": ">=0.10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "estraverse": "^5.2.0"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
- "node": ">=4.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
+ "license": "ISC"
},
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
"dev": true,
"license": "MIT"
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=8.6.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">= 6"
+ "node": ">=0.10.0"
}
},
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "reusify": "^1.0.4"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
"dev": true,
"license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "flat-cache": "^4.0.0"
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=8"
}
},
- "node_modules/filesize": {
- "version": "10.1.6",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz",
- "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==",
+ "node_modules/spawn-wrap/node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
"engines": {
- "node": ">= 10.4.0"
+ "node": ">=8.0.0"
}
},
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "node_modules/spawn-wrap/node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
"engines": {
- "node": ">=8"
+ "node": ">=0.10.0"
}
},
- "node_modules/find-up": {
+ "node_modules/spawnd": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz",
+ "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "exit": "^0.1.2",
+ "signal-exit": "^3.0.3",
+ "tree-kill": "^1.2.2",
+ "wait-port": "^0.2.9"
}
},
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/flatted": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
"dev": true,
- "license": "ISC"
+ "license": "CC-BY-3.0"
},
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-callable": "^1.1.3"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.20",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
+ "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
"dev": true,
- "hasInstallScript": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "node": ">=10"
}
},
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.8"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
- "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "dunder-proto": "^1.0.0",
- "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "function-bind": "^1.1.2",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.0.0"
+ "internal-slot": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
+ }
+ },
+ "node_modules/store2": {
+ "version": "2.14.3",
+ "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz",
+ "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/storybook": {
+ "version": "7.6.20",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.20.tgz",
+ "integrity": "sha512-Wt04pPTO71pwmRmsgkyZhNo4Bvdb/1pBAMsIFb9nQLykEdzzpXjvingxFFvdOG4nIowzwgxD+CLlyRqVJqnATw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/cli": "7.6.20"
+ },
+ "bin": {
+ "sb": "index.js",
+ "storybook": "index.js"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
}
},
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/storybook-builder-parcel": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/storybook-builder-parcel/-/storybook-builder-parcel-0.0.1.tgz",
+ "integrity": "sha512-dlm9RloMAmgvQJmeaBvOHCJqUfLs1F1zQ73xSLX4gOMkNUEa+yik7QUjNRtA7AUiESy7eW4fFnLnzHuKZBCT5A==",
"dev": true,
- "license": "ISC",
"dependencies": {
- "is-glob": "^4.0.3"
+ "@parcel/core": "^2.13.1",
+ "@parcel/reporter-cli": "^2.13.1",
+ "@storybook/channels": "^7.6.4",
+ "@storybook/client-logger": "^7.6.4",
+ "@storybook/core-common": "^7.6.4",
+ "@storybook/preview": "^7.6.4",
+ "@storybook/preview-api": "^7.6.4",
+ "http-proxy-middleware": "^2.0.6"
},
- "engines": {
- "node": ">=10.13.0"
+ "peerDependencies": {
+ "react": "*"
}
},
- "node_modules/globals": {
- "version": "15.14.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz",
- "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==",
+ "node_modules/storybook-dark-mode": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-4.0.2.tgz",
+ "integrity": "sha512-zjcwwQ01R5t1VsakA6alc2JDIRVtavryW8J3E3eKLDIlAMcvsgtpxlelWkZs2cuNspk6Z10XzhQVrUWtYc3F0w==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "dependencies": {
+ "@storybook/components": "^8.0.0",
+ "@storybook/core-events": "^8.0.0",
+ "@storybook/global": "^5.0.0",
+ "@storybook/icons": "^1.2.5",
+ "@storybook/manager-api": "^8.0.0",
+ "@storybook/theming": "^8.0.0",
+ "fast-deep-equal": "^3.1.3",
+ "memoizerific": "^1.11.3"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "node_modules/storybook-dark-mode/node_modules/@storybook/components": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.7.tgz",
+ "integrity": "sha512-uyJIcoyeMWKAvjrG9tJBUCKxr2WZk+PomgrgrUwejkIfXMO76i6jw9BwLa0NZjYdlthDv30r9FfbYZyeNPmF0g==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "node_modules/storybook-dark-mode/node_modules/@storybook/core-events": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.4.7.tgz",
+ "integrity": "sha512-D5WhJBVfywIVBurNZ7mwSjXT18a8Ct5AfZFEukIBPLaezY21TgN/7sE2OU5dkMQsm11oAZzsdLPOzms2e9HsRg==",
"dev": true,
- "license": "ISC",
- "optional": true
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
},
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "node_modules/storybook-dark-mode/node_modules/@storybook/manager-api": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.7.tgz",
+ "integrity": "sha512-ELqemTviCxAsZ5tqUz39sDmQkvhVAvAgiplYy9Uf15kO0SP2+HKsCMzlrm2ue2FfkUNyqbDayCPPCB0Cdn/mpQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
},
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/storybook-dark-mode/node_modules/@storybook/theming": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.7.tgz",
+ "integrity": "sha512-99rgLEjf7iwfSEmdqlHkSG3AyLcK0sfExcr0jnc6rLiAkBhzuIsvcHjjUwkR210SOCgXqBPW0ZA6uhnuyppHLw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "node_modules/storybook-dark-mode/node_modules/storybook": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.7.tgz",
+ "integrity": "sha512-RP/nMJxiWyFc8EVMH5gp20ID032Wvk+Yr3lmKidoegto5Iy+2dVQnUoElZb2zpbVXNHWakGuAkfI0dY1Hfp/vw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "es-define-property": "^1.0.0"
+ "@storybook/core": "8.4.7"
+ },
+ "bin": {
+ "getstorybook": "bin/index.cjs",
+ "sb": "bin/index.cjs",
+ "storybook": "bin/index.cjs"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "node_modules/storybook-react-parcel": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/storybook-react-parcel/-/storybook-react-parcel-0.0.1.tgz",
+ "integrity": "sha512-oZr8lkBtGIkSrVtXpMCEKyvqACCPv5IjkD3eYzd0C5itJ99D7PTubT3+ROXYKznrZO/xeYus7AsEpayejPYaJA==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "dependencies": {
+ "@storybook/react": "^7.6.4",
+ "storybook-builder-parcel": "^0.0.1"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/stream-shift": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "safe-buffer": "~5.2.0"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "function-bind": "^1.1.2"
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
}
},
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "node_modules/string-length/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
"engines": {
- "node": ">= 4"
+ "node": ">=8"
}
},
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">=6"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/intl-messageformat": {
- "version": "10.7.10",
- "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz",
- "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==",
- "license": "BSD-3-Clause",
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@formatjs/ecma402-abstract": "2.3.1",
- "@formatjs/fast-memoize": "2.2.5",
- "@formatjs/icu-messageformat-parser": "2.9.7",
- "tslib": "2"
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/is-arguments": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
- "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/is-core-module": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz",
- "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==",
+ "node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
"dev": true,
"license": "MIT",
- "bin": {
- "is-docker": "cli.js"
- },
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6"
}
},
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "node_modules/strip-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
+ "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "min-indent": "^1.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
"engines": {
- "node": ">=0.12.0"
+ "node": ">=8"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "which-typed-array": "^1.1.16"
- },
"engines": {
"node": ">= 0.4"
},
@@ -5852,147 +20554,166 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "node_modules/synchronous-promise": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz",
+ "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "is-docker": "^2.0.0"
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "license": "MIT"
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "node_modules/tar-fs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
"dev": true,
"license": "MIT",
"dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
}
},
- "node_modules/jsdoc-type-pratt-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
- "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
+ "node_modules/tar-fs/node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- }
+ "license": "ISC"
},
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
},
"engines": {
"node": ">=6"
}
},
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
- "license": "MIT"
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "node_modules/tar/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
- "license": "MIT"
+ "license": "ISC"
},
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "node_modules/telejson": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz",
+ "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "memoizerific": "^1.11.3"
+ }
},
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "node_modules/temp": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
+ "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==",
"dev": true,
"license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
+ "dependencies": {
+ "rimraf": "~2.6.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=6.0.0"
}
},
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "node_modules/temp/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "json-buffer": "3.0.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "node_modules/temp/node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
+ "glob": "^7.1.3"
},
- "engines": {
- "node": ">= 0.8.0"
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/tempy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
+ "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "p-locate": "^5.0.0"
+ "del": "^6.0.0",
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
},
"engines": {
"node": ">=10"
@@ -6001,1361 +20722,1395 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
"dev": true,
- "license": "MIT"
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "node_modules/term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
+ "engines": {
+ "node": ">=8"
},
- "bin": {
- "loose-envify": "cli.js"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/loupe": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
- "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
- "yallist": "^3.0.2"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/lz-string": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
- "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
"license": "MIT",
- "bin": {
- "lz-string": "bin/bin.js"
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
}
},
- "node_modules/magic-string": {
- "version": "0.30.17",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
- "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "node_modules/through2/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
}
},
- "node_modules/map-or-similar": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
- "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==",
+ "node_modules/through2/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true,
"license": "MIT"
},
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
}
},
- "node_modules/memoizerific": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz",
- "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==",
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "map-or-similar": "^1.5.0"
- }
+ "license": "MIT"
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
+ "is-number": "^7.0.0"
},
"engines": {
- "node": ">=8.6"
+ "node": ">=8.0"
}
},
- "node_modules/min-indent": {
+ "node_modules/tocbot": {
+ "version": "4.32.2",
+ "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.32.2.tgz",
+ "integrity": "sha512-UbVZNXX79LUqMzsnSTwE/YF/PYc2pg3G77D/jcolHd6lmw+oklzfcLtHSsmWBhOf1wfWD1HfYzdjGQef1VcQgg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/toidentifier": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=0.6"
}
},
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
+ "license": "MIT"
},
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"dev": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "tree-kill": "cli.js"
}
},
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "node_modules/ts-api-utils": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
+ "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
},
- "node_modules/nanoid": {
- "version": "3.3.8",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
- "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "node_modules/ts-dedent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
+ "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
"license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
"engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ "node": ">=6.10"
}
},
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
},
- "node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "node_modules/tween-functions": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz",
+ "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==",
"dev": true,
- "license": "MIT"
+ "license": "BSD"
},
- "node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
+ "prelude-ls": "^1.2.1"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 0.8.0"
}
},
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=4"
}
},
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=10"
+ "node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "p-limit": "^3.0.2"
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 0.6"
}
},
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
+ "is-typedarray": "^1.0.0"
}
},
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=14.17"
}
},
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "node_modules/typescript-eslint": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.2.tgz",
+ "integrity": "sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.18.2",
+ "@typescript-eslint/parser": "8.18.2",
+ "@typescript-eslint/utils": "8.18.2"
+ },
"engines": {
- "node": ">=8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "node_modules/ufo": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
"dev": true,
"license": "MIT"
},
- "node_modules/pathval": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
- "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
"engines": {
- "node": ">= 14.16"
+ "node": ">=0.8.0"
}
},
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "node": ">=4"
}
},
- "node_modules/polished": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz",
- "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==",
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.17.8"
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=4"
}
},
- "node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=4"
}
},
- "node_modules/postcss": {
- "version": "8.4.49",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
+ "crypto-random-string": "^2.0.0"
},
"engines": {
- "node": "^10 || ^12 || >=14"
+ "node": ">=8"
}
},
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "node_modules/unist-util-is": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/pretty-format": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
- "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "node_modules/unist-util-visit": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+ "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1",
- "ansi-styles": "^5.0.0",
- "react-is": "^17.0.1"
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0",
+ "unist-util-visit-parents": "^3.0.0"
},
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/unist-util-visit-parents": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
+ "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.6.0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.8"
}
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "node_modules/unplugin": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz",
+ "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/react": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
- "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0"
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/react-aria": {
- "version": "3.36.0",
- "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.36.0.tgz",
- "integrity": "sha512-AK5XyIhAN+e5HDlwlF+YwFrOrVI7RYmZ6kg/o7ZprQjkYqYKapXeUpWscmNm/3H2kDboE5Z4ymUnK6ZhobLqOw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@internationalized/string": "^3.2.5",
- "@react-aria/breadcrumbs": "^3.5.19",
- "@react-aria/button": "^3.11.0",
- "@react-aria/calendar": "^3.6.0",
- "@react-aria/checkbox": "^3.15.0",
- "@react-aria/color": "^3.0.2",
- "@react-aria/combobox": "^3.11.0",
- "@react-aria/datepicker": "^3.12.0",
- "@react-aria/dialog": "^3.5.20",
- "@react-aria/disclosure": "^3.0.0",
- "@react-aria/dnd": "^3.8.0",
- "@react-aria/focus": "^3.19.0",
- "@react-aria/gridlist": "^3.10.0",
- "@react-aria/i18n": "^3.12.4",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/label": "^3.7.13",
- "@react-aria/link": "^3.7.7",
- "@react-aria/listbox": "^3.13.6",
- "@react-aria/menu": "^3.16.0",
- "@react-aria/meter": "^3.4.18",
- "@react-aria/numberfield": "^3.11.9",
- "@react-aria/overlays": "^3.24.0",
- "@react-aria/progress": "^3.4.18",
- "@react-aria/radio": "^3.10.10",
- "@react-aria/searchfield": "^3.7.11",
- "@react-aria/select": "^3.15.0",
- "@react-aria/selection": "^3.21.0",
- "@react-aria/separator": "^3.4.4",
- "@react-aria/slider": "^3.7.14",
- "@react-aria/ssr": "^3.9.7",
- "@react-aria/switch": "^3.6.10",
- "@react-aria/table": "^3.16.0",
- "@react-aria/tabs": "^3.9.8",
- "@react-aria/tag": "^3.4.8",
- "@react-aria/textfield": "^3.15.0",
- "@react-aria/tooltip": "^3.7.10",
- "@react-aria/utils": "^3.26.0",
- "@react-aria/visually-hidden": "^3.8.18",
- "@react-types/shared": "^3.26.0"
+ "node_modules/unplugin/node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
},
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "engines": {
+ "node": ">=0.4.0"
}
},
- "node_modules/react-aria-components": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.5.0.tgz",
- "integrity": "sha512-wzf0g6cvWrqAJd4FkisAfFnslx6AJREgOd/NEmVE/RGuDxGTzss4awcwbo98rIVmqbTTFApiygy0SyWGrRZfDA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@internationalized/date": "^3.6.0",
- "@internationalized/string": "^3.2.5",
- "@react-aria/collections": "3.0.0-alpha.6",
- "@react-aria/color": "^3.0.2",
- "@react-aria/disclosure": "^3.0.0",
- "@react-aria/dnd": "^3.8.0",
- "@react-aria/focus": "^3.19.0",
- "@react-aria/interactions": "^3.22.5",
- "@react-aria/live-announcer": "^3.4.1",
- "@react-aria/menu": "^3.16.0",
- "@react-aria/toolbar": "3.0.0-beta.11",
- "@react-aria/tree": "3.0.0-beta.2",
- "@react-aria/utils": "^3.26.0",
- "@react-aria/virtualizer": "^4.1.0",
- "@react-stately/color": "^3.8.1",
- "@react-stately/disclosure": "^3.0.0",
- "@react-stately/layout": "^4.1.0",
- "@react-stately/menu": "^3.9.0",
- "@react-stately/selection": "^3.18.0",
- "@react-stately/table": "^3.13.0",
- "@react-stately/utils": "^3.10.5",
- "@react-stately/virtualizer": "^4.2.0",
- "@react-types/color": "^3.0.1",
- "@react-types/form": "^3.7.8",
- "@react-types/grid": "^3.2.10",
- "@react-types/shared": "^3.26.0",
- "@react-types/table": "^3.10.3",
- "@swc/helpers": "^0.5.0",
- "client-only": "^0.0.1",
- "react-aria": "^3.36.0",
- "react-stately": "^3.34.0",
- "use-sync-external-store": "^1.2.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
- "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/react-confetti": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz",
- "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==",
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "tween-functions": "^1.2.0"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
},
- "engines": {
- "node": ">=10.18"
+ "bin": {
+ "update-browserslist-db": "cli.js"
},
"peerDependencies": {
- "react": "^16.3.0 || ^17.0.1 || ^18.0.0"
+ "browserslist": ">= 4.21.0"
}
},
- "node_modules/react-docgen": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.0.tgz",
- "integrity": "sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==",
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "@babel/core": "^7.18.9",
- "@babel/traverse": "^7.18.9",
- "@babel/types": "^7.18.9",
- "@types/babel__core": "^7.18.0",
- "@types/babel__traverse": "^7.18.0",
- "@types/doctrine": "^0.0.9",
- "@types/resolve": "^1.20.2",
- "doctrine": "^3.0.0",
- "resolve": "^1.22.1",
- "strip-indent": "^4.0.0"
- },
- "engines": {
- "node": ">=16.14.0"
+ "punycode": "^2.1.0"
}
},
- "node_modules/react-docgen-typescript": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
- "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
"peerDependencies": {
- "typescript": ">= 4.3.x"
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/react-dom": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
- "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "node_modules/use-resize-observer": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz",
+ "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.2"
+ "@juggle/resize-observer": "^3.3.1"
},
"peerDependencies": {
- "react": "^18.3.1"
+ "react": "16.8.0 - 18",
+ "react-dom": "16.8.0 - 18"
}
},
- "node_modules/react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/react-stately": {
- "version": "3.34.0",
- "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.34.0.tgz",
- "integrity": "sha512-0N9tZ8qQ/CxpJH7ao0O6gr+8955e7VrOskg9N+TIxkFknPetwOCtgppMYhnTfteBV8WfM/vv4OC1NbkgYTqXJA==",
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@react-stately/calendar": "^3.6.0",
- "@react-stately/checkbox": "^3.6.10",
- "@react-stately/collections": "^3.12.0",
- "@react-stately/color": "^3.8.1",
- "@react-stately/combobox": "^3.10.1",
- "@react-stately/data": "^3.12.0",
- "@react-stately/datepicker": "^3.11.0",
- "@react-stately/disclosure": "^3.0.0",
- "@react-stately/dnd": "^3.5.0",
- "@react-stately/form": "^3.1.0",
- "@react-stately/list": "^3.11.1",
- "@react-stately/menu": "^3.9.0",
- "@react-stately/numberfield": "^3.9.8",
- "@react-stately/overlays": "^3.6.12",
- "@react-stately/radio": "^3.10.9",
- "@react-stately/searchfield": "^3.5.8",
- "@react-stately/select": "^3.6.9",
- "@react-stately/selection": "^3.18.0",
- "@react-stately/slider": "^3.6.0",
- "@react-stately/table": "^3.13.0",
- "@react-stately/tabs": "^3.7.0",
- "@react-stately/toggle": "^3.8.0",
- "@react-stately/tooltip": "^3.5.0",
- "@react-stately/tree": "^3.8.6",
- "@react-types/shared": "^3.26.0"
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/recast": {
- "version": "0.23.9",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
- "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
+ "node_modules/use-sync-external-store": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
+ "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ast-types": "^0.16.1",
- "esprima": "~4.0.0",
- "source-map": "~0.6.1",
- "tiny-invariant": "^1.3.3",
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">= 4"
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
}
},
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/utility-types": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz",
+ "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">= 4"
}
},
- "node_modules/redent/node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4.0"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"dev": true,
- "license": "MIT"
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
},
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=10.12.0"
}
},
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
}
},
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true,
"license": "MIT",
"engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
+ "node": ">= 0.8"
}
},
- "node_modules/rollup": {
- "version": "4.29.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.0.tgz",
- "integrity": "sha512-pdftUn12oB9Qlka+Vpyc39R28D4NsP9Sz6neepSrekofJmWzPD1sxcSO9hEOxFF8+7Kz3sHvwSkkRREI28M1/w==",
+ "node_modules/vite": {
+ "version": "5.4.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
+ "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.6"
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
},
"bin": {
- "rollup": "dist/bin/rollup"
+ "vite": "bin/vite.js"
},
"engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.29.0",
- "@rollup/rollup-android-arm64": "4.29.0",
- "@rollup/rollup-darwin-arm64": "4.29.0",
- "@rollup/rollup-darwin-x64": "4.29.0",
- "@rollup/rollup-freebsd-arm64": "4.29.0",
- "@rollup/rollup-freebsd-x64": "4.29.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.29.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.29.0",
- "@rollup/rollup-linux-arm64-gnu": "4.29.0",
- "@rollup/rollup-linux-arm64-musl": "4.29.0",
- "@rollup/rollup-linux-loongarch64-gnu": "4.29.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.29.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.29.0",
- "@rollup/rollup-linux-s390x-gnu": "4.29.0",
- "@rollup/rollup-linux-x64-gnu": "4.29.0",
- "@rollup/rollup-linux-x64-musl": "4.29.0",
- "@rollup/rollup-win32-arm64-msvc": "4.29.0",
- "@rollup/rollup-win32-ia32-msvc": "4.29.0",
- "@rollup/rollup-win32-x64-msvc": "4.29.0",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
},
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "less": {
+ "optional": true
},
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
}
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
}
},
- "node_modules/scheduler": {
- "version": "0.23.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
- "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0"
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
}
},
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
}
},
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
}
},
- "node_modules/storybook": {
- "version": "8.4.7",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.7.tgz",
- "integrity": "sha512-RP/nMJxiWyFc8EVMH5gp20ID032Wvk+Yr3lmKidoegto5Iy+2dVQnUoElZb2zpbVXNHWakGuAkfI0dY1Hfp/vw==",
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "@storybook/core": "8.4.7"
- },
- "bin": {
- "getstorybook": "bin/index.cjs",
- "sb": "bin/index.cjs",
- "storybook": "bin/index.cjs"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "prettier": "^2 || ^3"
- },
- "peerDependenciesMeta": {
- "prettier": {
- "optional": true
- }
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
"node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/strip-ansi/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
"node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
- "node_modules/strip-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
- "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.1"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
"node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=12"
}
},
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=12"
}
},
- "node_modules/tiny-invariant": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
- "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
},
- "node_modules/tinyrainbow": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
- "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">=14.0.0"
+ "node": ">=12"
}
},
- "node_modules/tinyspy": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
- "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
"engines": {
- "node": ">=14.0.0"
+ "node": ">=12"
}
},
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
"engines": {
- "node": ">=8.0"
+ "node": ">=12"
}
},
- "node_modules/ts-api-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
- "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "typescript": ">=4.2.0"
+ "node": ">=12"
}
},
- "node_modules/ts-dedent": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
- "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=6.10"
+ "node": ">=12"
}
},
- "node_modules/tsconfig-paths": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
- "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "json5": "^2.2.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- },
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=6"
+ "node": ">=12"
}
},
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/tween-functions": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz",
- "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==",
+ "node_modules/vite/node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true,
- "license": "BSD"
+ "license": "MIT"
},
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
+ "bin": {
+ "esbuild": "bin/esbuild"
},
"engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vite/node_modules/rollup": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz",
+ "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
"engines": {
- "node": ">=12.20"
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.29.1",
+ "@rollup/rollup-android-arm64": "4.29.1",
+ "@rollup/rollup-darwin-arm64": "4.29.1",
+ "@rollup/rollup-darwin-x64": "4.29.1",
+ "@rollup/rollup-freebsd-arm64": "4.29.1",
+ "@rollup/rollup-freebsd-x64": "4.29.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.29.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.29.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.29.1",
+ "@rollup/rollup-linux-arm64-musl": "4.29.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.29.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.29.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.29.1",
+ "@rollup/rollup-linux-x64-gnu": "4.29.1",
+ "@rollup/rollup-linux-x64-musl": "4.29.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.29.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.29.1",
+ "@rollup/rollup-win32-x64-msvc": "4.29.1",
+ "fsevents": "~2.3.2"
}
},
- "node_modules/typescript": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "node_modules/wait-on": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
+ "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "axios": "^1.6.1",
+ "joi": "^17.11.0",
+ "lodash": "^4.17.21",
+ "minimist": "^1.2.8",
+ "rxjs": "^7.8.1"
+ },
"bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
+ "wait-on": "bin/wait-on"
},
"engines": {
- "node": ">=14.17"
+ "node": ">=12.0.0"
}
},
- "node_modules/typescript-eslint": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.1.tgz",
- "integrity": "sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==",
+ "node_modules/wait-port": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz",
+ "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.18.1",
- "@typescript-eslint/parser": "8.18.1",
- "@typescript-eslint/utils": "8.18.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "chalk": "^2.4.2",
+ "commander": "^3.0.2",
+ "debug": "^4.1.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "bin": {
+ "wait-port": "bin/wait-port.js"
},
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/wait-port/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=4"
}
},
- "node_modules/unplugin": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz",
- "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==",
+ "node_modules/wait-port/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "acorn": "^8.14.0",
- "webpack-virtual-modules": "^0.6.2"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=4"
}
},
- "node_modules/update-browserslist-db": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
- "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "node_modules/wait-port/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
"license": "MIT",
"dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
+ "color-name": "1.1.3"
}
},
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "node_modules/wait-port/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
+ "license": "MIT"
},
- "node_modules/use-sync-external-store": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
- "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==",
+ "node_modules/wait-port/node_modules/commander": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
+ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wait-port/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/wait-port/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
"license": "MIT",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "node_modules/wait-port/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
"dev": true,
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
}
},
- "node_modules/vite": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.5.tgz",
- "integrity": "sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==",
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "esbuild": "0.24.0",
- "postcss": "^8.4.49",
- "rollup": "^4.23.0"
- },
- "bin": {
- "vite": "bin/vite.js"
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
},
"engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "jiti": ">=1.21.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "defaults": "^1.0.3"
}
},
+ "node_modules/weak-lru-cache": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz",
+ "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
"node_modules/webpack-virtual-modules": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
@@ -7363,6 +22118,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -7379,6 +22145,52 @@
"node": ">= 8"
}
},
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/which-typed-array": {
"version": "1.1.18",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
@@ -7410,6 +22222,119 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/ws": {
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
@@ -7432,6 +22357,33 @@
}
}
},
+ "node_modules/xml": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+ "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -7439,6 +22391,81 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 98897e0..7e73c25 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,13 @@
{
"name": "fds-design",
- "private": true,
+ "private": false,
+ "workspaces": [
+ "packages/@fds-design/*"
+ ],
+ "author": {
+ "name": "Craig Yu",
+ "email": "craig.yu@gov.bc.ca"
+ },
"version": "0.0.0",
"type": "module",
"scripts": {
@@ -17,15 +24,25 @@
"react-dom": "^18.3.1"
},
"devDependencies": {
- "@chromatic-com/storybook": "^3.2.3",
+ "chromatic": "^11.3.0",
"@eslint/js": "^9.17.0",
- "@storybook/addon-essentials": "^8.4.7",
- "@storybook/addon-interactions": "^8.4.7",
- "@storybook/addon-onboarding": "^8.4.7",
- "@storybook/blocks": "^8.4.7",
- "@storybook/react": "^8.4.7",
- "@storybook/react-vite": "^8.4.7",
- "@storybook/test": "^8.4.7",
+ "@storybook/addon-a11y": "^7.6.19",
+ "@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/react-vite": "^7.6.19",
"@types/react": "^18.3.17",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react-swc": "^3.5.0",
@@ -34,10 +51,13 @@
"eslint-plugin-react-refresh": "^0.4.16",
"eslint-plugin-storybook": "^0.11.1",
"globals": "^15.13.0",
- "storybook": "^8.4.7",
+ "storybook": "^7.6.19",
+ "storybook-dark-mode": "^4.0.2",
+ "storybook-react-parcel": "^0.0.1",
"typescript": "~5.6.2",
"typescript-eslint": "^8.18.1",
- "vite": "^6.0.3"
+ "vite": "^5.0.0",
+ "lerna": "^8.1.9"
},
"eslintConfig": {
"extends": [
diff --git a/packages/@fds-design/README.md b/packages/@fds-design/README.md
new file mode 100644
index 0000000..9b9c0ef
--- /dev/null
+++ b/packages/@fds-design/README.md
@@ -0,0 +1,5 @@
+# @react-spectrum
+
+⚠️ Under Construction ⚠️
+
+This folder is for packages in the `@react-spectrum` scope, which are React components implementing the Adobe Spectrum theme.
diff --git a/packages/@fds-design/accordion/README.md b/packages/@fds-design/accordion/README.md
new file mode 100644
index 0000000..02c874f
--- /dev/null
+++ b/packages/@fds-design/accordion/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/accordion
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/accordion/chromatic-fc/Accordion.stories.tsx b/packages/@fds-design/accordion/chromatic-fc/Accordion.stories.tsx
new file mode 100644
index 0000000..ebf823b
--- /dev/null
+++ b/packages/@fds-design/accordion/chromatic-fc/Accordion.stories.tsx
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Meta} from '@storybook/react';
+import {SpectrumAccordionProps} from '../src/Accordion';
+import {Template} from '../chromatic/Accordion.stories';
+
+const meta: Meta = {
+ title: 'Accordion'
+};
+
+export default meta;
+
+export const Default = {
+ render: Template,
+ args: {defaultExpandedKeys: ['shared']}
+};
diff --git a/packages/@fds-design/accordion/chromatic/Accordion.stories.tsx b/packages/@fds-design/accordion/chromatic/Accordion.stories.tsx
new file mode 100644
index 0000000..de5ed5c
--- /dev/null
+++ b/packages/@fds-design/accordion/chromatic/Accordion.stories.tsx
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Accordion, Disclosure, DisclosurePanel, DisclosureTitle} from '../';
+import {Meta} from '@storybook/react';
+import React from 'react';
+
+const meta: Meta = {
+ title: 'Accordion',
+ component: Disclosure,
+ excludeStories: ['Template']
+};
+
+export default meta;
+
+export const Template = (args) => (
+
+
+
+ Your files
+
+
+ files
+
+
+
+
+ Shared with you
+
+
+ shared
+
+
+
+
+ Last item
+
+
+ last
+
+
+
+);
+
+export const Default = {
+ render: Template
+};
+
+export const WithExpandedKeys = {
+ render: Template,
+ args: {defaultExpandedKeys: ['shared']}
+};
+
+export const WithDisabledDisclosure = {
+ render: (args) => (
+
+
+
+ Your files
+
+
+ files
+
+
+
+
+ Shared with you
+
+
+ shared
+
+
+
+
+ Last item
+
+
+ last
+
+
+ )
+};
+
+export const Disabled = {
+ render: Template,
+ args: {isDisabled: true}
+};
+
+export const Quiet = {
+ render: Template,
+ args: {isQuiet: true}
+};
diff --git a/packages/@fds-design/accordion/chromatic/Disclosure.stories.tsx b/packages/@fds-design/accordion/chromatic/Disclosure.stories.tsx
new file mode 100644
index 0000000..b8239e1
--- /dev/null
+++ b/packages/@fds-design/accordion/chromatic/Disclosure.stories.tsx
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2024 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Disclosure, DisclosurePanel, DisclosureTitle} from '../';
+import {Meta} from '@storybook/react';
+import React from 'react';
+
+const meta: Meta = {
+ title: 'Disclosure',
+ component: Disclosure,
+ excludeStories: ['Template']
+};
+
+export default meta;
+
+export const Template = (args) => (
+
+
+ Your files
+
+
+ files
+
+
+);
+
+export const Default = {
+ render: Template
+};
+
+export const Disabled = {
+ render: Template,
+ args: {isDisabled: true}
+};
+
+export const Quiet = {
+ render: Template,
+ args: {isQuiet: true}
+};
diff --git a/packages/@fds-design/accordion/docs/Accordion.mdx b/packages/@fds-design/accordion/docs/Accordion.mdx
new file mode 100644
index 0000000..86b6bff
--- /dev/null
+++ b/packages/@fds-design/accordion/docs/Accordion.mdx
@@ -0,0 +1,170 @@
+{/* Copyright 2024 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/accordion';
+import {HeaderInfo, PropTable, TypeLink, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/accordion/package.json';
+
+---
+category: Navigation
+keywords: [disclosure, accordion, collapse, expand]
+---
+
+```jsx import
+import {Accordion, Disclosure, DisclosureTitle, DisclosurePanel} from '@react-spectrum/accordion';
+```
+
+# Accordion
+
+{docs.exports.Accordion.description}
+
+
+
+## Example
+
+```tsx example
+
+
+ Personal Information
+
+ Personal information form here.
+
+
+
+ Billing Address
+
+ Billing address form here.
+
+
+
+```
+
+
+## Content
+
+Accordion accepts multiple [Disclosure](Disclosure.html) elements as children. Each disclosure accepts an `id` prop which is passed to the `onExpandedChange` handler to identify the expanded disclosure within the accordion. See the [Events](#events) section for more details about expansion.
+
+### Internationalization
+In order to internationalize an Accordion, all text content within the accordion should be localized.
+
+## Events
+
+Accordion accepts an `onExpandedChange` prop which is triggered when a disclosure is expanded or collapsed. The example below uses `onExpandedChange` to programmatically control disclosure expansion.
+
+```tsx example
+import {Key} from "@react-types/shared";
+
+function ControlledExpansion() {
+ let [expandedKeys, setExpandedKeys] = React.useState>(new Set(['personal']))
+
+ return (
+ <>
+
+
+ Personal Information
+
+ Personal information form here.
+
+
+
+ Billing Address
+
+ Billing address form here.
+
+
+
+ You have expanded: {expandedKeys}
+ >
+ )
+}
+```
+
+## Expanded
+
+By default, only one disclosure will be expanded at a time. To expand multiple disclosures, apply the `allowsMultipleExpanded` prop to Accordion.
+
+```tsx example
+
+
+ Personal Information
+
+ Personal information form here.
+
+
+
+ Billing Address
+
+ Billing address form here.
+
+
+
+```
+## Props
+
+### Accordion
+
+
+
+### Disclosure
+
+
+
+### Disclosure Title
+
+
+
+### Disclosure Panel
+
+
+
+## Visual Options
+
+### Disabled
+
+```tsx example
+
+
+ Personal Information
+
+ Personal information form here.
+
+
+
+ Billing Address
+
+ Billing address form here.
+
+
+
+```
+
+### Quiet
+
+```tsx example
+
+
+ Personal Information
+
+ Personal information form here.
+
+
+
+ Billing Address
+
+ Billing address form here.
+
+
+
+```
diff --git a/packages/@fds-design/accordion/docs/Disclosure.mdx b/packages/@fds-design/accordion/docs/Disclosure.mdx
new file mode 100644
index 0000000..b140dcd
--- /dev/null
+++ b/packages/@fds-design/accordion/docs/Disclosure.mdx
@@ -0,0 +1,126 @@
+{/* Copyright 2024 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/accordion';
+import {HeaderInfo, PropTable, TypeLink, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/accordion/package.json';
+
+---
+category: Navigation
+keywords: [disclosure, accordion, collapse, expand]
+---
+
+```jsx import
+import {Disclosure, DisclosureTitle, DisclosurePanel} from '@react-spectrum/accordion';
+```
+
+# Disclosure
+
+{docs.exports.Disclosure.description}
+
+
+
+## Example
+
+```tsx example
+
+ System Requirements
+
+ Details about system requirements here.
+
+
+```
+
+## Content
+
+Disclosure follows the [ARIA Disclosure pattern](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/) and consists of two children: `DisclosureTitle` and `DisclosurePanel`. The `DisclosureTitle` controls the expansion of the `DisclosurePanel` and the contents inside.
+
+Disclosure can be used as a standalone collapsible section of content. However, multiple discosures can be combined to form an [Accordion](Accordion.html).
+
+### Internationalization
+
+In order to internationalize a disclosure, all text content within the disclosure should be localized.
+
+## Events
+
+Disclosure accepts an `onExpandedChange` prop which is triggered when it is expanded or collapsed. The example below uses `onExpandedChange` to programmatically control disclosure expansion.
+
+```tsx example
+function ControlledExpansion() {
+ let [isExpanded, setIsExpanded] = React.useState(false);
+
+ return (
+ <>
+
+ System Requirements
+
+ Details about system requirements here.
+
+
+ {isExpanded ? 'The disclosure is expanded' : 'The disclosure is collapsed'}
+ >
+ )
+}
+```
+
+## Props
+
+### Disclosure
+
+
+
+### DisclosureTitle
+
+
+
+### DisclosurePanel
+
+
+
+
+## Visual Options
+
+### Disabled
+
+```tsx example
+
+ System Requirements
+
+ Details about system requirements here.
+
+
+```
+
+### Expanded
+
+```tsx example
+
+ System Requirements
+
+ Details about system requirements here.
+
+
+```
+
+### Quiet
+
+```tsx example
+
+ System Requirements
+
+ Details about system requirements here.
+
+
+```
diff --git a/packages/@fds-design/accordion/index.ts b/packages/@fds-design/accordion/index.ts
new file mode 100644
index 0000000..1210ae1
--- /dev/null
+++ b/packages/@fds-design/accordion/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/accordion/package.json b/packages/@fds-design/accordion/package.json
new file mode 100644
index 0000000..38e3aef
--- /dev/null
+++ b/packages/@fds-design/accordion/package.json
@@ -0,0 +1,59 @@
+{
+ "name": "@fds-design/accordion",
+ "version": "3.0.1",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/i18n": "^3.12.4",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@swc/helpers": "^0.5.0",
+ "react-aria-components": "^1.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/accordion/src/Accordion.tsx b/packages/@fds-design/accordion/src/Accordion.tsx
new file mode 100644
index 0000000..a109a44
--- /dev/null
+++ b/packages/@fds-design/accordion/src/Accordion.tsx
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {AriaLabelingProps, DOMProps, DOMRef, forwardRefType, StyleProps} from '@react-types/shared';
+import {Button, DisclosureGroup, DisclosureGroupProps, DisclosurePanelProps, DisclosureProps, Heading, Disclosure as RACDisclosure, DisclosurePanel as RACDisclosurePanel} from 'react-aria-components';
+import ChevronLeftMedium from '@spectrum-icons/ui/ChevronLeftMedium';
+import ChevronRightMedium from '@spectrum-icons/ui/ChevronRightMedium';
+import {classNames, useDOMRef, useStyleProps} from '../../utils';
+import React, {createContext, forwardRef} from 'react';
+import styles from '@adobe/spectrum-css-temp/components/accordion/vars.css';
+import {useLocale} from '@react-aria/i18n';
+import {useProviderProps} from '../../provider';
+
+export interface SpectrumAccordionProps extends Omit, StyleProps, DOMProps {
+ /** Whether the Accordion should be displayed with a quiet style. */
+ isQuiet?: boolean,
+ /** The disclosures within the accordion group. */
+ children: React.ReactNode
+}
+
+const InternalAccordionContext = createContext<{isQuiet: boolean} | null>(null);
+
+/** A group of disclosures that can be expanded and collapsed. */
+export const Accordion = /*#__PURE__*/(forwardRef as forwardRefType)(function Accordion(props: SpectrumAccordionProps, ref: DOMRef) {
+ props = useProviderProps(props);
+ let {styleProps} = useStyleProps(props);
+ let domRef = useDOMRef(ref);
+ return (
+
+
+ {props.children}
+
+
+ );
+});
+
+export interface SpectrumDisclosureProps extends Omit, AriaLabelingProps, StyleProps {
+ /** Whether the Disclosure should be displayed with a quiet style. */
+ isQuiet?: boolean,
+ /** The contents of the disclosure. The first child should be the header, and the second child should be the panel. */
+ children: React.ReactNode
+}
+
+/** A collapsible section of content composed of a heading that expands and collapses a panel. */
+export const Disclosure = /*#__PURE__*/(forwardRef as forwardRefType)(function Disclosure(props: SpectrumDisclosureProps, ref: DOMRef) {
+ props = useProviderProps(props);
+ let {styleProps} = useStyleProps(props);
+ let domRef = useDOMRef(ref);
+ let accordionContext = React.useContext(InternalAccordionContext)!;
+ return (
+ classNames(styles, 'spectrum-Accordion-item', {
+ 'spectrum-Accordion-item--quiet': accordionContext?.isQuiet ?? props.isQuiet,
+ 'is-expanded': isExpanded,
+ 'is-disabled': isDisabled,
+ 'in-accordion': accordionContext != null
+ }, styleProps.className)}>
+ {props.children}
+
+ );
+});
+
+export interface SpectrumDisclosurePanelProps extends Omit, DOMProps, AriaLabelingProps, StyleProps {
+ /** The contents of the accordion panel. */
+ children: React.ReactNode
+}
+
+/** The panel that contains the content of the disclosure. */
+export const DisclosurePanel = /*#__PURE__*/(forwardRef as forwardRefType)(function DisclosurePanel(props: SpectrumDisclosurePanelProps, ref: DOMRef) {
+ let {styleProps} = useStyleProps(props);
+ let domRef = useDOMRef(ref);
+ return (
+ , 'role'>}
+ className={classNames(styles, 'spectrum-Accordion-itemContent', styleProps.className)}
+ {...props}>
+ {props.children}
+
+ );
+});
+
+export interface SpectrumDisclosureTitleProps extends DOMProps, AriaLabelingProps, StyleProps {
+ /**
+ * The heading level of the disclosure header.
+ * @default 3
+ */
+ level?: number,
+ /** The contents of the disclosure header. */
+ children: React.ReactNode
+}
+
+/** The heading of the disclosure. */
+export const DisclosureTitle = /*#__PURE__*/(forwardRef as forwardRefType)(function DisclosureTitle(props: SpectrumDisclosureTitleProps, ref: DOMRef) {
+ let {styleProps} = useStyleProps(props);
+ let {level = 3} = props;
+ let {direction} = useLocale();
+ let domRef = useDOMRef(ref);
+ return (
+
+ classNames(styles, 'spectrum-Accordion-itemHeader', {
+ 'is-hovered': isHovered,
+ 'is-pressed': isPressed,
+ 'focus-ring': isFocusVisible
+ })}>
+ {direction === 'ltr' ? (
+
+ ) : (
+
+ )}
+ {props.children}
+
+
+ );
+});
diff --git a/packages/@fds-design/accordion/src/index.ts b/packages/@fds-design/accordion/src/index.ts
new file mode 100644
index 0000000..95c4ba7
--- /dev/null
+++ b/packages/@fds-design/accordion/src/index.ts
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2020 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.
+ */
+///
+export {Disclosure, Accordion, DisclosureTitle, DisclosurePanel} from './Accordion';
+export type {SpectrumAccordionProps, SpectrumDisclosureProps, SpectrumDisclosurePanelProps, SpectrumDisclosureTitleProps} from './Accordion';
diff --git a/packages/@fds-design/accordion/stories/Accordion.stories.tsx b/packages/@fds-design/accordion/stories/Accordion.stories.tsx
new file mode 100644
index 0000000..14f9c49
--- /dev/null
+++ b/packages/@fds-design/accordion/stories/Accordion.stories.tsx
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Accordion, Disclosure, DisclosurePanel, DisclosureTitle, SpectrumAccordionProps} from '../src';
+import {Meta, StoryObj} from '@storybook/react';
+import React from 'react';
+
+const meta: Meta = {
+ title: 'Accordion',
+ component: Accordion,
+ argTypes: {
+ isDisabled: {
+ control: 'boolean'
+ },
+ isQuiet: {
+ control: 'boolean'
+ }
+ }
+};
+
+export default meta;
+type AccordionStory = StoryObj;
+
+export const Default: AccordionStory = {
+ render: (args) => (
+
+
+
+ Files
+
+
+ Files content
+
+
+
+
+ People
+
+
+ People content
+
+
+
+ )
+};
+
+export const WithExpandedKeys: AccordionStory = {
+ ...Default,
+ args: {defaultExpandedKeys: ['files']}
+};
+
+export const WithDisabledDisclosure: AccordionStory = {
+ render: (args) => (
+
+
+
+ Your files
+
+
+ files
+
+
+
+
+ Shared with you
+
+
+ shared
+
+
+
+
+ Last item
+
+
+ last
+
+
+
+ )
+};
diff --git a/packages/@fds-design/accordion/stories/Disclosure.stories.tsx b/packages/@fds-design/accordion/stories/Disclosure.stories.tsx
new file mode 100644
index 0000000..605ad05
--- /dev/null
+++ b/packages/@fds-design/accordion/stories/Disclosure.stories.tsx
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2024 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Disclosure, DisclosurePanel, DisclosureTitle, SpectrumDisclosureProps} from '../src';
+import {Meta, StoryObj} from '@storybook/react';
+import React from 'react';
+
+const meta: Meta = {
+ title: 'Disclosure',
+ component: Disclosure,
+ argTypes: {
+ isDisabled: {
+ control: 'boolean'
+ },
+ isQuiet: {
+ control: 'boolean'
+ }
+ }
+};
+
+export default meta;
+type DisclosureStory = StoryObj;
+
+export const Default: DisclosureStory = {
+ render: (args) => (
+
+
+ Files
+
+
+ Files content
+
+
+ )
+};
diff --git a/packages/@fds-design/accordion/test/Accordion.ssr.test.js b/packages/@fds-design/accordion/test/Accordion.ssr.test.js
new file mode 100644
index 0000000..295457e
--- /dev/null
+++ b/packages/@fds-design/accordion/test/Accordion.ssr.test.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2024 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('Accordion SSR', function () {
+ it('should render without errors', async function () {
+ await testSSR(__filename, `
+ import {Accordion, Disclosure, DisclosureTitle, DisclosurePanel} from '../';
+
+
+
+ Files
+
+
+ Files content
+
+
+
+
+ People
+
+
+ People content
+
+
+
+ `);
+ });
+});
diff --git a/packages/@fds-design/accordion/test/Accordion.test.js b/packages/@fds-design/accordion/test/Accordion.test.js
new file mode 100644
index 0000000..7f3721c
--- /dev/null
+++ b/packages/@fds-design/accordion/test/Accordion.test.js
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Accordion, Disclosure, DisclosurePanel, DisclosureTitle} from '../src';
+import {act, pointerMap, render, within} from '@react-spectrum/test-utils-internal';
+import {Provider} from '@react-spectrum/provider';
+import React from 'react';
+import {theme} from '@react-spectrum/theme-default';
+import userEvent from '@testing-library/user-event';
+
+let items = [
+ {id: 'one', title: 'one title', children: 'one children'},
+ {id: 'two', title: 'two title', children: 'two children'},
+ {id: 'three', title: 'three title', children: }
+];
+
+function renderComponent(props) {
+ return render(
+
+
+ {items.map(item => (
+
+ {item.title}
+ {item.children}
+
+ ))}
+
+
+ );
+}
+
+describe('Accordion', function () {
+ let user;
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ });
+
+ it('renders properly', function () {
+ let tree = renderComponent();
+ let accordionItems = tree.getAllByRole('heading');
+ expect(items.length).toBe(3);
+
+ for (let item of accordionItems) {
+ let button = within(item).getByRole('button');
+ expect(button).toHaveAttribute('aria-expanded');
+ let isExpanded = button.getAttribute('aria-expanded') === 'true';
+ if (isExpanded) {
+ expect(button).toHaveAttribute('aria-controls');
+ let region = document.getElementById(button.getAttribute('aria-controls'));
+ expect(region).toBeTruthy();
+ expect(region).toHaveAttribute('aria-labelledby', button.id);
+ expect(region).toHaveAttribute('role', 'region');
+ expect(region).toHaveTextContent(items[0].children);
+ }
+ }
+ });
+
+ it('toggle accordion on mouse click', async function () {
+ let onExpandedChange = jest.fn();
+ let tree = renderComponent({onExpandedChange});
+ let buttons = tree.getAllByRole('button');
+ let selectedItem = buttons[0];
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'false');
+ await user.click(selectedItem);
+ expect(onExpandedChange).toHaveBeenCalledTimes(1);
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'true');
+ await user.click(selectedItem);
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'false');
+ expect(onExpandedChange).toHaveBeenCalledTimes(2);
+ });
+
+ it('allows users to open and close disclosure with enter / space key', async function () {
+ let onExpandedChange = jest.fn();
+ let tree = renderComponent({onExpandedChange});
+ let buttons = tree.getAllByRole('button');
+ let selectedItem = buttons[0];
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'false');
+ act(() => {selectedItem.focus();});
+ expect(document.activeElement).toBe(selectedItem);
+
+ await user.keyboard('{Enter}');
+ expect(onExpandedChange).toHaveBeenCalledTimes(1);
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'true');
+
+ await user.keyboard('{Enter}');
+ expect(onExpandedChange).toHaveBeenCalledTimes(2);
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'false');
+ });
+
+ it('allows users to navigate accordion headers through the tab key', async function () {
+ let tree = renderComponent();
+ let buttons = tree.getAllByRole('button');
+ let [firstItem, secondItem, thirdItem] = buttons;
+ act(() => {firstItem.focus();});
+ expect(document.activeElement).toBe(firstItem);
+ await user.tab();
+ expect(document.activeElement).toBe(secondItem);
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(firstItem);
+ await user.tab();
+ expect(document.activeElement).toBe(secondItem);
+ await user.tab();
+ expect(document.activeElement).toBe(thirdItem);
+ await user.tab();
+ expect(document.activeElement).not.toBe(firstItem);
+ expect(document.activeElement).not.toBe(secondItem);
+ expect(document.activeElement).not.toBe(thirdItem);
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(thirdItem);
+ });
+
+ it('allows users to type inside disclosures', async function () {
+ let tree = renderComponent();
+ let buttons = tree.getAllByRole('button');
+ let itemWithInputHeader = buttons[2];
+ act(() => itemWithInputHeader.click());
+
+ let [input] = tree.getAllByRole('textbox');
+ act(() => input.focus());
+
+ await user.type(input, 'Type example');
+ expect(input.value).toEqual('Type example');
+ });
+
+ it('supports defaultExpandedKeys', function () {
+ let tree = renderComponent({defaultExpandedKeys: ['one']});
+ let buttons = tree.getAllByRole('button');
+ let selectedItem = buttons[0];
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'true');
+ });
+
+ it('supports controlled expandedKeys', function () {
+ let onExpandedChange = jest.fn();
+ let tree = renderComponent({expandedKeys: ['one'], onExpandedChange});
+ let buttons = tree.getAllByRole('button');
+ let selectedItem = buttons[0];
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'true');
+ act(() => {selectedItem.click();});
+ expect(onExpandedChange).toHaveBeenCalledTimes(1);
+ expect(selectedItem).toHaveAttribute('aria-expanded', 'true');
+ });
+
+ it('supports isDisabled on Accordion', function () {
+ let tree = renderComponent({isDisabled: true});
+ let buttons = tree.getAllByRole('button');
+ for (let item of buttons) {
+ expect(item).toHaveAttribute('disabled');
+ }
+ });
+
+ it('supports isDisabled on individual Disclosures', function () {
+ let tree = render(
+
+
+ {items.map(item => (
+
+ {item.title}
+ {item.children}
+
+ ))}
+
+
+ );
+ let buttons = tree.getAllByRole('button');
+ for (let item of buttons) {
+ if (item.textContent === 'two title') {
+ expect(item).toHaveAttribute('disabled');
+ } else {
+ expect(item).not.toHaveAttribute('disabled');
+ }
+ }
+ });
+});
diff --git a/packages/@fds-design/actionbar/README.md b/packages/@fds-design/actionbar/README.md
new file mode 100644
index 0000000..2065798
--- /dev/null
+++ b/packages/@fds-design/actionbar/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/actionbar
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/actionbar/chromatic-fc/ActionBar.stories.tsx b/packages/@fds-design/actionbar/chromatic-fc/ActionBar.stories.tsx
new file mode 100644
index 0000000..6828568
--- /dev/null
+++ b/packages/@fds-design/actionbar/chromatic-fc/ActionBar.stories.tsx
@@ -0,0 +1,32 @@
+
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Default, LargeWidth} from '../chromatic/ActionBar.stories';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+export default {
+ title: 'ActionBar'
+};
+
+export const All = () => (
+
+ Default
+
+ Large width
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/actionbar/chromatic/ActionBar.stories.tsx b/packages/@fds-design/actionbar/chromatic/ActionBar.stories.tsx
new file mode 100644
index 0000000..7861873
--- /dev/null
+++ b/packages/@fds-design/actionbar/chromatic/ActionBar.stories.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Example, Example2} from '../stories/Example';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+export default {
+ title: 'ActionBar'
+};
+
+export const Default = () => (
+
+
+
+
+);
+
+Default.story = {
+ name: 'default'
+};
+
+export const IsEmphasized = () => ;
+
+IsEmphasized.story = {
+ name: 'isEmphasized'
+};
+
+export const LargeWidth = () => (
+
+);
+
+LargeWidth.story = {
+ name: 'large width'
+};
+
+export const CollapsedIcons = () => (
+
+);
+
+CollapsedIcons.story = {
+ name: 'collapsed icons'
+};
+
+export const CollapseRounding = () => (
+
+);
diff --git a/packages/@fds-design/actionbar/docs/ActionBar.mdx b/packages/@fds-design/actionbar/docs/ActionBar.mdx
new file mode 100644
index 0000000..c0f2be3
--- /dev/null
+++ b/packages/@fds-design/actionbar/docs/ActionBar.mdx
@@ -0,0 +1,294 @@
+{/* Copyright 2022 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import Anatomy from './ActionBarAnatomy.svg';
+import docs from 'docs:@react-spectrum/actionbar';
+import {HeaderInfo, PropTable, PageDescription, TypeLink} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/actionbar/package.json';
+
+```jsx import
+import {ActionBar, ActionBarContainer, Item} from '@react-spectrum/actionbar';
+import {ListView} from '@react-spectrum/list';
+import Edit from '@spectrum-icons/workflow/Edit';
+import Copy from '@spectrum-icons/workflow/Copy';
+import Delete from '@spectrum-icons/workflow/Delete';
+import {Flex} from '@react-spectrum/layout';
+import {Text} from '@react-spectrum/text';
+import {TableView, TableHeader, TableBody, Row, Column, Cell} from '@react-spectrum/table';
+```
+
+---
+category: Collections
+keywords: [actionbar, selection, actions, collections, toolbar]
+---
+
+# ActionBar
+
+{docs.exports.ActionBar.description}
+
+
+
+## Example
+```tsx example
+import type {Selection} from '@adobe/react-spectrum';
+
+function Example() {
+ let [selectedKeys, setSelectedKeys] = React.useState(new Set(['photoshop']));
+
+ return (
+
+
+ - Adobe Photoshop
+ - Adobe Illustrator
+ - Adobe XD
+
+ alert(`Performing ${key} action...`)}
+ onClearSelection={() => setSelectedKeys(new Set())}>
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+
+
+ );
+}
+
+
+```
+
+## Content
+
+
+An ActionBar is a companion component intended to facilitate bulk actions on selected items within a collection component. It consists of an ActionGroup, a clear button, and a count of selected items. It accepts a list of
+elements as children, each with a `key` prop. Alternatively, a function that returns `Item` elements is also supported as seen below. See the [collection components](../react-stately/collections.html)
+docs for more details about this API. These `Item` elements are used to populate the buttons in the ActionBar, and follows the [ActionGroup content guidelines](./ActionGroup.html#content) for customization and labeling.
+
+```tsx example
+import type {Selection} from '@adobe/react-spectrum';
+
+function Example() {
+ let barItems = [
+ {key: 'edit', label: 'Edit'},
+ {key: 'copy', label: 'Copy'},
+ {key: 'delete', label: 'Delete'}
+ ];
+
+ let [selectedKeys, setSelectedKeys] = React.useState(new Set(['photoshop']));
+
+ return (
+
+
+ - Adobe Photoshop
+ - Adobe Illustrator
+ - Adobe XD
+
+ alert(`Performing ${key} action...`)}
+ onClearSelection={() => setSelectedKeys(new Set())}
+ isEmphasized>
+ {item => (
+ -
+ {item.label}
+
+ )}
+
+
+ );
+}
+
+
+```
+
+### Accessibility
+The contents of the ActionBar should follow the same accessibility guidelines as ActionGroup's items, see the [ActionGroup docs](./ActionGroup.html#accessibility) for more details.
+
+### Internationalization
+To internationalize an ActionBar, the content provided to all child items should be localized. A localized string for the selection count and clear button `aria-label` will be provided
+automatically. For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the ActionBar is automatically flipped.
+
+## Events
+Use the `onClearSelection` prop as a callback to handle when the clear button in the ActionBar is pressed. Additionally, the `onAction` prop can be used as a callback for when the user
+presses any of the buttons in the ActionBar. The `key` from the pressed `- ` will be passed to the callback.
+
+The following example clears row selection within the TableView when the clear button is pressed and alerts the user as to what
+action is being taken on the selected rows when the buttons are pressed.
+
+```tsx example
+import type {Selection} from '@adobe/react-spectrum';
+
+function ActionBarActions(props) {
+ let [selectedKeys, setSelectedKeys] = React.useState
(new Set([2]));
+ let rows = [
+ {id: 1, name: 'Charizard', type: 'Fire, Flying', level: '67'},
+ {id: 2, name: 'Blastoise', type: 'Water', level: '56'},
+ {id: 3, name: 'Venusaur', type: 'Grass, Poison', level: '83'},
+ {id: 4, name: 'Pikachu', type: 'Electric', level: '100'}
+ ];
+
+ return (
+
+
+
+ Name
+ Type
+ Level
+
+
+ {item => (
+
+ {columnKey => {item[columnKey]} | }
+
+ )}
+
+
+ {
+ setSelectedKeys(new Set());
+ }}
+ onAction={key => alert(`Performing ${key} action...`)}
+ /*- end highlight -*/>
+ -
+
+ Edit
+
+ -
+
+ Delete
+
+
+
+ );
+}
+```
+
+## Props
+
+### ActionBarContainer props
+
+
+### ActionBar props
+
+
+## Visual options
+
+### isEmphasized
+`isEmphasized` should be applied to the ActionBar when it should call attention, such as when floating in a TableView. It should be omitted if the ActionBar should blend in
+with the rest of the UI, directing a user’s focus to elsewhere in a view.
+
+```tsx example
+import type {Selection} from '@adobe/react-spectrum';
+
+function Example({isEmphasized}: {isEmphasized?: boolean}) {
+ let [selectedKeys, setSelectedKeys] = React.useState(new Set(['photoshop']));
+
+ return (
+
+
+ - Adobe Photoshop
+ - Adobe Illustrator
+ - Adobe XD
+
+ alert(`Performing ${key} action...`)}
+ onClearSelection={() => setSelectedKeys(new Set())}>
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+
+
+ );
+}
+
+
+
+
+
+```
+
+### isDisabled
+To disable individual items, a list of disabledKeys can be provided.
+
+```tsx example
+import type {Selection} from '@adobe/react-spectrum';
+
+function Example() {
+ let [selectedKeys, setSelectedKeys] = React.useState(new Set(['photoshop']));
+
+ return (
+
+
+ - Adobe Photoshop
+ - Adobe Illustrator
+ - Adobe XD
+
+ alert(`Performing ${key} action...`)}
+ onClearSelection={() => setSelectedKeys(new Set())}>
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+
+
+ );
+}
+
+
+```
\ No newline at end of file
diff --git a/packages/@fds-design/actionbar/docs/ActionBarAnatomy.svg b/packages/@fds-design/actionbar/docs/ActionBarAnatomy.svg
new file mode 100644
index 0000000..bf4a51a
--- /dev/null
+++ b/packages/@fds-design/actionbar/docs/ActionBarAnatomy.svg
@@ -0,0 +1,100 @@
+
+ ActionBar anatomy diagram
+ Shows an ActionBar component with labels pointing to its parts, including the clear button, selected item count, and action button group.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 224 selected
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Delete
+
+
+
+
+
+
+
+
+ Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copy
+
+
+ Action group (quiet)
+ Item counter
+
+
+
+
+
+
+
+
+
+
+ Close button
+
+
+
diff --git a/packages/@fds-design/actionbar/index.ts b/packages/@fds-design/actionbar/index.ts
new file mode 100644
index 0000000..1210ae1
--- /dev/null
+++ b/packages/@fds-design/actionbar/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/actionbar/intl/ar-AE.json b/packages/@fds-design/actionbar/intl/ar-AE.json
new file mode 100644
index 0000000..be9c757
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/ar-AE.json
@@ -0,0 +1,7 @@
+{
+ "actions": "الإجراءات",
+ "actionsAvailable": "الإجراءات المتاحة.",
+ "clearSelection": "إزالة التحديد",
+ "selected": "{count, plural, =0 {غير محدد} other {# محدد}}",
+ "selectedAll": "تم تحديد الكل"
+}
diff --git a/packages/@fds-design/actionbar/intl/bg-BG.json b/packages/@fds-design/actionbar/intl/bg-BG.json
new file mode 100644
index 0000000..b9264c2
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/bg-BG.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Действия",
+ "actionsAvailable": "Налични действия.",
+ "clearSelection": "Изчистване на избора",
+ "selected": "{count, plural, =0 {Няма избрани} one {# избран} other {# избрани}}",
+ "selectedAll": "Всички избрани"
+}
diff --git a/packages/@fds-design/actionbar/intl/cs-CZ.json b/packages/@fds-design/actionbar/intl/cs-CZ.json
new file mode 100644
index 0000000..83026fd
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/cs-CZ.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Akce",
+ "actionsAvailable": "Dostupné akce.",
+ "clearSelection": "Vymazat výběr",
+ "selected": "Vybráno: { count }",
+ "selectedAll": "Vybráno vše"
+}
diff --git a/packages/@fds-design/actionbar/intl/da-DK.json b/packages/@fds-design/actionbar/intl/da-DK.json
new file mode 100644
index 0000000..862484b
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/da-DK.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Handlinger",
+ "actionsAvailable": "Tilgængelige handlinger.",
+ "clearSelection": "Ryd markering",
+ "selected": "{count, plural, =0 {Ingen valgt} other {# valgt}}",
+ "selectedAll": "Alle valgt"
+}
diff --git a/packages/@fds-design/actionbar/intl/de-DE.json b/packages/@fds-design/actionbar/intl/de-DE.json
new file mode 100644
index 0000000..aaff9c9
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/de-DE.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Aktionen",
+ "actionsAvailable": "Aktionen verfügbar.",
+ "clearSelection": "Auswahl löschen",
+ "selected": "{count, plural, =0 {Nichts ausgewählt} one {# ausgewählt} other {# ausgewählt}}",
+ "selectedAll": "Alles ausgewählt"
+}
diff --git a/packages/@fds-design/actionbar/intl/el-GR.json b/packages/@fds-design/actionbar/intl/el-GR.json
new file mode 100644
index 0000000..e69ed7d
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/el-GR.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Ενέργειες",
+ "actionsAvailable": "Υπάρχουν διαθέσιμες ενέργειες.",
+ "clearSelection": "Εκκαθάριση επιλογής",
+ "selected": "{count, plural, =0 {Δεν επιλέχθηκε κανένα} one {# επιλεγμένο} other {# επιλεγμένα}}",
+ "selectedAll": "Επιλέχθηκαν όλα"
+}
diff --git a/packages/@fds-design/actionbar/intl/en-US.json b/packages/@fds-design/actionbar/intl/en-US.json
new file mode 100644
index 0000000..9f9288f
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/en-US.json
@@ -0,0 +1,7 @@
+{
+ "clearSelection": "Clear selection",
+ "selected": "{count, plural, =0 {None selected} other {# selected}}",
+ "selectedAll": "All selected",
+ "actions": "Actions",
+ "actionsAvailable": "Actions available."
+}
\ No newline at end of file
diff --git a/packages/@fds-design/actionbar/intl/es-ES.json b/packages/@fds-design/actionbar/intl/es-ES.json
new file mode 100644
index 0000000..a915681
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/es-ES.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Acciones",
+ "actionsAvailable": "Acciones disponibles.",
+ "clearSelection": "Borrar selección",
+ "selected": "{count, plural, =0 {Nada seleccionado} one {# seleccionado} other {# seleccionados}}",
+ "selectedAll": "Todo seleccionado"
+}
diff --git a/packages/@fds-design/actionbar/intl/et-EE.json b/packages/@fds-design/actionbar/intl/et-EE.json
new file mode 100644
index 0000000..a8c2597
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/et-EE.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Toimingud",
+ "actionsAvailable": "Toimingud saadaval.",
+ "clearSelection": "Puhasta valik",
+ "selected": "{count, plural, =0 {Pole valitud} other {# valitud}}",
+ "selectedAll": "Kõik valitud"
+}
diff --git a/packages/@fds-design/actionbar/intl/fi-FI.json b/packages/@fds-design/actionbar/intl/fi-FI.json
new file mode 100644
index 0000000..24dab06
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/fi-FI.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Toiminnot",
+ "actionsAvailable": "Toiminnot käytettävissä.",
+ "clearSelection": "Poista valinta",
+ "selected": "{count, plural, =0 {Ei mitään valittu} other {# valittu}}",
+ "selectedAll": "Kaikki valittu"
+}
diff --git a/packages/@fds-design/actionbar/intl/fr-FR.json b/packages/@fds-design/actionbar/intl/fr-FR.json
new file mode 100644
index 0000000..07ee37a
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/fr-FR.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Actions",
+ "actionsAvailable": "Actions disponibles.",
+ "clearSelection": "Supprimer la sélection",
+ "selected": "{count, plural, =0 {Aucun élément sélectionné} one {# sélectionné} other {# sélectionnés}}",
+ "selectedAll": "Toute la sélection"
+}
diff --git a/packages/@fds-design/actionbar/intl/he-IL.json b/packages/@fds-design/actionbar/intl/he-IL.json
new file mode 100644
index 0000000..254e7bc
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/he-IL.json
@@ -0,0 +1,7 @@
+{
+ "actions": "פעולות",
+ "actionsAvailable": "פעולות זמינות.",
+ "clearSelection": "נקה בחירה",
+ "selected": "{count, plural, =0 {לא בוצעה בחירה} one { # בחר} other {# נבחרו}}\",",
+ "selectedAll": "כל הפריטים שנבחרו"
+}
diff --git a/packages/@fds-design/actionbar/intl/hr-HR.json b/packages/@fds-design/actionbar/intl/hr-HR.json
new file mode 100644
index 0000000..f92e63f
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/hr-HR.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Radnje",
+ "actionsAvailable": "Dostupne radnje.",
+ "clearSelection": "Poništi odabir",
+ "selected": "Odabrano: { count }",
+ "selectedAll": "Sve je odabrano"
+}
diff --git a/packages/@fds-design/actionbar/intl/hu-HU.json b/packages/@fds-design/actionbar/intl/hu-HU.json
new file mode 100644
index 0000000..390354f
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/hu-HU.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Műveletek",
+ "actionsAvailable": "Műveletek állnak rendelkezésre.",
+ "clearSelection": "Kijelölés törlése",
+ "selected": "{count, plural, =0 {Egy sincs kijelölve} other {# kijelölve}}",
+ "selectedAll": "Mind kijelölve"
+}
diff --git a/packages/@fds-design/actionbar/intl/it-IT.json b/packages/@fds-design/actionbar/intl/it-IT.json
new file mode 100644
index 0000000..10126f1
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/it-IT.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Azioni",
+ "actionsAvailable": "Azioni disponibili.",
+ "clearSelection": "Annulla selezione",
+ "selected": "{count, plural, =0 {Nessuno selezionato} one {# selezionato} other {# selezionati}}",
+ "selectedAll": "Tutti selezionati"
+}
diff --git a/packages/@fds-design/actionbar/intl/ja-JP.json b/packages/@fds-design/actionbar/intl/ja-JP.json
new file mode 100644
index 0000000..1e8514e
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/ja-JP.json
@@ -0,0 +1,7 @@
+{
+ "actions": "アクション",
+ "actionsAvailable": "アクションを利用できます。",
+ "clearSelection": "選択をクリア",
+ "selected": "{count, plural, =0 {選択されていません} other {# 個を選択しました}}",
+ "selectedAll": "すべてを選択"
+}
diff --git a/packages/@fds-design/actionbar/intl/ko-KR.json b/packages/@fds-design/actionbar/intl/ko-KR.json
new file mode 100644
index 0000000..6136957
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/ko-KR.json
@@ -0,0 +1,7 @@
+{
+ "actions": "액션",
+ "actionsAvailable": "사용 가능한 액션",
+ "clearSelection": "선택 항목 지우기",
+ "selected": "{count, plural, =0 {선택된 항목 없음} other {#개 선택됨}}",
+ "selectedAll": "모두 선택됨"
+}
diff --git a/packages/@fds-design/actionbar/intl/lt-LT.json b/packages/@fds-design/actionbar/intl/lt-LT.json
new file mode 100644
index 0000000..2bce47d
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/lt-LT.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Veiksmai",
+ "actionsAvailable": "Galimi veiksmai.",
+ "clearSelection": "Išvalyti pasirinkimą",
+ "selected": "Pasirinkta: {count}",
+ "selectedAll": "Pasirinkta viskas"
+}
diff --git a/packages/@fds-design/actionbar/intl/lv-LV.json b/packages/@fds-design/actionbar/intl/lv-LV.json
new file mode 100644
index 0000000..becef93
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/lv-LV.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Darbības",
+ "actionsAvailable": "Pieejamas darbības.",
+ "clearSelection": "Notīrīt atlasi",
+ "selected": "{count, plural, =0 {Nav atlasīts nekas} other {Atlasīts(-i): #}}",
+ "selectedAll": "Atlasīts viss"
+}
diff --git a/packages/@fds-design/actionbar/intl/nb-NO.json b/packages/@fds-design/actionbar/intl/nb-NO.json
new file mode 100644
index 0000000..0fc4f9c
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/nb-NO.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Handlinger",
+ "actionsAvailable": "Tilgjengelige handlinger.",
+ "clearSelection": "Tøm utvalg",
+ "selected": "Valde element: {count}",
+ "selectedAll": "Alle er valgt"
+}
diff --git a/packages/@fds-design/actionbar/intl/nl-NL.json b/packages/@fds-design/actionbar/intl/nl-NL.json
new file mode 100644
index 0000000..68ee0e0
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/nl-NL.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Acties",
+ "actionsAvailable": "Acties beschikbaar.",
+ "clearSelection": "Selectie wissen",
+ "selected": "{count, plural, =0 {Niets geselecteerd} other {# geselecteerd}}",
+ "selectedAll": "Alles geselecteerd"
+}
diff --git a/packages/@fds-design/actionbar/intl/pl-PL.json b/packages/@fds-design/actionbar/intl/pl-PL.json
new file mode 100644
index 0000000..a51a7c1
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/pl-PL.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Działania",
+ "actionsAvailable": "Dostępne działania.",
+ "clearSelection": "Wyczyść zaznaczenie",
+ "selected": "Zaznaczono: {count}",
+ "selectedAll": "Wszystkie zaznaczone"
+}
diff --git a/packages/@fds-design/actionbar/intl/pt-BR.json b/packages/@fds-design/actionbar/intl/pt-BR.json
new file mode 100644
index 0000000..e0d4ffc
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/pt-BR.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Ações",
+ "actionsAvailable": "Ações disponíveis.",
+ "clearSelection": "Limpar seleção",
+ "selected": "{count, plural, =0 {Nenhum selecionado} one {# selecionado} other {# selecionados}}",
+ "selectedAll": "Todos selecionados"
+}
diff --git a/packages/@fds-design/actionbar/intl/pt-PT.json b/packages/@fds-design/actionbar/intl/pt-PT.json
new file mode 100644
index 0000000..faf2ef0
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/pt-PT.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Ações",
+ "actionsAvailable": "Ações disponíveis.",
+ "clearSelection": "Limpar seleção",
+ "selected": "{count, plural, =0 {Nenhum selecionado} one {# selecionado} other {# selecionados}}",
+ "selectedAll": "Tudo selecionado"
+}
diff --git a/packages/@fds-design/actionbar/intl/ro-RO.json b/packages/@fds-design/actionbar/intl/ro-RO.json
new file mode 100644
index 0000000..b85f3a3
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/ro-RO.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Acțiuni",
+ "actionsAvailable": "Acțiuni disponibile.",
+ "clearSelection": "Goliți selecția",
+ "selected": "{count, plural, =0 {Niciunul selectat} one { # selectat} other {# selectate}}",
+ "selectedAll": "Toate selectate"
+}
diff --git a/packages/@fds-design/actionbar/intl/ru-RU.json b/packages/@fds-design/actionbar/intl/ru-RU.json
new file mode 100644
index 0000000..c4e3f3f
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/ru-RU.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Действия",
+ "actionsAvailable": "Возможно выполнение действий.",
+ "clearSelection": "Очистить выбор",
+ "selected": "Выбрано: {count}",
+ "selectedAll": "Выбрано все"
+}
diff --git a/packages/@fds-design/actionbar/intl/sk-SK.json b/packages/@fds-design/actionbar/intl/sk-SK.json
new file mode 100644
index 0000000..d1bc4e1
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/sk-SK.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Akcie",
+ "actionsAvailable": "Dostupné akcie.",
+ "clearSelection": "Vymazať výber",
+ "selected": "Vybrané položky: {count}",
+ "selectedAll": "Všetky vybraté položky"
+}
diff --git a/packages/@fds-design/actionbar/intl/sl-SI.json b/packages/@fds-design/actionbar/intl/sl-SI.json
new file mode 100644
index 0000000..43ffe85
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/sl-SI.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Dejanja",
+ "actionsAvailable": "Na voljo so dejanja.",
+ "clearSelection": "Počisti izbor",
+ "selected": "Izbrano: {count}",
+ "selectedAll": "Vsi izbrani"
+}
diff --git a/packages/@fds-design/actionbar/intl/sr-SP.json b/packages/@fds-design/actionbar/intl/sr-SP.json
new file mode 100644
index 0000000..41ea471
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/sr-SP.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Radnje",
+ "actionsAvailable": "Dostupne su radnje.",
+ "clearSelection": "Poništi izbor",
+ "selected": "Izabrano: {count}",
+ "selectedAll": "Sve je izabrano"
+}
diff --git a/packages/@fds-design/actionbar/intl/sv-SE.json b/packages/@fds-design/actionbar/intl/sv-SE.json
new file mode 100644
index 0000000..de22fe4
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/sv-SE.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Åtgärder",
+ "actionsAvailable": "Åtgärder finns.",
+ "clearSelection": "Rensa markering",
+ "selected": "{count, plural, =0 {Inga valda} one {# vald} other {# valda}}",
+ "selectedAll": "Alla markerade"
+}
diff --git a/packages/@fds-design/actionbar/intl/tr-TR.json b/packages/@fds-design/actionbar/intl/tr-TR.json
new file mode 100644
index 0000000..8243b76
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/tr-TR.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Eylemler",
+ "actionsAvailable": "Eylemler mevcut.",
+ "clearSelection": "Seçimi temizle",
+ "selected": "{count, plural, =0 {Hiçbiri seçilmedi} other {# seçildi}}",
+ "selectedAll": "Tümü seçildi"
+}
diff --git a/packages/@fds-design/actionbar/intl/uk-UA.json b/packages/@fds-design/actionbar/intl/uk-UA.json
new file mode 100644
index 0000000..9792394
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/uk-UA.json
@@ -0,0 +1,7 @@
+{
+ "actions": "Дії",
+ "actionsAvailable": "Доступні дії.",
+ "clearSelection": "Очистити вибір",
+ "selected": "Вибрано: {count}",
+ "selectedAll": "Усе вибрано"
+}
diff --git a/packages/@fds-design/actionbar/intl/zh-CN.json b/packages/@fds-design/actionbar/intl/zh-CN.json
new file mode 100644
index 0000000..4d418dd
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/zh-CN.json
@@ -0,0 +1,7 @@
+{
+ "actions": "操作",
+ "actionsAvailable": "有可用操作。",
+ "clearSelection": "清除选择",
+ "selected": "{count, plural, =0 {无选择} other {已选择 # 个}}",
+ "selectedAll": "全选"
+}
diff --git a/packages/@fds-design/actionbar/intl/zh-TW.json b/packages/@fds-design/actionbar/intl/zh-TW.json
new file mode 100644
index 0000000..6252310
--- /dev/null
+++ b/packages/@fds-design/actionbar/intl/zh-TW.json
@@ -0,0 +1,7 @@
+{
+ "actions": "動作",
+ "actionsAvailable": "可執行的動作。",
+ "clearSelection": "清除選取項目",
+ "selected": "{count, plural, =0 {未選取任何項目} other {已選取 # 個}}",
+ "selectedAll": "已選取所有項目"
+}
diff --git a/packages/@fds-design/actionbar/package.json b/packages/@fds-design/actionbar/package.json
new file mode 100644
index 0000000..473437c
--- /dev/null
+++ b/packages/@fds-design/actionbar/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "@fds-design/actionbar",
+ "version": "3.6.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",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/live-announcer": "^3.4.1",
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/actiongroup": "file:../../actiongroup",
+ "@react-spectrum/button": "file:../../button",
+ "@react-spectrum/overlays": "file:../../overlays",
+ "@react-spectrum/text": "file:../../text",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/collections": "^3.12.0",
+ "@react-types/actionbar": "^3.1.11",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/actionbar/src/ActionBar.tsx b/packages/@fds-design/actionbar/src/ActionBar.tsx
new file mode 100644
index 0000000..e7e3c06
--- /dev/null
+++ b/packages/@fds-design/actionbar/src/ActionBar.tsx
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionButton} from '../../button';
+import {ActionGroup} from '../../actiongroup';
+import {announce} from '@react-aria/live-announcer';
+import {classNames, useDOMRef, useStyleProps} from '../../utils';
+import CrossLarge from '@spectrum-icons/ui/CrossLarge';
+import {DOMRef} from '@react-types/shared';
+import {filterDOMProps} from '@react-aria/utils';
+import {FocusScope} from '@react-aria/focus';
+// @ts-ignore
+import intlMessages from '../intl/*.json';
+import {OpenTransition} from '../../overlays';
+import React, {ReactElement, Ref, useEffect, useRef, useState} from 'react';
+import {SpectrumActionBarProps} from '@react-types/actionbar';
+import styles from './actionbar.css';
+import {Text} from '../../text';
+import {useKeyboard} from '@react-aria/interactions';
+import {useLocalizedStringFormatter} from '@react-aria/i18n';
+import {useProviderProps} from '../../provider';
+
+/**
+ * Action bars are used for single and bulk selection patterns when a user needs to perform actions on one or more items at the same time.
+ */
+export const ActionBar = React.forwardRef(function ActionBar(props: SpectrumActionBarProps, ref: DOMRef) {
+ let isOpen = props.selectedItemCount !== 0;
+ let domRef = useDOMRef(ref);
+
+ return (
+
+
+
+ );
+}) as (props: SpectrumActionBarProps & {ref?: DOMRef}) => ReactElement;
+
+interface ActionBarInnerProps extends SpectrumActionBarProps {
+ isOpen?: boolean
+}
+
+function ActionBarInner(props: ActionBarInnerProps, ref: Ref) {
+ props = useProviderProps(props);
+
+ let {
+ children,
+ isEmphasized,
+ onAction,
+ onClearSelection,
+ selectedItemCount,
+ isOpen,
+ buttonLabelBehavior = 'collapse',
+ items,
+ disabledKeys
+ } = props;
+
+ let {styleProps} = useStyleProps(props);
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../actionbar');
+
+ // Store the last count greater than zero in a ref so that we can retain it while rendering the fade-out animation.
+ let [lastCount, setLastCount] = useState(selectedItemCount);
+ if ((selectedItemCount === 'all' || selectedItemCount > 0) && selectedItemCount !== lastCount) {
+ setLastCount(selectedItemCount);
+ }
+
+ let {keyboardProps} = useKeyboard({
+ onKeyDown(e) {
+ if (e.key === 'Escape') {
+ e.preventDefault();
+ onClearSelection();
+ }
+ }
+ });
+
+ // Announce "actions available" on mount.
+ let isInitial = useRef(true);
+ useEffect(() => {
+ if (isInitial.current) {
+ isInitial.current = false;
+ announce(stringFormatter.format('actionsAvailable'));
+ }
+ }, [stringFormatter]);
+
+ return (
+
+
+
+
+ {children}
+
+
onClearSelection()}
+ isQuiet
+ staticColor={isEmphasized ? 'white' : undefined}>
+
+
+
+ {lastCount === 'all'
+ ? stringFormatter.format('selectedAll')
+ : stringFormatter.format('selected', {count: lastCount})}
+
+
+
+
+ );
+}
+
+const ActionBarInnerWithRef = React.forwardRef(ActionBarInner) as (props: ActionBarInnerProps & {ref?: Ref}) => ReactElement;
diff --git a/packages/@fds-design/actionbar/src/ActionBarContainer.tsx b/packages/@fds-design/actionbar/src/ActionBarContainer.tsx
new file mode 100644
index 0000000..e841895
--- /dev/null
+++ b/packages/@fds-design/actionbar/src/ActionBarContainer.tsx
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames, useDOMRef, useStyleProps} from '../../utils';
+import {DOMRef} from '@react-types/shared';
+import {filterDOMProps} from '@react-aria/utils';
+import React from 'react';
+import {SpectrumActionBarContainerProps} from '@react-types/actionbar';
+import styles from './actionbar.css';
+import {useProviderProps} from '../../provider';
+
+/**
+ * ActionBarContainer wraps around an ActionBar and a component that supports selection. It handles
+ * the ActionBar's position with respect to its linked component.
+ */
+export const ActionBarContainer = React.forwardRef(function ActionBarContainer(props: SpectrumActionBarContainerProps, ref: DOMRef) {
+ // Grabs specific props from the closest Provider (see https://react-spectrum.adobe.com/react-spectrum/Provider.html#property-groups). Remove if your component doesn't support any of the listed props.
+ props = useProviderProps(props);
+
+ let {children} = props;
+ let {styleProps} = useStyleProps(props);
+ let domRef = useDOMRef(ref);
+
+ return (
+
+ {children}
+
+ );
+});
diff --git a/packages/@fds-design/actionbar/src/actionbar.css b/packages/@fds-design/actionbar/src/actionbar.css
new file mode 100644
index 0000000..4956020
--- /dev/null
+++ b/packages/@fds-design/actionbar/src/actionbar.css
@@ -0,0 +1,91 @@
+.ActionBarContainer {
+ display: flex;
+ flex-direction: column;
+ position: relative;
+
+ & > :not(.react-spectrum-ActionBar) {
+ flex: 1;
+ min-height: 0;
+ }
+
+ & > .react-spectrum-ActionBar {
+ flex: 0 0 auto;
+ }
+}
+
+.react-spectrum-ActionBar {
+ transition: height var(--spectrum-global-animation-duration-100) ease-in-out,
+ opacity var(--spectrum-global-animation-duration-100) ease-in-out;
+
+ /* Take up no space when not open */
+ block-size: 0;
+ opacity: 0;
+ width: 100%;
+
+ /* Clip anything outside of us, whether we're open or not. This makes the animation smooth */
+ overflow: hidden;
+
+ &.is-open {
+ height: calc(var(--spectrum-global-dimension-size-600) + var(--spectrum-global-dimension-size-100) * 2);
+ opacity: 1;
+ transition-delay: 0ms;
+ }
+
+ .react-spectrum-ActionBar-bar {
+ display: grid;
+ grid-template-areas: "clear selected . actiongroup";
+ grid-template-columns: auto max-content minmax(var(--spectrum-global-dimension-size-300), 1fr) auto;
+ align-items: center;
+ isolation: isolate;
+ justify-content: space-between;
+ padding: var(--spectrum-global-dimension-size-100);
+
+ position: absolute;
+ bottom: var(--spectrum-global-dimension-size-100);
+ left: var(--spectrum-global-dimension-size-100);
+ right: var(--spectrum-global-dimension-size-100);
+ max-width: 960px;
+ margin: 0 auto;
+
+ background: var(--spectrum-global-color-gray-50);
+ border-radius: var(--spectrum-popover-border-radius);
+ border-style: solid;
+ border-width: var(--spectrum-popover-border-size);
+ border-color: var(--spectrum-popover-border-color);
+ box-shadow: 0 2px 8px var(--spectrum-alias-dropshadow-color);
+
+ transform: translateY(var(--spectrum-overlay-positive-transform-distance));
+ transition: transform var(--spectrum-global-animation-duration-100) ease-in-out;
+ }
+
+ &.is-open .react-spectrum-ActionBar-bar {
+ transform: translateY(0);
+ }
+
+ &.react-spectrum-ActionBar--emphasized .react-spectrum-ActionBar-bar {
+ background: var(--spectrum-global-color-static-blue-700);
+ color: white;
+ box-shadow: 0 2px 6px var(--spectrum-alias-dropshadow-color);
+ border: none;
+ }
+
+ .react-spectrum-ActionBar-selectedCount {
+ grid-area: selected;
+ padding: 0 var(--spectrum-global-dimension-size-50);
+ user-select: none;
+ cursor: default;
+ }
+
+ .react-spectrum-ActionBar-actionGroup {
+ grid-area: actiongroup;
+ min-width: 0;
+ }
+}
+@media (forced-colors: active) {
+ .react-spectrum-ActionBar {
+ &.react-spectrum-ActionBar--emphasized .react-spectrum-ActionBar-bar {
+
+ border: 1px solid transparent;
+ }
+ }
+}
diff --git a/packages/@fds-design/actionbar/src/index.ts b/packages/@fds-design/actionbar/src/index.ts
new file mode 100644
index 0000000..b07d20e
--- /dev/null
+++ b/packages/@fds-design/actionbar/src/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 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.
+ */
+///
+export {ActionBar} from './ActionBar';
+export {ActionBarContainer} from './ActionBarContainer';
+export {Item} from '@react-stately/collections';
+export type {SpectrumActionBarContainerProps} from '@react-types/actionbar';
+export type {SpectrumActionBarProps} from '@react-types/actionbar';
diff --git a/packages/@fds-design/actionbar/stories/ActionBar.stories.tsx b/packages/@fds-design/actionbar/stories/ActionBar.stories.tsx
new file mode 100644
index 0000000..be67457
--- /dev/null
+++ b/packages/@fds-design/actionbar/stories/ActionBar.stories.tsx
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {ActionBar} from '../src';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {Example} from './Example';
+import React from 'react';
+import {useViewportSize} from '@react-aria/utils';
+
+export default {
+ title: 'ActionBar',
+ component: ActionBar,
+ args: {
+ onAction: action('onAction')
+ },
+ argTypes: {
+ onAction: {
+ table: {
+ disable: true
+ }
+ },
+ isEmphasized: {
+ control: 'boolean'
+ },
+ buttonLabelBehavior: {
+ control: 'select',
+ options: ['show', 'hide', 'collapse']
+ }
+ }
+} as ComponentMeta;
+
+export type ActionBarStory = ComponentStoryObj;
+
+export const Default: ActionBarStory = {
+ render: (args) => ,
+ parameters: {
+ a11y: {
+ config: {
+ // Fails due to TableView's known issue, ignoring here since it isn't pertinent to the story
+ rules: [{id: 'aria-required-children', selector: '*:not([role="grid"])'}]
+ }
+ }
+ }
+};
+
+export const FullWidthStory: ActionBarStory = {
+ ...Default,
+ render: (args) =>
+};
+
+function FullWidth(props) {
+ let viewport = useViewportSize();
+ return ;
+}
+
+export const DisabledKeysStory: ActionBarStory = {
+ ...Default,
+ render: (args) =>
+};
+
+function DisabledKeys(props) {
+ return ;
+}
diff --git a/packages/@fds-design/actionbar/stories/Example.tsx b/packages/@fds-design/actionbar/stories/Example.tsx
new file mode 100644
index 0000000..1597f13
--- /dev/null
+++ b/packages/@fds-design/actionbar/stories/Example.tsx
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionBar, ActionBarContainer, Item} from '../';
+import {Cell, Column, Row, TableBody, TableHeader, TableView} from '@react-spectrum/table';
+import Copy from '@spectrum-icons/workflow/Copy';
+import DataAdd from '@spectrum-icons/workflow/DataAdd';
+import Delete from '@spectrum-icons/workflow/Delete';
+import Duplicate from '@spectrum-icons/workflow/Duplicate';
+import Edit from '@spectrum-icons/workflow/Edit';
+import {mergeProps} from '@react-aria/utils';
+import Move from '@spectrum-icons/workflow/Move';
+import React, {useRef, useState} from 'react';
+import {Selection} from '@react-types/shared';
+import {Text} from '@react-spectrum/text';
+
+let columns = [
+ {name: 'Foo', key: 'foo'},
+ {name: 'Bar', key: 'bar'},
+ {name: 'Baz', key: 'baz'}
+];
+
+let defaultItems = [
+ {test: 'Test 1', foo: 'Foo 1', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 2', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 3', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 4', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 5', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 6', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 7', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 8', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 9', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 10', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 11', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 12', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 13', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 14', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'},
+ {test: 'Test 1', foo: 'Foo 15', bar: 'Bar 1', yay: 'Yay 1', baz: 'Baz 1'},
+ {test: 'Test 2', foo: 'Foo 16', bar: 'Bar 2', yay: 'Yay 2', baz: 'Baz 2'}
+];
+
+export function Example(props: any = {}) {
+ const [selectedKeys, setSelectedKeys] = useState(props.defaultSelectedKeys || new Set());
+ let [items, setItems] = useState(defaultItems);
+
+ let ref = useRef(null);
+ return (
+
+ setSelectedKeys(keys)}>
+
+ {column => {column.name} }
+
+
+ {item =>
+ (
+ {key => {item[key]} | }
+
)
+ }
+
+
+ {
+ setSelectedKeys(new Set());
+ }}
+ {...mergeProps(props, {
+ onAction: (key) => {
+ if (key === 'delete') {
+ let newItems = items;
+ if (selectedKeys instanceof Set) {
+ newItems = items.filter(item => !selectedKeys.has(item.foo));
+ } else if (selectedKeys === 'all') {
+ newItems = [];
+ }
+ setItems(newItems);
+ setSelectedKeys(new Set());
+ }
+ }
+ })}>
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+ -
+
+ Move
+
+ -
+
+ Duplicate
+
+
+
+ );
+}
+
+export function Example2(props: any = {}) {
+ const [selectedKeys, setSelectedKeys] = useState(props.defaultSelectedKeys || new Set());
+ let [items, setItems] = useState(defaultItems);
+
+ let ref = useRef(null);
+ return (
+
+ setSelectedKeys(keys)}>
+
+ {column => {column.name} }
+
+
+ {item =>
+ (
+ {key => {item[key]} | }
+
)
+ }
+
+
+ {
+ setSelectedKeys(new Set());
+ }}
+ {...mergeProps(props, {
+ onAction: (key) => {
+ if (key === 'delete') {
+ let newItems = items;
+ if (selectedKeys instanceof Set) {
+ newItems = items.filter(item => !selectedKeys.has(item.foo));
+ } else if (selectedKeys === 'all') {
+ newItems = [];
+ }
+ setItems(newItems);
+ setSelectedKeys(new Set());
+ }
+ }
+ })}>
+ -
+
+ Bearbeiten
+
+ -
+
+ Löschen
+
+ -
+
+ Datenansicht erstellen
+
+
+
+ );
+}
diff --git a/packages/@fds-design/actionbar/test/ActionBar.test.js b/packages/@fds-design/actionbar/test/ActionBar.test.js
new file mode 100644
index 0000000..dccdc80
--- /dev/null
+++ b/packages/@fds-design/actionbar/test/ActionBar.test.js
@@ -0,0 +1,301 @@
+/*
+ * Copyright 2020 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.
+ */
+
+
+jest.mock('@react-aria/live-announcer');
+import {act, fireEvent, pointerMap, render, within} from '@react-spectrum/test-utils-internal';
+import {announce} from '@react-aria/live-announcer';
+import {Example} from '../stories/Example';
+import {getFocusableTreeWalker} from '@react-aria/focus';
+import {Provider} from '@react-spectrum/provider';
+import React from 'react';
+import {theme} from '@react-spectrum/theme-default';
+import userEvent from '@testing-library/user-event';
+
+describe('ActionBar', () => {
+ let user;
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(() => 1000);
+ jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockImplementation(() => 500);
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ act(() => jest.runAllTimers());
+ });
+
+ it('should open when there are selected items', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+
+ expect(tree.queryByRole('toolbar')).toBeNull();
+ await user.click(rows[1]);
+
+ expect(announce).toHaveBeenCalledWith('Actions available.');
+
+ let toolbar = tree.getByRole('toolbar');
+ expect(toolbar).toHaveAttribute('aria-label', 'Actions');
+
+ let buttons = within(toolbar).getAllByRole('button');
+ expect(buttons).toHaveLength(5);
+
+ expect(tree.getByText('1 selected')).toBeInTheDocument();
+
+ let clearButton = tree.getByLabelText('Clear selection');
+ expect(clearButton.tagName).toBe('BUTTON');
+ });
+
+ it('should update the selected count when selecting more items', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+
+ await user.click(rows[1]);
+
+ let selectedCount = tree.getByText('1 selected');
+
+ await user.click(rows[2]);
+ expect(selectedCount).toHaveTextContent('2 selected');
+ });
+
+ it('should work with select all', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let selectAll = tree.getByLabelText('Select All');
+ await user.click(selectAll);
+
+ expect(tree.getByText('All selected')).toBeInTheDocument();
+ });
+
+ it('should close and restore focus when pressing the clear button', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+ let checkbox = within(rows[1]).getByRole('checkbox');
+
+ await user.click(checkbox);
+ act(() => jest.runAllTimers());
+ expect(document.activeElement).toBe(checkbox);
+
+ let clearButton = tree.getByLabelText('Clear selection');
+
+ act(() => clearButton.focus());
+ await user.click(clearButton);
+ act(() => jest.runAllTimers());
+ act(() => jest.runAllTimers());
+
+ expect(tree.queryByRole('toolbar')).toBeNull();
+ expect(document.activeElement).toBe(checkbox);
+ });
+
+ it('should close when pressing the escape key', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+ let checkbox = within(rows[1]).getByRole('checkbox');
+
+ await user.click(checkbox);
+ act(() => jest.runAllTimers());
+ expect(document.activeElement).toBe(checkbox);
+
+ let toolbar = tree.getByRole('toolbar');
+ act(() => within(toolbar).getAllByRole('button')[0].focus());
+
+ await user.keyboard('{Escape}');
+ act(() => jest.runAllTimers());
+ act(() => jest.runAllTimers());
+
+ expect(tree.queryByRole('toolbar')).toBeNull();
+ expect(document.activeElement).toBe(checkbox);
+ });
+
+ it('should restore focus where it came from after being closed via escape if no elements are removed', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+ let checkbox = within(rows[1]).getByRole('checkbox');
+
+ await user.tab();
+ expect(document.activeElement).toBe(rows[1]);
+ await user.keyboard('{Enter}');
+ expect(checkbox).toBeChecked();
+ act(() => jest.runAllTimers());
+
+ let toolbar = tree.getByRole('toolbar');
+ expect(toolbar).toBeVisible();
+ expect(document.activeElement).toBe(rows[1]);
+
+ // Simulate tabbing within the table
+ fireEvent.keyDown(document.activeElement, {key: 'Tab'});
+ let walker = getFocusableTreeWalker(document.body, {tabbable: true});
+ walker.currentNode = document.activeElement;
+ act(() => {walker.nextNode().focus();});
+ fireEvent.keyUp(document.activeElement, {key: 'Tab'});
+ expect(document.activeElement).toBe(within(toolbar).getAllByRole('button')[0]);
+
+ await user.keyboard('{Escape}');
+ // jsdom doesn't blur to body like a browser, so it was being placed on the first focusable element, conveniently our table row
+ // emulate browser behavior and blur
+ act(() => document.activeElement.blur());
+ act(() => jest.runAllTimers());
+ act(() => jest.runAllTimers());
+
+ expect(toolbar).not.toBeInTheDocument();
+ expect(document.activeElement).toBe(rows[1]);
+ });
+
+ it('should restore focus to the the new first row if the row we wanted to restore to was removed', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+ expect(within(rows[1]).getByRole('rowheader')).toHaveTextContent('Foo 1');
+ let checkbox = within(rows[1]).getByRole('checkbox');
+
+ await user.tab();
+ expect(document.activeElement).toBe(rows[1]);
+ await user.keyboard('{Enter}');
+ expect(checkbox).toBeChecked();
+ act(() => jest.runAllTimers());
+
+ let toolbar = tree.getByRole('toolbar');
+ expect(toolbar).toBeVisible();
+ expect(document.activeElement).toBe(rows[1]);
+
+ // Simulate tabbing within the table
+ fireEvent.keyDown(document.activeElement, {key: 'Tab'});
+ let walker = getFocusableTreeWalker(document.body, {tabbable: true});
+ walker.currentNode = document.activeElement;
+ act(() => {walker.nextNode().focus();});
+ fireEvent.keyUp(document.activeElement, {key: 'Tab'});
+ expect(document.activeElement).toBe(within(toolbar).getAllByRole('button')[0]);
+
+ await user.keyboard('{ArrowRight}');
+
+ await user.keyboard('{ArrowRight}');
+
+ expect(document.activeElement).toBe(within(toolbar).getAllByRole('button')[2]);
+
+ await user.keyboard('{Enter}');
+
+ act(() => jest.runAllTimers());
+ act(() => jest.runAllTimers());
+ await act(async () => Promise.resolve());
+
+ rows = within(table).getAllByRole('row');
+ expect(toolbar).not.toBeInTheDocument();
+ expect(document.activeElement).toBe(rows[1]);
+ expect(within(rows[1]).getByRole('rowheader')).toHaveTextContent('Foo 2');
+ });
+
+ it('should restore focus to the new first row if the row we wanted to restore to was removed via actiongroup menu', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+ let checkbox = within(rows[1]).getByRole('checkbox');
+
+ await user.tab();
+ expect(document.activeElement).toBe(rows[1]);
+ await user.keyboard('{Enter}');
+ expect(checkbox).toBeChecked();
+ act(() => jest.runAllTimers());
+
+ let toolbar = tree.getByRole('toolbar');
+ expect(toolbar).toBeVisible();
+ expect(document.activeElement).toBe(rows[1]);
+
+ jest.spyOn(toolbar.parentNode, 'getBoundingClientRect').mockImplementation(() => ({width: 200, height: 0, top: 0, left: 0, bottom: 0, right: 0}));
+ for (let action of toolbar.childNodes) {
+ jest.spyOn(action, 'getBoundingClientRect').mockImplementation(() => ({width: 75, height: 0, top: 0, left: 0, bottom: 0, right: 0}));
+ }
+ fireEvent(window, new Event('resize'));
+
+ // Simulate tabbing within the table
+ fireEvent.keyDown(document.activeElement, {key: 'Tab'});
+ let walker = getFocusableTreeWalker(document.body, {tabbable: true});
+ walker.currentNode = document.activeElement;
+ act(() => {walker.nextNode().focus();});
+ fireEvent.keyUp(document.activeElement, {key: 'Tab'});
+ expect(document.activeElement).toBe(within(toolbar).getAllByRole('button')[0]);
+
+ await user.keyboard('{ArrowRight}');
+
+ await user.keyboard('{ArrowRight}');
+
+ expect(within(toolbar).getAllByRole('button')).toHaveLength(3);
+ expect(document.activeElement).toBe(within(toolbar).getAllByRole('button')[2]);
+
+ await user.keyboard('{Enter}');
+
+ let listItems = tree.getAllByRole('menuitem');
+ expect(document.activeElement).toBe(listItems[0]);
+ expect(document.activeElement.textContent).toBe('Delete');
+
+ await user.keyboard('{Enter}');
+
+ act(() => jest.runAllTimers());
+ act(() => jest.runAllTimers());
+ await act(async () => Promise.resolve());
+ rows = within(table).getAllByRole('row');
+ // row reused by the virtualizer, so it's still in dom, but its contents have been swapped out
+ expect(rows[1].textContent).not.toBe('Foo 1Bar 1Baz 1');
+
+ rows = within(table).getAllByRole('row');
+ expect(toolbar).not.toBeInTheDocument();
+ expect(document.activeElement).toBe(rows[1]);
+ });
+
+ it('should fire onAction when clicking on an action', async () => {
+ let onAction = jest.fn();
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+
+ await user.click(rows[1]);
+
+ let toolbar = tree.getByRole('toolbar');
+ await user.click(within(toolbar).getAllByRole('button')[0]);
+
+ expect(onAction).toHaveBeenCalledWith('edit');
+ });
+
+ it('should respect disabledKeys when passed in', async () => {
+ let tree = render( );
+ act(() => {jest.runAllTimers();});
+
+ let table = tree.getByRole('grid');
+ let rows = within(table).getAllByRole('row');
+
+ await user.click(rows[1]);
+
+ expect(within(tree.getByRole('toolbar')).getAllByRole('button')[0]).toBeDisabled();
+ expect(within(tree.getByRole('toolbar')).getAllByRole('button')[1]).not.toBeDisabled();
+ });
+});
diff --git a/packages/@fds-design/actiongroup/README.md b/packages/@fds-design/actiongroup/README.md
new file mode 100644
index 0000000..20c634c
--- /dev/null
+++ b/packages/@fds-design/actiongroup/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/actiongroup
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/actiongroup/chromatic-fc/ActionGroup.stories.tsx b/packages/@fds-design/actiongroup/chromatic-fc/ActionGroup.stories.tsx
new file mode 100644
index 0000000..b7147c3
--- /dev/null
+++ b/packages/@fds-design/actiongroup/chromatic-fc/ActionGroup.stories.tsx
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+
+import {Compact, Default, IsDisabled, IsEmphasized, IsQuiet, StaticColorBlack, StaticColorWhite} from '../chromatic/ActionGroup.stories';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+export default {
+ title: 'ActionGroup'
+};
+
+export const All = () => (
+
+ default
+
+ isDisabled
+
+ compact
+
+ isQuiet
+
+ isEmphasized
+
+ staticColor: black
+
+ staticColor: white
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/actiongroup/chromatic/ActionGroup.stories.tsx b/packages/@fds-design/actiongroup/chromatic/ActionGroup.stories.tsx
new file mode 100644
index 0000000..aa98807
--- /dev/null
+++ b/packages/@fds-design/actiongroup/chromatic/ActionGroup.stories.tsx
@@ -0,0 +1,379 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionGroup} from '../';
+import BookIcon from '@spectrum-icons/workflow/Book';
+import CopyIcon from '@spectrum-icons/workflow/Copy';
+import DeleteIcon from '@spectrum-icons/workflow/Delete';
+import DocumentIcon from '@spectrum-icons/workflow/Document';
+import DrawIcon from '@spectrum-icons/workflow/Draw';
+import {Flex} from '@react-spectrum/layout';
+import InfoIcon from '@spectrum-icons/workflow/Info';
+import {Item} from '@react-stately/collections';
+import PropertiesIcon from '@spectrum-icons/workflow/Properties';
+import React from 'react';
+import SettingsIcon from '@spectrum-icons/workflow/Settings';
+import {Text} from '@react-spectrum/text';
+import {View} from '@react-spectrum/view';
+import ViewCardIcon from '@spectrum-icons/workflow/ViewCard';
+import ViewGridIcon from '@spectrum-icons/workflow/ViewGrid';
+import ViewListIcon from '@spectrum-icons/workflow/ViewList';
+
+const docItems = [{children: 'Document setup', name: '1'}, {children: 'Settings', name: '2'}];
+const editItems = [{children: 'Edit', name: '1'}, {children: 'Copy', name: '2'}, {children: 'Delete', name: '3'}];
+const viewItems2 = [{children: 'Grid view', name: '1'}, {children: 'List view', name: '2'}];
+const viewItems = [{children: 'Grid view', name: '1'}, {children: 'List view', name: '2'}, {children: 'Gallery view', name: '3'}];
+const dataItems = [{children: 'Properties', name: '1'}, {children: 'Info', name: '2'}, {children: 'Keywords', name: '3'}];
+
+let iconMap = {
+ 'Document setup': DocumentIcon,
+ 'Settings': SettingsIcon,
+ 'Grid view': ViewGridIcon,
+ 'List view': ViewListIcon,
+ 'Gallery view': ViewCardIcon,
+ 'Edit': DrawIcon,
+ 'Copy': CopyIcon,
+ 'Delete': DeleteIcon,
+ 'Properties': PropertiesIcon,
+ 'Info': InfoIcon,
+ 'Keywords': BookIcon
+};
+
+export default {
+ title: 'ActionGroup'
+};
+
+export const Default = () => render({}, docItems);
+
+Default.story = {
+ name: 'default'
+};
+
+export const IsDisabled = () => render({isDisabled: true, defaultSelectedKeys: ['1']}, docItems);
+
+IsDisabled.story = {
+ name: 'isDisabled'
+};
+
+export const Compact = () => render({density: 'compact', defaultSelectedKeys: ['1']}, viewItems);
+
+Compact.story = {
+ name: 'compact'
+};
+
+export const IsJustified = () =>
+ render({isJustified: true, defaultSelectedKeys: ['1']}, viewItems2);
+
+IsJustified.story = {
+ name: 'isJustified'
+};
+
+export const CompactIsJustified = () =>
+ render({density: 'compact', isJustified: true, defaultSelectedKeys: ['1']}, viewItems2);
+
+CompactIsJustified.story = {
+ name: 'compact, isJustified'
+};
+
+export const IsQuiet = () => render({isQuiet: true, defaultSelectedKeys: ['1']}, editItems);
+
+IsQuiet.story = {
+ name: 'isQuiet'
+};
+
+export const CompactIsQuiet = () =>
+ render({density: 'compact', isQuiet: true, defaultSelectedKeys: ['1']}, editItems);
+
+CompactIsQuiet.story = {
+ name: 'compact, isQuiet'
+};
+
+export const IsEmphasized = () =>
+ render({isEmphasized: true, defaultSelectedKeys: ['1']}, docItems);
+
+IsEmphasized.story = {
+ name: 'isEmphasized'
+};
+
+export const CompactIsEmphasized = () =>
+ render({isEmphasized: true, density: 'compact', defaultSelectedKeys: ['1']}, viewItems);
+
+CompactIsEmphasized.story = {
+ name: 'compact, isEmphasized'
+};
+
+export const IsQuietIsEmphasized = () =>
+ render({isEmphasized: true, isQuiet: true, defaultSelectedKeys: ['1']}, viewItems);
+
+IsQuietIsEmphasized.story = {
+ name: 'isQuiet, isEmphasized'
+};
+
+export const SelectionModeMultiple = () =>
+ render({selectionMode: 'multiple', defaultSelectedKeys: ['1', '2']}, dataItems);
+
+SelectionModeMultiple.story = {
+ name: 'selectionMode: multiple'
+};
+
+export const StaticColorWhite = () => (
+
+ {render({staticColor: 'white', defaultSelectedKeys: ['1']}, viewItems)}
+
+);
+
+StaticColorWhite.story = {
+ name: 'staticColor=white'
+};
+
+export const StaticColorWhiteIsQuiet = () => (
+
+ {render({staticColor: 'white', isQuiet: true, defaultSelectedKeys: ['1']}, viewItems)}
+
+);
+
+StaticColorWhiteIsQuiet.story = {
+ name: 'staticColor=white, isQuiet'
+};
+
+export const StaticColorBlack = () => (
+
+ {render({staticColor: 'black', defaultSelectedKeys: ['1']}, viewItems)}
+
+);
+
+StaticColorBlack.story = {
+ name: 'staticColor=black'
+};
+
+export const StaticColorBlackIsQuiet = () => (
+
+ {render({staticColor: 'black', isQuiet: true, defaultSelectedKeys: ['1']}, viewItems)}
+
+);
+
+StaticColorBlackIsQuiet.story = {
+ name: 'staticColor=black, isQuiet'
+};
+
+export const SelectionModeSingleDisallowEmptySelection = () =>
+ render(
+ {selectionMode: 'single', disallowEmptySelection: true, defaultSelectedKeys: ['1']},
+ dataItems
+ );
+
+SelectionModeSingleDisallowEmptySelection.story = {
+ name: 'selectionMode: single, disallowEmptySelection'
+};
+
+export const SelectionModeMultipleIsQuiet = () =>
+ render({isQuiet: true, selectionMode: 'multiple', defaultSelectedKeys: ['1', '2']}, dataItems);
+
+SelectionModeMultipleIsQuiet.story = {
+ name: 'selectionMode: multiple, isQuiet'
+};
+
+export const SelectionModeMultipleIsQuietCompact = () =>
+ render(
+ {
+ isQuiet: true,
+ density: 'compact',
+ selectionMode: 'multiple',
+ defaultSelectedKeys: ['1', '2']
+ },
+ dataItems
+ );
+
+SelectionModeMultipleIsQuietCompact.story = {
+ name: 'selectionMode: multiple, isQuiet, compact'
+};
+
+export const SelectionModeMultipleIsEmphasized = () =>
+ render(
+ {isEmphasized: true, selectionMode: 'multiple', defaultSelectedKeys: ['1', '2']},
+ dataItems
+ );
+
+SelectionModeMultipleIsEmphasized.story = {
+ name: 'selectionMode: multiple, isEmphasized'
+};
+
+export const SelectionModeMultipleIsEmphasizedCompact = () =>
+ render(
+ {
+ isEmphasized: true,
+ density: 'compact',
+ selectionMode: 'multiple',
+ defaultSelectedKeys: ['1', '2']
+ },
+ dataItems
+ );
+
+SelectionModeMultipleIsEmphasizedCompact.story = {
+ name: 'selectionMode: multiple, isEmphasized, compact'
+};
+
+export const SelectionModeMultipleIsEmphasizedIsQuiet = () =>
+ render(
+ {
+ isEmphasized: true,
+ isQuiet: true,
+ selectionMode: 'multiple',
+ defaultSelectedKeys: ['1', '2']
+ },
+ dataItems
+ );
+
+SelectionModeMultipleIsEmphasizedIsQuiet.story = {
+ name: 'selectionMode: multiple, isEmphasized, isQuiet'
+};
+
+export const SelectionModeMultipleIsEmphasizedIsQuietCompact = () =>
+ render(
+ {
+ isEmphasized: true,
+ isQuiet: true,
+ density: 'compact',
+ selectionMode: 'multiple',
+ defaultSelectedKeys: ['1', '2']
+ },
+ dataItems
+ );
+
+SelectionModeMultipleIsEmphasizedIsQuietCompact.story = {
+ name: 'selectionMode: multiple, isEmphasized, isQuiet, compact'
+};
+
+export const SelectionModeNone = () => render({selectionMode: 'none'}, editItems);
+
+SelectionModeNone.story = {
+ name: 'selectionMode: none'
+};
+
+export const Vertical = () =>
+ render({orientation: 'vertical', defaultSelectedKeys: ['1']}, docItems);
+
+Vertical.story = {
+ name: 'vertical'
+};
+
+export const VerticalIsJustified = () =>
+ render({isJustified: true, orientation: 'vertical', defaultSelectedKeys: ['1']}, docItems);
+
+VerticalIsJustified.story = {
+ name: 'vertical, isJustified'
+};
+
+export const VerticalCompact = () =>
+ render({density: 'compact', orientation: 'vertical', defaultSelectedKeys: ['1']}, viewItems);
+
+VerticalCompact.story = {
+ name: 'vertical, compact'
+};
+
+export const VerticalIsJustifiedCompact = () =>
+ render(
+ {isJustified: true, density: 'compact', orientation: 'vertical', defaultSelectedKeys: ['1']},
+ viewItems
+ );
+
+VerticalIsJustifiedCompact.story = {
+ name: 'vertical, isJustified, compact'
+};
+
+export const VerticalIsQuiet = () =>
+ render({isQuiet: true, orientation: 'vertical', defaultSelectedKeys: ['1']}, editItems);
+
+VerticalIsQuiet.story = {
+ name: 'vertical, isQuiet'
+};
+
+export const VerticalIsQuietCompact = () =>
+ render(
+ {isQuiet: true, density: 'compact', orientation: 'vertical', defaultSelectedKeys: ['1']},
+ viewItems
+ );
+
+VerticalIsQuietCompact.story = {
+ name: 'vertical, isQuiet, compact'
+};
+
+export const DisabledKeys = () =>
+ render({disabledKeys: ['1', '2'], selectionMode: 'multiple'}, dataItems);
+
+DisabledKeys.story = {
+ name: 'disabledKeys'
+};
+
+export const OverflowAndHide = () =>
+ render({overflowMode: 'collapse', buttonLabelBehavior: 'hide', selectionMode: 'multiple'}, dataItems);
+
+OverflowAndHide.story = {
+ name: 'overflowMode: collapse, buttonLabelBehavior: hide'
+};
+
+function render(props, items) {
+ return (
+
+ {renderText(props, items)}
+ {renderBoth(props, items)}
+ {renderIcons(props, items)}
+
+ );
+}
+
+function renderText(props, items: any = docItems) {
+ return (
+
+ {
+ items.map((itemProps) => (
+
+ ))
+ }
+
+ );
+}
+
+function renderBoth(props, items: any = docItems) {
+ return (
+
+ {
+ items.map((itemProps) => {
+ let IconElement = iconMap[itemProps.children];
+ return (
+ -
+
{itemProps.children}
+
+
+ );
+ })
+ }
+
+ );
+}
+
+function renderIcons(props, items: any = docItems) {
+ return (
+
+ {
+ items.map((itemProps) => {
+ let IconElement = iconMap[itemProps.children];
+ return (
+ -
+
+
+ );
+ })
+ }
+
+ );
+}
diff --git a/packages/@fds-design/actiongroup/docs/ActionGroup.mdx b/packages/@fds-design/actiongroup/docs/ActionGroup.mdx
new file mode 100644
index 0000000..5e61190
--- /dev/null
+++ b/packages/@fds-design/actiongroup/docs/ActionGroup.mdx
@@ -0,0 +1,552 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/actiongroup';
+import collectionsDocs from 'docs:@react-stately/collections';
+import {HeaderInfo, PropTable, TypeLink, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/actiongroup/package.json';
+
+```jsx import
+import {ActionGroup, Item} from '@react-spectrum/actiongroup';
+import Brush from '@spectrum-icons/workflow/Brush';
+import RegionSelect from '@spectrum-icons/workflow/RegionSelect';
+import Select from '@spectrum-icons/workflow/Select';
+import {Flex} from '@react-spectrum/layout';
+import {View} from '@react-spectrum/view';
+import ViewList from '@spectrum-icons/workflow/ViewList';
+import ViewGrid from '@spectrum-icons/workflow/ViewGrid';
+import ViewCard from '@spectrum-icons/workflow/ViewCard';
+import Move from '@spectrum-icons/workflow/Move';
+import Duplicate from '@spectrum-icons/workflow/Duplicate';
+import TagBold from '@spectrum-icons/workflow/TagBold';
+import TagItalic from '@spectrum-icons/workflow/TagItalic';
+import TagUnderline from '@spectrum-icons/workflow/TagUnderline';
+import TextStrikethrough from '@spectrum-icons/workflow/TextStrikethrough';
+import TextAlignCenter from '@spectrum-icons/workflow/TextAlignCenter';
+import TextAlignJustify from '@spectrum-icons/workflow/TextAlignJustify';
+import TextAlignLeft from '@spectrum-icons/workflow/TextAlignLeft';
+import TextAlignRight from '@spectrum-icons/workflow/TextAlignRight';
+```
+
+---
+category: Buttons
+keywords: [toolbar, actiongroup, collections]
+---
+
+# ActionGroup
+
+{docs.exports.ActionGroup.description}
+
+
+
+## Example
+
+```tsx example
+function Example() {
+ let [action, setAction] = React.useState(null);
+
+ return (
+ <>
+
+ - Add
+ - Delete
+ - Edit
+
+ Action: {action}
+ >
+ );
+}
+```
+
+## Content
+
+ActionGroups accept a list of elements as children, each with a `key` prop. Alternatively, a function that returns `Item` elements is also supported. See the [collection components](../react-stately/collections.html) docs for more details about this API.
+
+```tsx example
+const items = [
+ {label: 'React', name: 'React'},
+ {label: 'Add', name: 'Add'},
+ {label: 'Delete', name: 'Delete'}
+];
+
+
+ {item => - {item.label}
}
+
+```
+
+### Icons
+
+Icons can be added to ActionGroup items by wrapping the label in a [Text](Text.html) element, and adding the icon as a sibling.
+
+```tsx example
+import Draw from '@spectrum-icons/workflow/Draw';
+import Copy from '@spectrum-icons/workflow/Copy';
+import Delete from '@spectrum-icons/workflow/Delete';
+import {Text} from '@react-spectrum/text';
+
+
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+
+```
+
+You can also hide the label text within the buttons using the `buttonLabelBehavior` prop. When set to `"hide"`, the label is
+hidden and automatically shown in a tooltip on hover.
+
+```tsx example
+
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+
+```
+
+### Accessibility
+
+Icon only ActionGroups should usually include a tooltip to describe the button via the `buttonLabelBehavior` prop as described above. This also automatically handles
+labeling the button for assistive technology users.
+
+In rare cases where no tooltip is desired, an alternative text label must be provided to identify the control for accessibility.
+This should be added using the `aria-label` prop to each Item.
+
+```tsx example
+
+
+
+
+
+```
+
+### Internationalization
+
+In order to internationalize an ActionGroup, the content provided to all child items should be localized.
+
+## Selection
+ActionGroup supports multiple selection modes. By default, selection is disabled, however this can be changed using the `selectionMode` prop.
+Use `defaultSelectedKeys` to provide a default set of selected items (uncontrolled) and `selectedKeys` to set the selected items (controlled). The value of the selected keys must match the `key` prop of the items.
+See the `react-stately` [Selection docs](../react-stately/selection.html#selected-key-data-type) for caveats regarding selection prop typing.
+
+```tsx example
+
+ - Grid view
+ - List view
+ - Gallery view
+
+```
+
+The `selectedKeys` prop can be used to make the selected state controlled.
+
+```tsx example
+import type {Selection} from '@adobe/react-spectrum';
+
+function Example() {
+ let [selected, setSelected] = React.useState(new Set(['list']));
+
+ return (
+ <>
+
+ - Grid view
+ - List view
+ - Gallery view
+
+ Current selection (controlled): {[...selected]}
+ >
+ );
+}
+```
+
+Set `selectionMode` prop to `multiple` to allow more than one selection.
+```tsx example
+function Example() {
+ let [selected, setSelected] = React.useState(new Set(['list']));
+
+ return (
+ <>
+
+ - Grid view
+ - List view
+ - Gallery view
+
+ Current selections (controlled): {[...selected].join(', ')}
+ >
+ );
+}
+```
+
+## Events
+Use the `onSelectionChange` prop as a callback to handle press events on items when selectionMode is either `single` or `multiple`.
+The `key` prop from the selected item will be passed into the callback.
+
+To continue to capturing actions when `selectionMode` is `none`, utilize the `onAction` prop.
+```tsx example
+import type {Key} from '@adobe/react-spectrum';
+
+function Example() {
+ let [actionKey, setActionKey] = React.useState('');
+ return (
+ <>
+
+ - Add
+ - Delete
+ - Edit
+
+ Action: {actionKey}
+ >
+ );
+}
+```
+
+## Collapsing behavior
+
+By default, ActionGroup items wrap to form a new line when horizontal space is limited. However, this can cause content to shift below the
+ActionGroup. If the ActionGroup should always appear in a single line, the `overflowMode` prop can be set to `collapse`. In this mode, when
+horizontal space is limited, the ActionGroup will collapse into a menu. The exact behavior depends on the `selectionMode`.
+
+### Non-selectable
+
+When selection is not enabled, ActionGroup displays as many items as possible and collapses the remaining items into a more actions menu.
+
+```tsx example
+
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+ -
+
+ Move
+
+ -
+
+ Duplicate
+
+
+```
+
+### Selection
+
+When selection is enabled, ActionGroup collapses all items into a menu together when space is limited. The menu button indicates when one of
+the options within it is selected by showing a highlighted state. A `summaryIcon` should be specified to visually communicate the purpose of
+the ActionGroup when collapsed, and an `aria-label` should be provided to describe the ActionGroup to assistive technology.
+
+This example shows a multi-selectable ActionGroup that can be used to select text styles. When space is limited, it collapses into a dropdown
+menu, and displays the `TextStyle` icon passed to the `summaryIcon` prop.
+
+```tsx example
+import TextStyle from '@spectrum-icons/workflow/TextStyle';
+
+ }
+ maxWidth={100}>
+ -
+
+ Bold
+
+ -
+
+ Italic
+
+ -
+
+ Underline
+
+ -
+
+ Strikethrough
+
+
+```
+
+### Single selection
+
+A special case where a `summaryIcon` is not needed is a single selectable ActionGroup (`selectionMode="single"`) which enforces that an item
+is always selected (`disallowEmptySelection`). In this case, the selected item is displayed inside the menu button when collapsed.
+
+```tsx example
+
+ -
+
+ Align Left
+
+ -
+
+ Align Center
+
+ -
+
+ Align Right
+
+ -
+
+ Justify
+
+
+```
+
+### Collapsing button labels
+
+In addition to collapsing items that don't fit into a menu, the button labels can also be automatically hidden when space is limited.
+This keeps more buttons visible at a time before needing to collapse into a menu. This behavior can be enabled by setting the
+`buttonLabelBehavior` prop to `"collapse"`. The labels will be automatically shown in tooltips when collapsed.
+
+```tsx example
+
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+ -
+
+ Move
+
+ -
+
+ Duplicate
+
+
+```
+
+### Vertical collapsing behavior
+
+Non-selectable vertical ActionGroups also support collapsing when the height is too small to fit all of the buttons.
+The behavior is the same as for horizontal ActionGroups, except for the positioning of the tooltips and menu.
+
+Vertical ActionGroups with selection do not currently support collapsing. When selection is enabled, we recommend placing
+the ActionGroup in a scrollable container so that the user can access all items.
+
+```tsx example
+
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+ -
+
+ Move
+
+ -
+
+ Duplicate
+
+
+```
+
+## Props
+
+
+
+## Visual options
+
+### Quiet
+
+```tsx example
+
+ - Add
+ - Delete
+ - Edit
+
+```
+
+### Emphasized
+
+The additional styling provided by the `isEmphasized` prop is only applied when items are selected.
+
+```tsx example
+
+ - Grid view
+ - List view
+ - Gallery view
+
+```
+
+### Static color
+
+The `staticColor` prop can be used when the ActionGroup is displayed over a color background. When selected, the icon and text in each
+button automatically take on the color of the background. You are responsible for choosing the static color variant that ensures the
+text meets an [accessible contrast ratio](https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast)
+with the background.
+
+```tsx example
+
+
+
+ -
+
+ Edit
+
+ -
+
+ Copy
+
+ -
+
+ Delete
+
+
+
+
+
+ -
+
+ List view
+
+ -
+
+ Grid view
+
+ -
+
+ Gallery view
+
+
+
+
+```
+
+### Disabled
+
+To disable the entire ActionGroup, use the `isDisabled` prop on the root.
+
+```tsx example
+
+ - Add
+ - Delete
+ - Edit
+
+```
+
+To disable individual items, a list of `disabledKeys` can be provided.
+
+```tsx example
+
+ - Add
+ - Delete
+ - Edit
+
+```
+
+### Orientation
+
+Using the `orientation` prop with value `vertical` changes the alignment of the items to follow the y-axis.
+
+```tsx example
+
+
+
+
+
+```
+
+### Density
+
+Using the `density` prop with value `compact` changes the margins between the buttons.
+In the default case, this merges the borders of neighboring ActionButtons. In the
+quiet case, it just reduces the margin size between the buttons.
+
+```tsx example
+
+
+
+
+
+```
+
+```tsx example
+
+
+
+
+
+```
+
+### Justified
+The `isJustified` prop will divide all available horizontal space evenly among the buttons.
+
+```tsx example
+
+
+
+
+
+
+
+```
diff --git a/packages/@fds-design/actiongroup/index.ts b/packages/@fds-design/actiongroup/index.ts
new file mode 100644
index 0000000..bbd9b8c
--- /dev/null
+++ b/packages/@fds-design/actiongroup/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/actiongroup/package.json b/packages/@fds-design/actiongroup/package.json
new file mode 100644
index 0000000..24dbac1
--- /dev/null
+++ b/packages/@fds-design/actiongroup/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "@fds-design/actiongroup",
+ "version": "3.10.10",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/actiongroup": "^3.7.11",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/button": "file:../../button",
+ "@react-spectrum/menu": "file:../../menu",
+ "@react-spectrum/text": "file:../../text",
+ "@react-spectrum/tooltip": "file:../../tooltip",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-types/actiongroup": "^3.4.13",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@spectrum-icons/workflow": "^4.2.16",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/actiongroup/src/ActionGroup.tsx b/packages/@fds-design/actiongroup/src/ActionGroup.tsx
new file mode 100644
index 0000000..815860d
--- /dev/null
+++ b/packages/@fds-design/actiongroup/src/ActionGroup.tsx
@@ -0,0 +1,496 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionButton} from '../../button';
+import {AriaLabelingProps, DOMProps, DOMRef, Key, Node, StyleProps} from '@react-types/shared';
+import buttonStyles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import ChevronDownMedium from '@spectrum-icons/ui/ChevronDownMedium';
+import {
+ classNames,
+ ClearSlots,
+ SlotProvider,
+ useDOMRef,
+ useSlotProps,
+ useStyleProps
+} from '../../utils';
+import {filterDOMProps, mergeProps, useId, useLayoutEffect, useResizeObserver, useValueEffect} from '@react-aria/utils';
+import {FocusScope} from '@react-aria/focus';
+import {Item, Menu, MenuTrigger} from '../../menu';
+import {ListState, useListState} from '@react-stately/list';
+import More from '@spectrum-icons/workflow/More';
+import {PressResponder, useHover} from '@react-aria/interactions';
+import {Provider, useProviderProps} from '../../provider';
+import React, {forwardRef, ReactElement, ReactNode, useCallback, useMemo, useRef, useState} from 'react';
+import {SpectrumActionGroupProps} from '@react-types/actiongroup';
+import styles from '@adobe/spectrum-css-temp/components/actiongroup/vars.css';
+import {Text} from '../../text';
+import {Tooltip, TooltipTrigger} from '../../tooltip';
+import {useActionGroup, useActionGroupItem} from '@react-aria/actiongroup';
+
+
+/**
+ * An ActionGroup is a grouping of ActionButtons that are related to one another.
+ */
+export const ActionGroup = forwardRef(function ActionGroup(props: SpectrumActionGroupProps, ref: DOMRef) {
+ props = useProviderProps(props);
+ props = useSlotProps(props, 'actionGroup');
+
+ let {
+ isEmphasized,
+ density,
+ isJustified,
+ isDisabled,
+ orientation = 'horizontal',
+ isQuiet,
+ staticColor,
+ overflowMode = 'wrap',
+ onAction,
+ buttonLabelBehavior,
+ summaryIcon,
+ ...otherProps
+ } = props;
+
+ let domRef = useDOMRef(ref);
+ let wrapperRef = useRef(null);
+ let state = useListState({...props, suppressTextValueWarning: true});
+ let {actionGroupProps} = useActionGroup(props, state, domRef);
+ let isVertical = orientation === 'vertical';
+ let providerProps = {isEmphasized, isDisabled, isQuiet};
+ let {styleProps} = useStyleProps(props);
+
+ // Only hide button text if every item contains more than just plain text (we assume an icon).
+ let isIconCollapsible = useMemo(() => [...state.collection].every(item => typeof item.rendered !== 'string'), [state.collection]);
+ let [{visibleItems, hideButtonText, isMeasuring}, setVisibleItems] = useValueEffect({
+ visibleItems: state.collection.size,
+ hideButtonText: buttonLabelBehavior === 'hide' && isIconCollapsible,
+ isMeasuring: false
+ });
+
+ let selectionMode = state.selectionManager.selectionMode;
+ let updateOverflow = useCallback(() => {
+ if (overflowMode === 'wrap') {
+ return;
+ }
+
+ if (orientation === 'vertical' && selectionMode !== 'none') {
+ // Collapsing vertical action groups with selection is currently unsupported by Spectrum.
+ return;
+ }
+
+ let computeVisibleItems = (visibleItems: number) => {
+ if (domRef.current && wrapperRef.current) {
+ let listItems = Array.from(domRef.current.children) as HTMLLIElement[];
+ let containerSize = orientation === 'horizontal' ? wrapperRef.current.getBoundingClientRect().width : wrapperRef.current.getBoundingClientRect().height;
+
+ let isShowingMenu = visibleItems < state.collection.size;
+ let calculatedSize = 0;
+ let newVisibleItems = 0;
+
+ if (isShowingMenu) {
+ let item = listItems.pop();
+ if (item) {
+ calculatedSize += orientation === 'horizontal'
+ ? outerWidth(item, false, true)
+ : outerHeight(item, false, true);
+ }
+ }
+
+ for (let [i, item] of listItems.entries()) {
+ calculatedSize += orientation === 'horizontal'
+ ? outerWidth(item, i === 0, i === listItems.length - 1)
+ : outerHeight(item, i === 0, i === listItems.length - 1);
+ if (Math.round(calculatedSize) <= Math.round(containerSize)) {
+ newVisibleItems++;
+ } else {
+ break;
+ }
+ }
+
+ // If selection is enabled, and not all of the items fit, collapse all of them into a dropdown
+ // immediately rather than having some visible and some not.
+ if (selectionMode !== 'none' && newVisibleItems < state.collection.size) {
+ return 0;
+ }
+
+ return newVisibleItems;
+ }
+ return visibleItems;
+ };
+
+ setVisibleItems(function *() {
+ let hideButtonText = buttonLabelBehavior === 'hide' && isIconCollapsible;
+
+ // Update to show all items.
+ yield {
+ visibleItems: state.collection.size,
+ hideButtonText,
+ isMeasuring: true
+ };
+
+ // Measure, and update to show the items that fit.
+ let newVisibleItems = computeVisibleItems(state.collection.size);
+ let isMeasuring = newVisibleItems < state.collection.size && newVisibleItems > 0;
+
+ // If not all of the buttons fit, and buttonLabelBehavior is 'collapse', then first try hiding
+ // the button text and only showing icons. Only if that still doesn't fit collapse into a menu.
+ if (newVisibleItems < state.collection.size && buttonLabelBehavior === 'collapse' && isIconCollapsible) {
+ yield {
+ visibleItems: state.collection.size,
+ hideButtonText: true,
+ isMeasuring: true
+ };
+
+ newVisibleItems = computeVisibleItems(state.collection.size);
+ isMeasuring = newVisibleItems < state.collection.size && newVisibleItems > 0;
+ hideButtonText = true;
+ }
+
+ yield {
+ visibleItems: newVisibleItems,
+ hideButtonText,
+ isMeasuring
+ };
+
+ // If the number of items is less than the number of children,
+ // then update again to ensure that the menu fits.
+ if (isMeasuring) {
+ yield {
+ visibleItems: computeVisibleItems(newVisibleItems),
+ hideButtonText,
+ isMeasuring: false
+ };
+ }
+ });
+ }, [domRef, state.collection, setVisibleItems, overflowMode, selectionMode, buttonLabelBehavior, isIconCollapsible, orientation]);
+
+ // Watch the parent element for size changes. Watching only the action group itself may not work
+ // in all scenarios because it may not shrink when available space is reduced.
+ let parentRef = useMemo(() => ({
+ get current() {
+ return wrapperRef.current?.parentElement;
+ }
+ }), [wrapperRef]);
+ useResizeObserver({ref: overflowMode !== 'wrap' ? parentRef : undefined, onResize: updateOverflow});
+ useLayoutEffect(updateOverflow, [updateOverflow, state.collection]);
+
+ let children = [...state.collection];
+ let menuItem: ReactElement | null = null;
+ let menuProps = {};
+
+ // If there are no visible items, don't apply any props to the action group container
+ // and pass all aria labeling props through to the menu button.
+ if (overflowMode === 'collapse' && visibleItems === 0) {
+ menuProps = filterDOMProps(props, {labelable: true});
+ actionGroupProps = {};
+ }
+
+ if (overflowMode === 'collapse' && visibleItems < state.collection.size) {
+ let menuChildren = children.slice(visibleItems);
+ children = children.slice(0, visibleItems);
+ menuItem = (
+
+ );
+ }
+
+ let style = {
+ ...styleProps.style,
+ // While measuring, take up as much space as possible.
+ flexBasis: isMeasuring ? '100%' : undefined
+ };
+
+ return (
+
+
+
+
+ {children.map((item) => (
+
+ ))}
+ {menuItem}
+
+
+
+
+ );
+}) as (props: SpectrumActionGroupProps & {ref?: DOMRef}) => ReactElement;
+
+interface ActionGroupItemProps extends DOMProps, StyleProps {
+ item: Node,
+ state: ListState,
+ isDisabled?: boolean,
+ isEmphasized?: boolean,
+ staticColor?: 'white' | 'black',
+ hideButtonText?: boolean,
+ orientation?: 'horizontal' | 'vertical',
+ onAction?: (key: Key) => void
+}
+
+function ActionGroupItem({item, state, isDisabled, isEmphasized, staticColor, onAction, hideButtonText, orientation}: ActionGroupItemProps) {
+ let ref = useRef(null);
+ let {buttonProps} = useActionGroupItem({key: item.key}, state);
+ isDisabled = isDisabled || state.disabledKeys.has(item.key);
+ let isSelected = state.selectionManager.isSelected(item.key);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let domProps = filterDOMProps(item.props);
+
+ if (onAction && !isDisabled) {
+ buttonProps = mergeProps(buttonProps, {
+ onPress: () => onAction(item.key)
+ });
+ }
+
+ // If button text is hidden, we need to show it as a tooltip instead, so
+ // go find the text element in the DOM after rendering.
+ let textId = useId();
+ let [textContent, setTextContent] = useState('');
+ useLayoutEffect(() => {
+ if (hideButtonText) {
+ setTextContent(document.getElementById(textId)?.textContent);
+ }
+ }, [hideButtonText, item.rendered, textId]);
+
+ let button = (
+ // Use a PressResponder to send DOM props through.
+ // ActionButton doesn't allow overriding the role by default.
+
+
+
+
+ {item.rendered}
+
+
+
+
+ );
+
+ if (hideButtonText && textContent) {
+ button = (
+
+ {button}
+ {textContent}
+
+ );
+ }
+
+ if (item.wrapper) {
+ button = item.wrapper(button);
+ }
+
+ return button;
+}
+
+interface ActionGroupMenuProps extends AriaLabelingProps {
+ state: ListState,
+ isDisabled?: boolean,
+ isEmphasized?: boolean,
+ staticColor?: 'white' | 'black',
+ items: Node[],
+ hideButtonText?: boolean,
+ summaryIcon?: ReactNode,
+ isOnlyItem?: boolean,
+ orientation?: 'horizontal' | 'vertical',
+ onAction?: (key: Key) => void
+}
+
+function ActionGroupMenu({state, isDisabled, isEmphasized, staticColor, items, onAction, summaryIcon, hideButtonText, isOnlyItem, orientation, ...otherProps}: ActionGroupMenuProps) {
+ // Use the key of the first item within the menu as the key of the button.
+ // The key must actually exist in the collection for focus to work correctly.
+ let key = items[0].key;
+ let {buttonProps} = useActionGroupItem({key}, state);
+
+ // The menu button shouldn't act like an actual action group item.
+ delete buttonProps.onPress;
+ delete buttonProps.role;
+ delete buttonProps['aria-checked'];
+
+ let {hoverProps, isHovered} = useHover({isDisabled});
+
+ // If no aria-label or aria-labelledby is given, provide a default one.
+ let ariaLabel = otherProps['aria-label'] || (otherProps['aria-labelledby'] ? undefined : '…');
+ let ariaLabelledby = otherProps['aria-labelledby'];
+ let textId = useId();
+ let id = useId();
+
+ // Summary icon only applies when selection is enabled.
+ if (state.selectionManager.selectionMode === 'none') {
+ summaryIcon = null;
+ }
+
+ let iconOnly = false;
+
+ // If there is a selection, show the selected state on the menu button.
+ let isSelected = state.selectionManager.selectionMode !== 'none' && !state.selectionManager.isEmpty;
+
+ // If single selection and empty selection is not allowed, swap the contents of the button to the selected item (like a Picker).
+ if (!summaryIcon && state.selectionManager.selectionMode === 'single' && state.selectionManager.disallowEmptySelection && state.selectionManager.firstSelectedKey != null) {
+ let selectedItem = state.collection.getItem(state.selectionManager.firstSelectedKey);
+ if (selectedItem) {
+ summaryIcon = selectedItem.rendered;
+ if (typeof summaryIcon === 'string') {
+ summaryIcon = {summaryIcon} ;
+ }
+ iconOnly = !!hideButtonText;
+ ariaLabelledby = `${ariaLabelledby ?? id} ${textId}`;
+ }
+ }
+
+ if (summaryIcon) {
+ // If there's a custom summary icon, also add a chevron.
+ summaryIcon = (
+ <>
+
+
+ {summaryIcon}
+
+ >
+ );
+ }
+
+ return (
+ // Use a PressResponder to send DOM props through.
+
+
+
+
+ {summaryIcon || }
+
+
+
+ state.selectionManager.setSelectedKeys(keys)}
+ onAction={onAction}>
+ {node => - {node.rendered}
}
+
+
+ );
+}
+
+function outerWidth(element: HTMLElement, ignoreLeftMargin: boolean, ignoreRightMargin: boolean) {
+ let style = window.getComputedStyle(element);
+ return element.getBoundingClientRect().width + (ignoreLeftMargin ? 0 : toNumber(style.marginLeft)) + (ignoreRightMargin ? 0 : toNumber(style.marginRight));
+}
+
+
+function outerHeight(element: HTMLElement, ignoreTopMargin: boolean, ignoreBottomMargin: boolean) {
+ let style = window.getComputedStyle(element);
+ return element.getBoundingClientRect().height + (ignoreTopMargin ? 0 : toNumber(style.marginTop)) + (ignoreBottomMargin ? 0 : toNumber(style.marginBottom));
+}
+
+function toNumber(value: string) {
+ let parsed = parseInt(value, 10);
+ return isNaN(parsed) ? 0 : parsed;
+}
diff --git a/packages/@fds-design/actiongroup/src/index.ts b/packages/@fds-design/actiongroup/src/index.ts
new file mode 100644
index 0000000..a72ca7b
--- /dev/null
+++ b/packages/@fds-design/actiongroup/src/index.ts
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2020 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.
+ */
+///
+export {ActionGroup} from './ActionGroup';
+export {Item} from '@react-stately/collections';
+export type {SpectrumActionGroupProps} from '@react-types/actiongroup';
diff --git a/packages/@fds-design/actiongroup/stories/ActionGroup.stories.tsx b/packages/@fds-design/actiongroup/stories/ActionGroup.stories.tsx
new file mode 100644
index 0000000..352e0ad
--- /dev/null
+++ b/packages/@fds-design/actiongroup/stories/ActionGroup.stories.tsx
@@ -0,0 +1,343 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {ActionGroup} from '../';
+import BookIcon from '@spectrum-icons/workflow/Book';
+import Brush from '@spectrum-icons/workflow/Brush';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import CopyIcon from '@spectrum-icons/workflow/Copy';
+import DeleteIcon from '@spectrum-icons/workflow/Delete';
+import DocumentIcon from '@spectrum-icons/workflow/Document';
+import DrawIcon from '@spectrum-icons/workflow/Draw';
+import DuplicateIcon from '@spectrum-icons/workflow/Duplicate';
+import {Flex} from '@react-spectrum/layout';
+import Heal from '@spectrum-icons/workflow/Heal';
+import InfoIcon from '@spectrum-icons/workflow/Info';
+import {Item} from '@react-stately/collections';
+import MoveIcon from '@spectrum-icons/workflow/MoveTo';
+import PropertiesIcon from '@spectrum-icons/workflow/Properties';
+import React from 'react';
+import Sampler from '@spectrum-icons/workflow/Sampler';
+import Select from '@spectrum-icons/workflow/Select';
+import SettingsIcon from '@spectrum-icons/workflow/Settings';
+import {Text} from '@react-spectrum/text';
+import TextIcon from '@spectrum-icons/workflow/Text';
+import {Tooltip, TooltipTrigger} from '@react-spectrum/tooltip';
+import VectorDraw from '@spectrum-icons/workflow/VectorDraw';
+import {View} from '@react-spectrum/view';
+import ViewCardIcon from '@spectrum-icons/workflow/ViewCard';
+import ViewGridIcon from '@spectrum-icons/workflow/ViewGrid';
+import ViewListIcon from '@spectrum-icons/workflow/ViewList';
+
+
+const viewItems = [{children: 'Grid view', name: '1'}, {children: 'List view', name: '2'}, {children: 'Gallery view', name: '3'}];
+let onSelectionChange = action('onSelectionChange');
+
+let iconMap = {
+ 'Document setup': DocumentIcon,
+ 'Settings': SettingsIcon,
+ 'Grid view': ViewGridIcon,
+ 'List view': ViewListIcon,
+ 'Gallery view': ViewCardIcon,
+ 'Edit': DrawIcon,
+ 'Copy': CopyIcon,
+ 'Delete': DeleteIcon,
+ 'Properties': PropertiesIcon,
+ 'Info': InfoIcon,
+ 'Keywords': BookIcon
+};
+
+export default {
+ title: 'ActionGroup',
+ component: ActionGroup,
+ args: {
+ onAction: action('onAction'),
+ onSelectionChange: s => onSelectionChange([...s])
+ },
+ argTypes: {
+ onAction: {
+ table: {
+ disable: true
+ }
+ },
+ onSelectionChange: {
+ table: {
+ disable: true
+ }
+ },
+ disabledKeys: {
+ table: {
+ disable: true
+ }
+ },
+ items: {
+ table: {
+ disable: true
+ }
+ },
+ summaryIcon: {
+ table: {
+ disable: true
+ }
+ },
+ selectionMode: {
+ control: 'select',
+ options: ['none', 'single', 'multiple']
+ },
+ isDisabled: {
+ control: 'boolean'
+ },
+ density: {
+ control: 'select',
+ options: ['compact', 'regular', 'spacious']
+ },
+ isJustified: {
+ control: 'boolean'
+ },
+ isQuiet: {
+ control: 'boolean'
+ },
+ isEmphasized: {
+ control: 'boolean'
+ },
+ disallowEmptySelection: {
+ control: 'boolean'
+ },
+ orientation: {
+ control: 'select',
+ options: ['horizontal', 'vertical']
+ },
+ overflowMode: {
+ control: 'select',
+ options: ['wrap', 'collapse']
+ },
+ buttonLabelBehavior: {
+ control: 'select',
+ options: ['show', 'hide', 'collapse']
+ }
+ }
+} as ComponentMeta;
+
+export type ActionGroupStory = ComponentStoryObj;
+
+export const Default: ActionGroupStory = {
+ args: {items: viewItems},
+ render: (args) => render(args)
+};
+
+export const FalsyKeys: ActionGroupStory = {
+ render: (args) => (
+
+ - Add
+ - Delete
+ - Edit
+
+ )
+};
+
+export const AllKeysDisabled: ActionGroupStory = {
+ ...Default,
+ args: {disabledKeys: ['1', '2', '3'], items: viewItems}
+};
+
+export const SomeKeysDisabled: ActionGroupStory = {
+ ...Default,
+ args: {disabledKeys: ['1', '2'], items: viewItems}
+};
+
+export const StaticColorWhite: ActionGroupStory = {
+ args: {staticColor: 'white', defaultSelectedKeys: ['1'], items: viewItems},
+ render: (args) => (
+
+ {render(args)}
+
+ ),
+ name: 'staticColor=white'
+};
+
+export const StaticColorBlack: ActionGroupStory = {
+ args: {staticColor: 'black', defaultSelectedKeys: ['1'], items: viewItems},
+ render: (args) => (
+
+ {render(args)}
+
+ ),
+ name: 'staticColor=black'
+};
+
+export const WithTooltips: ActionGroupStory = {
+ args: {items: viewItems},
+ render: (args) => renderTooltips(args)
+};
+
+export const Overflow: ActionGroupStory = {
+ args: {disabledKeys: ['1', '5']},
+ render: (args) => renderOverflow(args),
+ name: 'overflowMode'
+};
+
+export const SummaryIcon: ActionGroupStory = {
+ ...Overflow,
+ args: {disabledKeys: ['1', '5'], summaryIcon: },
+ name: 'summary icon overflow'
+};
+
+export const VerticalOverflow: ActionGroupStory = {
+ render: (args) => (
+
+ Note: this is currently unsupported by Spectrum. Container should scroll.
+
+ {renderTools({orientation: 'vertical', buttonLabelBehavior: 'hide', maxHeight: '100%', ...args})}
+
+
+ ),
+ name: 'special vertical overflow case'
+};
+
+
+function render(props) {
+ return (
+
+ {renderText(props)}
+ {renderBoth(props)}
+ {renderIcons(props)}
+
+ );
+}
+
+function renderText(props) {
+ return (
+
+ {(item: any) => - {item.children}
}
+
+ );
+}
+
+function renderBoth(props) {
+ return (
+
+ {(item: any) => {
+ let IconElement = iconMap[item.children];
+ return (
+ -
+
{item.children}
+
+
+ );
+ }}
+
+ );
+}
+
+function renderIcons(props) {
+ return (
+
+ {(item: any) => {
+ let IconElement = iconMap[item.children];
+ return (
+ -
+
+
+ );
+ }}
+
+ );
+}
+
+function renderTooltips(props) {
+ return (
+
+ {(item: any) => {
+ let IconElement = iconMap[item.children];
+ return (
+
+ -
+
+
+ {item.children}
+
+ );
+ }}
+
+ );
+}
+
+function renderOverflow(props) {
+ return (
+
+
} maxHeight="100%">
+
-
+
+ Edit
+
+
-
+
+ Copy
+
+
-
+
+ Delete
+
+
-
+
+ Move
+
+
-
+
+ Duplicate
+
+
+
+ );
+}
+
+function renderTools(props = {}) {
+ return (
+
+ -
+
+ Select
+
+ -
+
+ Text
+
+ -
+
+ Heal
+
+ -
+
+ Brush
+
+ -
+
+ Pen
+
+ -
+
+ Eye dropper
+
+
+ );
+}
diff --git a/packages/@fds-design/actiongroup/stories/Toolbar.stories.tsx b/packages/@fds-design/actiongroup/stories/Toolbar.stories.tsx
new file mode 100644
index 0000000..6f741d9
--- /dev/null
+++ b/packages/@fds-design/actiongroup/stories/Toolbar.stories.tsx
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionGroup} from '../';
+import {AriaLabelingProps, Orientation} from '@react-types/shared';
+import {classNames, SlotProvider, useSlotProps} from '@react-spectrum/utils';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import CopyIcon from '@spectrum-icons/workflow/Copy';
+import DeleteIcon from '@spectrum-icons/workflow/Delete';
+import {Divider} from '@react-spectrum/divider';
+import DrawIcon from '@spectrum-icons/workflow/Draw';
+import InfoIcon from '@spectrum-icons/workflow/Info';
+import {Item} from '@react-stately/collections';
+import PropertiesIcon from '@spectrum-icons/workflow/Properties';
+import {Toolbar as RACToolbar} from 'react-aria-components';
+import React, {ForwardedRef, forwardRef, ReactElement, ReactNode, useMemo} from 'react';
+import styles from './toolbar.css';
+import {Tooltip, TooltipTrigger} from '@react-spectrum/tooltip';
+import {useProviderProps} from '@react-spectrum/provider';
+import ViewCardIcon from '@spectrum-icons/workflow/ViewCard';
+import ViewGridIcon from '@spectrum-icons/workflow/ViewGrid';
+import ViewListIcon from '@spectrum-icons/workflow/ViewList';
+
+
+export interface SpectrumToolbarProps extends AriaLabelingProps {
+ /** The ActionGroups to display in the toolbar. */
+ children: ReactNode | ReactElement[],
+ /**
+ * The orientation of the entire toolbar.
+ * @default 'horizontal'
+ */
+ orientation?: Orientation
+}
+
+export const Toolbar = forwardRef((props: SpectrumToolbarProps, ref: ForwardedRef) => {
+ props = useProviderProps(props);
+ props = useSlotProps(props, 'toolbar');
+ let {
+ orientation = 'horizontal'
+ } = props;
+
+ let slots = useMemo(() => ({
+ actionGroup: {orientation},
+ divider: {orientation: orientation === 'horizontal' ? 'vertical' : 'horizontal', size: 'S'}
+ }), [orientation]);
+ return (
+
+
+ {props.children}
+
+
+ );
+});
+
+export default {
+ title: 'Toolbar',
+ component: Toolbar,
+ argTypes: {
+ children: {
+ table: {
+ disable: true
+ }
+ },
+ orientation: {
+ control: 'radio',
+ options: ['horizontal', 'vertical']
+ }
+ },
+ excludeStories: ['Toolbar']
+} as ComponentMeta;
+
+export type ToolbarStory = ComponentStoryObj;
+
+let items1 = [
+ {id: 'edit', textValue: 'Edit', icon: DrawIcon},
+ {id: 'copy', textValue: 'Copy', icon: CopyIcon},
+ {id: 'delete', textValue: 'Delete', icon: DeleteIcon}
+];
+let items2 = [
+ {id: 'grid', textValue: 'Grid view', icon: ViewGridIcon},
+ {id: 'list', textValue: 'List view', icon: ViewListIcon},
+ {id: 'card', textValue: 'Gallery view', icon: ViewCardIcon}
+];
+let items3 = [
+ {id: 'properties', textValue: 'Properties', icon: PropertiesIcon},
+ {id: 'info', textValue: 'Info', icon: InfoIcon}
+];
+
+
+export const Default: ToolbarStory = {
+ args: {
+ children: (
+ <>
+
+ {(item) => {
+ let Icon = item.icon;
+ return (
+
+
+ {item.textValue}
+
+ );
+ }}
+
+
+
+ {(item) => {
+ let Icon = item.icon;
+ return ;
+ }}
+
+ >
+ )
+ },
+ render: (args) =>
+};
+
+export const DisabledKeys: ToolbarStory = {
+ args: {
+ 'aria-label': 'The big toolbar',
+ children: (
+ <>
+
+ {(item) => {
+ let Icon = item.icon;
+ return (
+
+
+ {item.textValue}
+
+ );
+ }}
+
+
+
+ {(item) => {
+ let Icon = item.icon;
+ return ;
+ }}
+
+
+
+ {(item) => {
+ let Icon = item.icon;
+ return ;
+ }}
+
+ >
+ )
+ }
+};
diff --git a/packages/@fds-design/actiongroup/stories/toolbar.css b/packages/@fds-design/actiongroup/stories/toolbar.css
new file mode 100644
index 0000000..bb30d50
--- /dev/null
+++ b/packages/@fds-design/actiongroup/stories/toolbar.css
@@ -0,0 +1,12 @@
+
+.spectrum-Toolbar {
+ display: flex;
+ gap: 8px;
+ width: fit-content;
+ &[data-orientation="vertical"] {
+ flex-direction: column;
+ }
+ &[data-orientation="horizontal"] {
+ flex-direction: row;
+ }
+}
diff --git a/packages/@fds-design/actiongroup/test/ActionGroup.ssr.test.js b/packages/@fds-design/actiongroup/test/ActionGroup.ssr.test.js
new file mode 100644
index 0000000..9eed9f2
--- /dev/null
+++ b/packages/@fds-design/actiongroup/test/ActionGroup.ssr.test.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('ActionGroup SSR', function () {
+ it('should render without errors', async function () {
+ await testSSR(__filename, `
+ import {ActionGroup, Item} from '../';
+ import {Provider} from '@react-spectrum/provider';
+ import {theme} from '@react-spectrum/theme-default';
+
+
+
+ - One
+
+
+ `);
+ });
+});
diff --git a/packages/@fds-design/actiongroup/test/ActionGroup.test.js b/packages/@fds-design/actiongroup/test/ActionGroup.test.js
new file mode 100644
index 0000000..6d5c8d5
--- /dev/null
+++ b/packages/@fds-design/actiongroup/test/ActionGroup.test.js
@@ -0,0 +1,1163 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, fireEvent, pointerMap, render, screen, within} from '@react-spectrum/test-utils-internal';
+import {ActionGroup} from '../';
+import {Button} from '@react-spectrum/button';
+import {Dialog, DialogTrigger} from '@react-spectrum/dialog';
+import Edit from '@spectrum-icons/workflow/Edit';
+import {Item} from '@react-stately/collections';
+import {Provider} from '@react-spectrum/provider';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+import {theme} from '@react-spectrum/theme-default';
+import {Tooltip, TooltipTrigger} from '@react-spectrum/tooltip';
+import userEvent from '@testing-library/user-event';
+
+// Describes the tabIndex values of button 1 (column 1), 2, and 3 as focus is moved forward or back.
+// e.g. button2Focused describes button 2 having tabindex=0 while all other buttons have -1
+let expectedButtonIndices = {
+ button1Focused: ['0', '-1', '-1'],
+ button2Focused: ['-1', '0', '-1'],
+ button3Focused: ['-1', '-1', '0']
+};
+
+// Returns the expected button tab index configuration from expectedButtonIndicies in response to focus moving `forward` or `backward`
+class BtnBehavior {
+ constructor() {
+ this.index = 0;
+ this.buttons = expectedButtonIndices;
+ this.forward = this.forward.bind(this);
+ this.backward = this.backward.bind(this);
+ }
+ forward() {
+ this.index = (this.index + 1) % 3;
+ return this.current();
+ }
+ backward() {
+ this.index = (this.index + 3 - 1) % 3;
+ return this.current();
+ }
+ current() {
+ return this.buttons[`button${this.index + 1}Focused`];
+ }
+ reset() {
+ this.index = 0;
+ }
+}
+let btnBehavior = new BtnBehavior();
+
+function verifyResult(buttons, values, index) {
+ expect(buttons).checkButtonIndex(values, index);
+}
+
+// Custom error message for button index equality check
+expect.extend({
+ checkButtonIndex(received, tabIndices, i) {
+ let index = received.findIndex((htmlElement, i) => {
+ const receivedValue = htmlElement.getAttribute('tabIndex');
+
+ return receivedValue !== tabIndices[i];
+ });
+
+ if (index !== -1) {
+ return {
+ message: () => `expected button index configuration "button${i + 1}Focused": got (${received.map((button) => button.getAttribute('tabIndex'))}) but expected ${tabIndices}`,
+ pass: false
+ };
+ } else {
+ return {
+ pass: true
+ };
+ }
+ }
+});
+
+function renderComponent(props) {
+ return render(
+
+
+ - Click me 1
+ - Click me 2
+
+
+ );
+}
+
+function renderComponentWithExtraInputs(props) {
+ return render(
+
+
+
+ - Click me 1
+ - Click me 2
+
+
+
+ );
+}
+
+describe('ActionGroup', function () {
+ let user;
+
+ beforeAll(function () {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.useFakeTimers();
+
+ jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation(function () {
+ if (this instanceof HTMLButtonElement) {
+ return {width: 100, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ }
+
+ return {width: 1000, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ });
+ });
+
+ afterEach(() => {
+ btnBehavior.reset();
+ });
+ let tab = async () => await user.tab();
+ let pressArrowRight = async () => await user.keyboard('{ArrowRight}');
+ let pressArrowLeft = async () => await user.keyboard('{ArrowLeft}');
+ let pressArrowUp = async () => await user.keyboard('{ArrowUp}');
+ let pressArrowDown = async () => await user.keyboard('{ArrowDown}');
+
+ it.each`
+ Name | ComponentGroup | Component
+ ${'ActionGroup'} | ${ActionGroup} | ${Item}
+ `('$Name handles defaults', function ({ComponentGroup, Component}) {
+ let {getByRole, getAllByRole} = render(
+
+
+ Click me
+
+
+ );
+ expect(getByRole('toolbar')).toBeTruthy();
+ expect(getAllByRole('button')).toBeTruthy();
+ });
+
+ it.each`
+ Name | ComponentGroup | Component | props
+ ${'ActionGroup'} | ${ActionGroup} | ${Item} | ${{orientation: 'vertical'}}
+ `('$Name handles vertical', function ({ComponentGroup, Component, props}) {
+ let {getByTestId} = render(
+
+
+ Click me
+
+
+ );
+ let group = getByTestId('test-group');
+ expect(group).toHaveAttribute('aria-orientation', 'vertical');
+ });
+
+ it.each`
+ Name | ComponentGroup | Component | props
+ ${'ActionGroup'} | ${ActionGroup} | ${Item} | ${{selectionMode: 'single', isDisabled: true}}
+ `('$Name handles disabled', function ({ComponentGroup, Component, props}) {
+ let {getByRole} = render(
+
+
+ Click me
+
+
+ );
+ let group = getByRole('radiogroup');
+ expect(group).toHaveAttribute('aria-disabled', 'true');
+ });
+
+ it.each`
+ Name | props | orders
+ ${'(left/right arrows, ltr + horizontal) ActionGroup'} | ${{locale: 'de-DE'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowRight, result: btnBehavior.forward}, {action: pressArrowLeft, result: btnBehavior.backward}, {action: pressArrowLeft, result: btnBehavior.backward}]}
+ ${'(left/right arrows, rtl + horizontal) ActionGroup'} | ${{locale: 'ar-AE'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowRight, result: btnBehavior.backward}, {action: pressArrowLeft, result: btnBehavior.forward}, {action: pressArrowLeft, result: btnBehavior.forward}]}
+ ${'(up/down arrows, ltr + horizontal) ActionGroup'} | ${{locale: 'de-DE'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowDown, result: btnBehavior.forward}, {action: pressArrowUp, result: btnBehavior.backward}, {action: pressArrowUp, result: btnBehavior.backward}]}
+ ${'(up/down arrows, rtl + horizontal) ActionGroup'} | ${{locale: 'ar-AE'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowDown, result: btnBehavior.forward}, {action: pressArrowUp, result: btnBehavior.backward}, {action: pressArrowUp, result: btnBehavior.backward}]}
+ ${'(left/right arrows, ltr + vertical) ActionGroup'} | ${{locale: 'de-DE', orientation: 'vertical'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowRight, result: btnBehavior.forward}, {action: pressArrowLeft, result: btnBehavior.backward}, {action: pressArrowLeft, result: btnBehavior.backward}]}
+ ${'(left/right arrows, rtl + vertical) ActionGroup'} | ${{locale: 'ar-AE', orientation: 'vertical'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowRight, result: btnBehavior.forward}, {action: pressArrowLeft, result: btnBehavior.backward}, {action: pressArrowLeft, result: btnBehavior.backward}]}
+ ${'(up/down arrows, ltr + vertical) ActionGroup'} | ${{locale: 'de-DE', orientation: 'vertical'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowDown, result: btnBehavior.forward}, {action: pressArrowUp, result: btnBehavior.backward}, {action: pressArrowUp, result: btnBehavior.backward}]}
+ ${'(up/down arrows, rtl + vertical) ActionGroup'} | ${{locale: 'ar-AE', orientation: 'vertical'}} | ${[{action: tab, result: () => expectedButtonIndices.button1Focused}, {action: pressArrowDown, result: btnBehavior.forward}, {action: pressArrowUp, result: btnBehavior.backward}, {action: pressArrowUp, result: btnBehavior.backward}]}
+ `('$Name shifts button focus in the correct direction on key press', async function ({Name, props, orders}) {
+ let tree = render(
+
+
+ - Click me 1
+ - Click me 2
+ - Click me 3
+
+
+ );
+
+ let buttons = tree.getAllByRole('button');
+
+ let index = 0;
+ for (let {action, result} of orders) {
+ await action();
+ verifyResult(buttons, result(), index);
+ index++;
+ }
+ });
+
+ it.each`
+ Name | props | disabledKeys | orders
+ ${'middle disabled'} | ${{locale: 'de-DE'}} | ${['1']} | ${[{action: tab, result: () => ['0', '-1', '-1']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['0', '-1', '-1']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['0', '-1', '-1']}]}
+ ${'first disabled'} | ${{locale: 'de-DE'}} | ${['0']} | ${[{action: tab, result: () => ['-1', '0', '-1']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['-1', '0', '-1']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['-1', '0', '-1']}]}
+ ${'last disabled'} | ${{locale: 'de-DE'}} | ${['2']} | ${[{action: tab, result: () => ['0', '-1', '-1']}, {action: pressArrowRight, result: () => ['-1', '0', '-1']}, {action: pressArrowRight, result: () => ['0', '-1', '-1']}, {action: pressArrowLeft, result: () => ['-1', '0', '-1']}, {action: pressArrowLeft, result: () => ['0', '-1', '-1']}]}
+ ${'1&2 disabled'} | ${{locale: 'de-DE'}} | ${['0', '1']} | ${[{action: tab, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}]}
+ ${'rtl middle disabled'} | ${{locale: 'ar-AE'}} | ${['1']} | ${[{action: tab, result: () => ['0', '-1', '-1']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['0', '-1', '-1']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['0', '-1', '-1']}]}
+ ${'rtl first disabled'} | ${{locale: 'ar-AE'}} | ${['0']} | ${[{action: tab, result: () => ['-1', '0', '-1']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['-1', '0', '-1']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['-1', '0', '-1']}]}
+ ${'rtl last disabled'} | ${{locale: 'ar-AE'}} | ${['2']} | ${[{action: tab, result: () => ['0', '-1', '-1']}, {action: pressArrowRight, result: () => ['-1', '0', '-1']}, {action: pressArrowRight, result: () => ['0', '-1', '-1']}, {action: pressArrowLeft, result: () => ['-1', '0', '-1']}, {action: pressArrowLeft, result: () => ['0', '-1', '-1']}]}
+ ${'rtl 1&2 disabled'} | ${{locale: 'ar-AE'}} | ${['0', '1']} | ${[{action: tab, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowRight, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['-1', '-1', '0']}]}
+
+ `('$Name skips disabled keys', async function ({Name, props, disabledKeys, orders}) {
+ let tree = render(
+
+
+ - Click me 1
+ - Click me 2
+ - Click me 3
+
+
+ );
+
+ let buttons = tree.getAllByRole('button');
+
+ let index = 0;
+ for (let {action, result} of orders) {
+ await action();
+ verifyResult(buttons, result(), index);
+ index++;
+ }
+ });
+
+ it.each`
+ Name | props | disabledKeys | orders
+ ${'middle two disabled'} | ${{locale: 'de-DE'}} | ${['1', '2']} | ${[{action: tab, result: () => ['0', '-1', '-1', '-1']}, {action: pressArrowRight, result: () => ['-1', '-1', '-1', '0']}, {action: pressArrowRight, result: () => ['0', '-1', '-1', '-1']}, {action: pressArrowLeft, result: () => ['-1', '-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['0', '-1', '-1', '-1']}]}
+ ${'rtl middle two disabled'} | ${{locale: 'de-DE'}} | ${['1', '2']} | ${[{action: tab, result: () => ['0', '-1', '-1', '-1']}, {action: pressArrowRight, result: () => ['-1', '-1', '-1', '0']}, {action: pressArrowRight, result: () => ['0', '-1', '-1', '-1']}, {action: pressArrowLeft, result: () => ['-1', '-1', '-1', '0']}, {action: pressArrowLeft, result: () => ['0', '-1', '-1', '-1']}]}
+ `('$Name skips multiple disabled keys', async function ({Name, props, disabledKeys, orders}) {
+ let tree = render(
+
+
+ - Click me 1
+ - Click me 2
+ - Click me 3
+ - Click me 4
+
+
+ );
+
+ let buttons = tree.getAllByRole('button');
+
+ let index = 0;
+ for (let {action, result} of orders) {
+ await action();
+ verifyResult(buttons, result(), index);
+ index++;
+ }
+ });
+
+ it('should be focusable from Tab', async function () {
+ let tree = renderComponentWithExtraInputs({selectionMode: 'single'});
+
+ let buttonBefore = tree.getByLabelText('ButtonBefore');
+ let buttonAfter = tree.getByLabelText('ButtonAfter');
+ let buttons = tree.getAllByRole('radio');
+ act(() => {buttonBefore.focus();});
+
+ await user.tab();
+ expect(document.activeElement).toBe(buttons[0]);
+
+ await user.tab();
+ expect(document.activeElement).toBe(buttonAfter);
+ });
+
+ it('should be focusable from Shift + Tab', async function () {
+ let tree = renderComponentWithExtraInputs({selectionMode: 'single'});
+
+ let buttonBefore = tree.getByLabelText('ButtonBefore');
+ let buttonAfter = tree.getByLabelText('ButtonAfter');
+ let buttons = tree.getAllByRole('radio');
+ act(() => {buttonAfter.focus();});
+
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(buttons[1]);
+
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(buttonBefore);
+ });
+
+ it('should remember last focused item', async function () {
+ let tree = renderComponentWithExtraInputs({selectionMode: 'single'});
+
+ let buttonBefore = tree.getByLabelText('ButtonBefore');
+ let buttonAfter = tree.getByLabelText('ButtonAfter');
+ let buttons = tree.getAllByRole('radio');
+ act(() => {buttonBefore.focus();});
+
+ await user.tab();
+ expect(document.activeElement).toBe(buttons[0]);
+
+ await pressArrowRight();
+ expect(document.activeElement).toBe(buttons[1]);
+
+ await user.tab();
+ expect(document.activeElement).toBe(buttonAfter);
+
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(buttons[1]);
+ });
+
+ it('ActionGroup handles single selection', async function () {
+ let {getAllByRole} = renderComponent({selectionMode: 'single'});
+
+ let [button1, button2] = getAllByRole('radio');
+ await user.click(button1);
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+
+ await user.click(button2);
+ expect(button1).toHaveAttribute('aria-checked', 'false');
+ expect(button2).toHaveAttribute('aria-checked', 'true');
+ });
+
+ it('ActionGroup handles multiple selection', async function () {
+ let {getByRole, getAllByRole} = renderComponent({selectionMode: 'multiple'});
+
+ expect(getByRole('toolbar')).toBeTruthy();
+ let [button1, button2] = getAllByRole('checkbox');
+ await user.click(button1);
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+
+ await user.click(button2);
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+ expect(button2).toHaveAttribute('aria-checked', 'true');
+ });
+
+ it('ActionGroup should not allow selecting all items with cmd + a', async function () {
+ let {getAllByRole} = renderComponent({selectionMode: 'multiple'});
+
+ let [button1, button2] = getAllByRole('checkbox');
+ await user.click(button1);
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+ expect(button2).toHaveAttribute('aria-checked', 'false');
+
+ await user.keyboard('{Control>}{a}{/Control}');
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+ expect(button2).toHaveAttribute('aria-checked', 'false');
+ });
+
+ it('ActionGroup handles none selection', async function () {
+ let {getByRole} = render(
+
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('button');
+ await user.click(button1);
+ expect(button1).not.toHaveAttribute('aria-checked');
+ });
+
+ it('ActionGroup should pass className, role and tabIndex', function () {
+ let {getByRole} = render(
+
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('radio');
+ expect(button1).not.toHaveAttribute('icon');
+ expect(button1).not.toHaveAttribute('unsafe_classname');
+ expect(button1).toHaveAttribute('class', expect.not.stringContaining('test-class'));
+ expect(button1).toHaveAttribute('class', expect.stringContaining('-item'));
+ expect(button1).toHaveAttribute('role', 'radio');
+ expect(button1).toHaveAttribute('tabIndex', '0');
+ });
+
+ it('ActionGroup handles disabledKeys', async function () {
+ let onSelectionChange = jest.fn();
+ let {getAllByRole} = renderComponent({selectionMode: 'single', disabledKeys: ['1'], onSelectionChange});
+
+ let [button1, button2] = getAllByRole('radio');
+ await user.click(button1);
+ expect(button1).toHaveAttribute('disabled');
+ expect(onSelectionChange).toBeCalledTimes(0);
+ await user.click(button2);
+ expect(button2).not.toHaveAttribute('disabled');
+ expect(onSelectionChange).toBeCalledTimes(1);
+ });
+
+ it('ActionGroup handles selectedKeys (controlled)', async function () {
+ let onSelectionChange = jest.fn();
+ let {getAllByRole} = renderComponent({selectionMode: 'single', selectedKeys: ['1'], onSelectionChange});
+
+ let [button1, button2] = getAllByRole('radio');
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+ expect(button2).toHaveAttribute('aria-checked', 'false');
+ await user.click(button2);
+ expect(onSelectionChange).toBeCalledTimes(1);
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+ expect(button2).toHaveAttribute('aria-checked', 'false');
+ });
+
+ it('ActionGroup handles selectedKeys (uncontrolled)', async function () {
+ let onSelectionChange = jest.fn();
+ let {getAllByRole} = renderComponent({selectionMode: 'single', defaultSelectedKeys: ['1'], onSelectionChange});
+
+ let [button1, button2] = getAllByRole('radio');
+ expect(button1).toHaveAttribute('aria-checked', 'true');
+ expect(button2).toHaveAttribute('aria-checked', 'false');
+ await user.click(button2);
+ expect(onSelectionChange).toBeCalledTimes(1);
+ expect(button1).toHaveAttribute('aria-checked', 'false');
+ expect(button2).toHaveAttribute('aria-checked', 'true');
+ });
+
+ it('ActionGroup deselects the selected button', async function () {
+ let onSelectionChange = jest.fn();
+ let {getAllByRole} = renderComponent({selectionMode: 'single', onSelectionChange});
+
+ let [button1] = getAllByRole('radio');
+ await user.click(button1);
+ expect(onSelectionChange).toBeCalledTimes(1);
+ expect(new Set(onSelectionChange.mock.calls[0][0])).toEqual(new Set(['1']));
+ await user.click(button1);
+ expect(onSelectionChange).toBeCalledTimes(2);
+ expect(new Set(onSelectionChange.mock.calls[1][0])).toEqual(new Set([]));
+ });
+
+ it('ActionGroup allows aria-label', function () {
+ let {getByRole} = render(
+
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('toolbar');
+ expect(button1).toHaveAttribute('aria-label', 'Test');
+ });
+
+ it('ActionGroup allows aria-labelledby', function () {
+ let {getByRole} = render(
+
+ Test
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('toolbar');
+ expect(button1).toHaveAttribute('aria-labelledby', 'test');
+ });
+
+ it('ActionGroup allows aria-describedby', function () {
+ let {getByRole} = render(
+
+ Test
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('toolbar');
+ expect(button1).toHaveAttribute('aria-describedby', 'test');
+ });
+
+ it('ActionGroup allow aria-label on Item', function () {
+ let {getByRole} = render(
+
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('radio');
+ expect(button1).toHaveAttribute('aria-label', 'Test');
+ });
+
+ it('ActionGroup allows custom props', function () {
+ let {getByRole} = render(
+
+
+ - Click me
+
+
+ );
+
+ let button1 = getByRole('toolbar');
+ expect(button1).toHaveAttribute('data-testid', 'test');
+ });
+
+ it('ActionGroup Item allows custom props', function () {
+ let {getAllByRole} = render(
+
+
+ - Click me
+
+
+ );
+
+ let item = getAllByRole('button')[0];
+ expect(item).toHaveAttribute('data-testid', 'test');
+ });
+
+ it('fires onAction when a button is pressed', async function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - Click me
+
+
+ );
+
+ let button = tree.getByRole('button');
+ await user.click(button);
+
+ expect(onAction).toHaveBeenCalledTimes(1);
+ expect(onAction).toHaveBeenCalledWith('test');
+ });
+
+ it('does not fire onAction if the action group is disabled', async function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - Click me
+
+
+ );
+
+ let button = tree.getByRole('button');
+ await user.click(button);
+
+ expect(onAction).not.toHaveBeenCalled();
+ });
+
+ it('does not fire onAction if the item is disabled', async function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - Click me
+
+
+ );
+
+ let button = tree.getByRole('button');
+ await user.click(button);
+
+ expect(onAction).not.toHaveBeenCalled();
+ });
+
+ it('supports DialogTrigger as a wrapper around items', async function () {
+ let tree = render(
+
+
+
+ - Hi
+
+ I'm a dialog
+
+
+
+
+ );
+
+ let button = tree.getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let dialog = tree.getByRole('dialog');
+ expect(dialog).toBeVisible();
+
+ await user.keyboard('{Escape}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(tree.queryByRole('dialog')).toBeNull();
+ });
+
+ it('supports TooltipTrigger as a wrapper around items', async function () {
+ let tree = render(
+
+
+
+ - Hi
+
+ I'm a tooltip
+
+
+
+
+ );
+
+ let button = tree.getByRole('button');
+ await user.keyboard('{Tab}');
+ act(() => button.focus());
+
+ let tooltip = tree.getByRole('tooltip');
+ expect(tooltip).toBeVisible();
+ expect(button).toHaveAttribute('aria-describedby', tooltip.id);
+ });
+
+ it('no infinite loop if all keys are disabled', async function () {
+ let tree = render(
+
+
+
+ - Hi
+ - Bye
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('radiogroup');
+ expect(actiongroup).toHaveAttribute('aria-disabled', 'true');
+ let inputs = tree.getAllByRole('textbox');
+ expect(document.activeElement).toBe(inputs[0]);
+ await user.tab();
+ expect(document.activeElement).toBe(inputs[1]);
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(inputs[0]);
+ });
+
+ it('not disabled if extraneous disabledKeys are provided', async function () {
+ let tree = render(
+
+
+
+ - Hi
+ - Bye
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('radiogroup');
+ expect(actiongroup).not.toHaveAttribute('aria-disabled', 'true');
+ let inputs = tree.getAllByRole('textbox');
+ let buttons = tree.getAllByRole('radio');
+ expect(document.activeElement).toBe(inputs[0]);
+ await user.tab();
+ expect(document.activeElement).toBe(buttons[1]);
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(inputs[0]);
+ });
+
+ it('is disabled if extraneous disabledKeys are provided in addition to all keys being disabled', async function () {
+ let tree = render(
+
+
+
+ - Hi
+ - Bye
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('radiogroup');
+ expect(actiongroup).toHaveAttribute('aria-disabled', 'true');
+ let inputs = tree.getAllByRole('textbox');
+ expect(document.activeElement).toBe(inputs[0]);
+ await user.tab();
+ expect(document.activeElement).toBe(inputs[1]);
+ await user.tab({shift: true});
+ expect(document.activeElement).toBe(inputs[0]);
+ });
+
+ describe('overflowMode="collapse"', function () {
+ beforeEach(() => {
+ jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation(function () {
+ if (this instanceof HTMLButtonElement) {
+ return {width: 100, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ }
+
+ return {width: 250, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ });
+ });
+
+ it('collapses overflowing items into a menu', async function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+ expect(buttons[0]).toHaveTextContent('One');
+ expect(buttons[1]).toHaveAttribute('aria-label', '…');
+ expect(buttons[1]).toHaveAttribute('aria-haspopup', 'true');
+ expect(buttons[1]).not.toHaveAttribute('aria-checked');
+
+ await user.click(buttons[1]);
+
+ let menu = tree.getByRole('menu');
+ let items = within(menu).getAllByRole('menuitem');
+ expect(items).toHaveLength(3);
+ expect(items[0]).toHaveTextContent('Two');
+ expect(items[1]).toHaveTextContent('Three');
+ expect(items[2]).toHaveTextContent('Four');
+
+ await user.click(items[1]);
+ expect(onAction).toHaveBeenCalledWith('three');
+ });
+
+ it('collapsed menu items can have DOM attributes passed to them', async function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+
+ await user.click(buttons[1]);
+
+ let menu = tree.getByRole('menu');
+ let items = within(menu).getAllByRole('menuitem');
+ expect(items[0]).toHaveAttribute('data-element', 'two');
+ });
+
+ it('handles keyboard focus management properly', async function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+ expect(buttons[0]).toHaveAttribute('tabIndex', '0');
+ expect(buttons[1]).toHaveAttribute('tabIndex', '0');
+
+ act(() => buttons[0].focus());
+ expect(buttons[0]).toHaveAttribute('tabIndex', '0');
+ expect(buttons[1]).toHaveAttribute('tabIndex', '-1');
+
+ await pressArrowRight();
+ expect(buttons[0]).toHaveAttribute('tabIndex', '-1');
+ expect(buttons[1]).toHaveAttribute('tabIndex', '0');
+ });
+
+ it('moves focus if the focused button was removed', function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons[0]).toHaveAttribute('tabIndex', '0');
+ expect(buttons[1]).toHaveAttribute('tabIndex', '0');
+
+ act(() => buttons[2].focus());
+ tree.rerender(
+
+
+ - One
+ - Two
+ - Four
+
+
+ );
+ actiongroup = tree.getByRole('toolbar');
+ buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons[0]).toHaveAttribute('tabIndex', '0');
+ expect(buttons[1]).toHaveAttribute('tabIndex', '0');
+ expect(buttons[2]).toHaveAttribute('tabIndex', '0');
+ });
+
+ it('passes aria labeling props through to menu button if it is the only child', async function () {
+ jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation(function () {
+ if (this instanceof HTMLButtonElement) {
+ return {width: 100, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ }
+
+ return {width: 150, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ });
+
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ expect(tree.queryByRole('toolbar')).toBeNull();
+ let button = tree.getByRole('button');
+ expect(button).toHaveAttribute('aria-label', 'Test');
+ expect(button).toHaveAttribute('aria-haspopup', 'true');
+ expect(button).not.toHaveAttribute('aria-checked');
+
+ await user.click(button);
+
+ let menu = tree.getByRole('menu');
+ let items = within(menu).getAllByRole('menuitem');
+ expect(items).toHaveLength(4);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[2]).toHaveTextContent('Three');
+ expect(items[3]).toHaveTextContent('Four');
+
+ await user.click(items[1]);
+ expect(onAction).toHaveBeenCalledWith('two');
+ });
+
+ it('collapses all items if selectionMode="single"', async function () {
+ let onSelectionChange = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ expect(tree.queryByRole('radiogroup')).toBeNull();
+
+ let button = tree.getByRole('button');
+ expect(button).toHaveAttribute('aria-label', '…');
+ expect(button).toHaveAttribute('aria-haspopup', 'true');
+ expect(button).not.toHaveAttribute('aria-checked');
+
+ await user.click(button);
+
+ let menu = tree.getByRole('menu');
+ let items = within(menu).getAllByRole('menuitemradio');
+ expect(items).toHaveLength(4);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[1]).toHaveAttribute('aria-checked', 'true');
+ expect(items[2]).toHaveTextContent('Three');
+ expect(items[3]).toHaveTextContent('Four');
+
+ await user.click(items[2]);
+ expect(onSelectionChange).toHaveBeenCalledTimes(1);
+ expect(new Set(onSelectionChange.mock.calls[0][0])).toEqual(new Set(['three']));
+
+ await user.click(button);
+ menu = tree.getByRole('menu');
+ items = within(menu).getAllByRole('menuitemradio');
+
+ expect(items[1]).not.toHaveAttribute('aria-checked', 'true');
+ expect(items[2]).toHaveAttribute('aria-checked', 'true');
+ });
+
+ it('collapses all items if selectionMode="multiple"', async function () {
+ let onSelectionChange = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ expect(tree.queryByRole('radiogroup')).toBeNull();
+
+ let button = tree.getByRole('button');
+ expect(button).toHaveAttribute('aria-label', '…');
+ expect(button).toHaveAttribute('aria-haspopup', 'true');
+ expect(button).not.toHaveAttribute('aria-checked');
+
+ await user.click(button);
+
+ let menu = tree.getByRole('menu');
+ let items = within(menu).getAllByRole('menuitemcheckbox');
+ expect(items).toHaveLength(4);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[0]).not.toHaveAttribute('aria-checked', 'true');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[1]).toHaveAttribute('aria-checked', 'true');
+ expect(items[2]).toHaveTextContent('Three');
+ expect(items[2]).toHaveAttribute('aria-checked', 'true');
+ expect(items[3]).toHaveTextContent('Four');
+ expect(items[3]).not.toHaveAttribute('aria-checked', 'true');
+
+ await user.click(items[3]);
+ expect(onSelectionChange).toHaveBeenCalledTimes(1);
+ expect(new Set(onSelectionChange.mock.calls[0][0])).toEqual(new Set(['two', 'three', 'four']));
+
+ expect(items[1]).toHaveAttribute('aria-checked', 'true');
+ expect(items[2]).toHaveAttribute('aria-checked', 'true');
+ expect(items[3]).toHaveAttribute('aria-checked', 'true');
+ });
+
+ it('menu button should be disabled if action group is disabled', function () {
+ let onAction = jest.fn();
+ let tree = render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+ expect(buttons[0]).toHaveTextContent('One');
+ expect(buttons[0]).toBeDisabled();
+ expect(buttons[1]).toHaveAttribute('aria-label', '…');
+ expect(buttons[1]).toHaveAttribute('aria-haspopup', 'true');
+ expect(buttons[1]).not.toHaveAttribute('aria-checked');
+ expect(buttons[1]).toBeDisabled();
+ });
+
+ it('menu items should be disabled for items listed in disabledKeys', async function () {
+ const handleOnAction = jest.fn();
+
+ render(
+
+
+ - One
+ - Two
+ - Three
+ - Four
+
+
+ );
+
+ const actionGroup = screen.getByRole('toolbar');
+ expect(within(actionGroup).getAllByRole('button')).toHaveLength(2);
+ expect(within(actionGroup).getByRole('button', {name: 'One'})).toBeVisible();
+
+ const moreButton = within(actionGroup).getByRole('button', {name: '…'});
+ expect(moreButton).not.toHaveAttribute('aria-checked');
+ expect(moreButton).toBeVisible();
+
+ await user.click(moreButton);
+
+ const menu = screen.getByRole('menu');
+ expect(within(menu).getAllByRole('menuitem')).toHaveLength(3);
+
+ const itemTwo = within(menu).getByRole('menuitem', {name: 'Two'});
+ expect(itemTwo).toBeVisible();
+ expect(itemTwo).toHaveAttribute('aria-disabled', 'true');
+
+ const itemThree = within(menu).getByRole('menuitem', {name: 'Three'});
+ expect(itemThree).toBeVisible();
+ expect(itemThree).not.toHaveAttribute('aria-disabled');
+
+ const itemFour = within(menu).getByRole('menuitem', {name: 'Four'});
+ expect(itemFour).toBeVisible();
+ expect(itemFour).toHaveAttribute('aria-disabled', 'true');
+
+ await user.click(itemTwo);
+ expect(handleOnAction).not.toHaveBeenCalled();
+
+ await user.click(itemFour);
+ expect(handleOnAction).not.toHaveBeenCalled();
+
+ await user.click(itemThree);
+ expect(handleOnAction).toHaveBeenCalled();
+ });
+ });
+
+ describe('buttonLabelBehavior', function () {
+ it('should show the text in a tooltip with buttonLabelBehavior="hide"', function () {
+ let tree = render(
+
+
+ -
+
+ One
+
+ -
+
+ Two
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+ expect(buttons[0]).toHaveAttribute('aria-labelledby');
+ let text = document.getElementById(buttons[0].getAttribute('aria-labelledby'));
+ expect(text).toHaveTextContent('One');
+ expect(text).toHaveAttribute('hidden');
+
+ fireEvent.mouseEnter(buttons[0]);
+ fireEvent.mouseMove(buttons[0]);
+ act(() => jest.advanceTimersByTime(2000));
+
+ let tooltip = tree.getByRole('tooltip');
+ expect(tooltip).toHaveTextContent('One');
+ expect(buttons[0]).toHaveAttribute('aria-describedby', tooltip.id);
+ });
+
+ it('should show the text when collapsed into a dropdown', async function () {
+ let tree = render(
+
+
+ -
+
+ One
+
+ -
+
+ Two
+
+ -
+
+ Three
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+
+ await user.click(buttons[1]);
+
+ let menu = tree.getByRole('menu');
+ let items = within(menu).getAllByRole('menuitem');
+ expect(items).toHaveLength(2);
+ expect(items[0]).toHaveTextContent('Two');
+ expect(items[1]).toHaveTextContent('Three');
+ });
+
+ it('should show the text if it fits with buttonLabelBehavior="collapse"', function () {
+ jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation(function () {
+ if (this instanceof HTMLButtonElement) {
+ return this.hasAttribute('aria-labelledby') ? {width: 50, height: 0, top: 0, left: 0, bottom: 0, right: 0} : {width: 100, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ }
+
+ return {width: 300, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ });
+
+ let tree = render(
+
+
+ -
+
+ One
+
+ -
+
+ Two
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+ expect(buttons[0]).not.toHaveAttribute('aria-labelledby');
+ expect(buttons[0]).toHaveTextContent('One');
+ });
+
+ it('should hide the text if it does not fit with buttonLabelBehavior="collapse"', function () {
+ jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation(function () {
+ if (this instanceof HTMLButtonElement) {
+ return this.hasAttribute('aria-labelledby') ? {width: 50, height: 0, top: 0, left: 0, bottom: 0, right: 0} : {width: 100, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ }
+
+ return {width: 150, height: 0, top: 0, left: 0, bottom: 0, right: 0};
+ });
+
+ let tree = render(
+
+
+ -
+
+ One
+
+ -
+
+ Two
+
+
+
+ );
+
+ let actiongroup = tree.getByRole('toolbar');
+ let buttons = within(actiongroup).getAllByRole('button');
+ expect(buttons.length).toBe(2);
+ expect(buttons[0]).toHaveAttribute('aria-labelledby');
+ let text = document.getElementById(buttons[0].getAttribute('aria-labelledby'));
+ expect(text).toHaveTextContent('One');
+ expect(text).toHaveAttribute('hidden');
+
+ fireEvent.mouseEnter(buttons[0]);
+ fireEvent.mouseMove(buttons[0]);
+ act(() => jest.advanceTimersByTime(2000));
+
+ let tooltip = tree.getByRole('tooltip');
+ expect(tooltip).toHaveTextContent('One');
+ expect(buttons[0]).toHaveAttribute('aria-describedby', tooltip.id);
+ });
+ });
+});
diff --git a/packages/@fds-design/actiongroup/test/Toolbar.test.tsx b/packages/@fds-design/actiongroup/test/Toolbar.test.tsx
new file mode 100644
index 0000000..668c9d9
--- /dev/null
+++ b/packages/@fds-design/actiongroup/test/Toolbar.test.tsx
@@ -0,0 +1,452 @@
+/*
+ * Copyright 2023 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, fireEvent, render, screen} from '@testing-library/react';
+import {
+ ActionButton,
+ ActionGroup,
+ defaultTheme,
+ Divider,
+ Item,
+ Provider,
+ Text
+} from '@adobe/react-spectrum';
+import {pointerMap} from '@react-spectrum/test-utils-internal';
+import React from 'react';
+import {Toolbar} from '../stories/Toolbar.stories';
+import userEvent from '@testing-library/user-event';
+
+describe('Toolbar', () => {
+ let user;
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.useFakeTimers();
+ });
+
+ it('renders action buttons for items with keys and children', async () => {
+ render(
+
+
+
+ -
+
Align left
+
+ -
+
Align center
+
+ -
+
Align right
+
+
+
+
+ );
+
+ expect(screen.getAllByRole('button')).toHaveLength(3);
+ });
+
+ it('renders dividers', async () => {
+ const {rerender} = render(
+
+
+
+ -
+
Align left
+
+
+
+
+ -
+
Align center
+
+
+
+
+ -
+
Align right
+
+
+
+
+ );
+
+ expect(screen.getAllByRole('separator')).toHaveLength(2);
+ screen.getAllByRole('separator').forEach((separator) => {
+ expect(separator).toHaveAttribute('aria-orientation', 'vertical');
+ });
+
+ rerender(
+
+
+
+ -
+
Align left
+
+
+
+
+ -
+
Align center
+
+
+
+
+ -
+
Align right
+
+
+
+
+ );
+
+ screen.getAllByRole('separator').forEach((separator) => {
+ expect(separator).not.toHaveAttribute('aria-orientation');
+ });
+ });
+
+ it('sets aria-label', async () => {
+ render(
+
+ Toolbar aria-labelledby
+
+
+
+ -
+
Alight Left
+
+
+
+
+
+ -
+
Align Right
+
+
+
+
+ );
+
+ expect(screen.getByLabelText('Toolbar aria-label')).not.toHaveAttribute('aria-labelledby');
+ expect(screen.getByLabelText('Toolbar aria-label 2')).not.toHaveAttribute('aria-labelledby');
+ });
+
+ it('support actions and selection', async () => {
+ let onAction = jest.fn();
+ let onSelectionChange = jest.fn();
+ render(
+
+
+
+ -
+
Alight Left
+
+ -
+
Align Right
+
+
+
+
+ -
+
List
+
+ -
+
Grid
+
+
+
+
+ );
+ const alignleftButton = screen.getByTestId('alignLeft');
+ const gridButton = screen.getByTestId('grid');
+
+ await user.tab();
+ expect(alignleftButton).toHaveFocus();
+ await user.keyboard('{Enter}');
+ expect(onAction).toHaveBeenCalledTimes(1);
+ expect(onAction).toHaveBeenLastCalledWith('alignleft');
+ onAction.mockReset();
+
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+ expect(gridButton).toHaveFocus();
+ await user.keyboard('{Enter}');
+ expect(onAction).not.toHaveBeenCalled();
+ expect(onSelectionChange).toHaveBeenCalledTimes(1);
+ });
+
+ it('supports keyboard navigation', async() => {
+ render(
+
+ Before
+
+
+ -
+
Align left
+
+ -
+
Align center
+
+ -
+
Align right
+
+
+
+
+ -
+
Zoom in
+
+ -
+
Zoom out
+
+
+
+ After
+
+ );
+
+ const before = screen.getByRole('button', {name: 'Before'});
+ const alignLeft = screen.getByRole('button', {name: 'Align left'});
+ const alignCenter = screen.getByRole('button', {name: 'Align center'});
+ const alignRight = screen.getByRole('button', {name: 'Align right'});
+ const zoomIn = screen.getByRole('button', {name: 'Zoom in'});
+ const zoomOut = screen.getByRole('button', {name: 'Zoom out'});
+ const after = screen.getByRole('button', {name: 'After'});
+
+ await user.tab();
+
+ // Tab enters the toolbar
+ await user.tab();
+ expect(alignLeft).toHaveFocus();
+
+ // Right arrow key navigates to next action buttons
+ await user.keyboard('{ArrowRight}');
+ expect(alignCenter).toHaveFocus();
+ // Down arrow key is controlled by the child component and can wrap
+ await user.keyboard('{ArrowDown}');
+ expect(alignRight).toHaveFocus();
+ await user.keyboard('{ArrowDown}');
+ expect(alignLeft).toHaveFocus();
+ await user.keyboard('{ArrowUp}');
+ expect(alignRight).toHaveFocus();
+
+ // Arrow keys navigate across dividers to other action groups
+ await user.keyboard('{ArrowRight}');
+ expect(zoomIn).toHaveFocus();
+ await user.keyboard('{ArrowLeft}');
+ expect(alignRight).toHaveFocus();
+
+ // Tab exits and shift-tab re-enters the toolbar at the last focused action button
+ // Using await user.tab() doesn't work here because jsdom doesn't take over tabbing
+ // out of the toolbar correctly once focusFirst() or focusLast() is called.
+ // As a workaround, we have to manually fire keyDown and keyUp events to validate
+ // the 'Tab' case of onKeyDown, then manually focus the before and after buttons.
+ await user.tab();
+ act(() => {
+ after.focus();
+ });
+ expect(after).toHaveFocus();
+
+ await user.tab({shift: true});
+ expect(alignRight).toHaveFocus();
+
+ await user.tab({shift: true});
+ act(() => {
+ before.focus();
+ });
+ expect(before).toHaveFocus();
+
+ await user.tab();
+ expect(alignRight).toHaveFocus();
+
+ // Left arrow key navigates to previous action buttons
+ await user.keyboard('{ArrowLeft}');
+ expect(alignCenter).toHaveFocus();
+
+ await user.keyboard('{ArrowLeft}');
+ // Blurring then tabbing re-enters toolbar at the last focused action button
+ fireEvent.blur(alignLeft);
+ act(() => {
+ before.focus();
+ });
+ await user.tab();
+ expect(alignLeft).toHaveFocus();
+
+ // Arrow keys do not wrap across collection
+ await user.keyboard('{ArrowLeft}');
+ expect(alignLeft).toHaveFocus();
+ await user.click(zoomOut);
+ await user.keyboard('{ArrowRight}');
+ expect(zoomOut).toHaveFocus();
+
+ // Other keys don't affect focus
+ await user.keyboard('{Enter}');
+ expect(zoomOut).toHaveFocus();
+ });
+
+ it('supports keyboard navigation with orientation vertical', async () => {
+ render(
+
+ Before
+
+
+ -
+
Align left
+
+ -
+
Align center
+
+ -
+
Align right
+
+
+
+
+ -
+
Zoom in
+
+ -
+
Zoom out
+
+
+
+ After
+
+ );
+
+ const before = screen.getByRole('button', {name: 'Before'});
+ const alignLeft = screen.getByRole('button', {name: 'Align left'});
+ const alignCenter = screen.getByRole('button', {name: 'Align center'});
+ const alignRight = screen.getByRole('button', {name: 'Align right'});
+ const zoomIn = screen.getByRole('button', {name: 'Zoom in'});
+ const zoomOut = screen.getByRole('button', {name: 'Zoom out'});
+ const after = screen.getByRole('button', {name: 'After'});
+
+ await user.tab();
+
+ // Tab enters the toolbar
+ await user.tab();
+ expect(alignLeft).toHaveFocus();
+
+ // Down arrow key navigates to next action buttons
+ await user.keyboard('{ArrowDown}');
+ expect(alignCenter).toHaveFocus();
+ // Right arrow key is controlled by child and can wrap
+ await user.keyboard('{ArrowRight}');
+ expect(alignRight).toHaveFocus();
+ await user.keyboard('{ArrowRight}');
+ expect(alignLeft).toHaveFocus();
+ await user.keyboard('{ArrowLeft}');
+ expect(alignRight).toHaveFocus();
+
+ // Arrow keys navigate across dividers to other action groups
+ await user.keyboard('{ArrowDown}');
+ expect(zoomIn).toHaveFocus();
+ await user.keyboard('{ArrowUp}');
+ expect(alignRight).toHaveFocus();
+
+ // Tab exits and shift-tab re-enters the toolbar at the last focused action button
+ // Using await user.tab() doesn't work here because jsdom doesn't take over tabbing
+ // out of the toolbar correctly once focusFirst() or focusLast() is called.
+ // As a workaround, we have to manually fire keyDown and keyUp events to validate
+ // the 'Tab' case of onKeyDown, then manually focus the before and after buttons.
+ await user.tab();
+ act(() => {
+ after.focus();
+ });
+ expect(after).toHaveFocus();
+
+ await user.tab({shift: true});
+ expect(alignRight).toHaveFocus();
+
+ await user.tab({shift: true});
+ act(() => {
+ before.focus();
+ });
+ expect(before).toHaveFocus();
+
+ await user.tab();
+ expect(alignRight).toHaveFocus();
+
+ // Up arrow key navigates to previous action buttons
+ await user.keyboard('{ArrowUp}');
+ expect(alignCenter).toHaveFocus();
+
+ // Blurring then tabbing re-enters toolbar at the last focused action button
+ fireEvent.blur(alignLeft);
+ act(() => {
+ before.focus();
+ });
+ await user.tab();
+ expect(alignLeft).toHaveFocus();
+
+ // Arrow keys do not wrap across collection
+ await user.keyboard('{ArrowUp}');
+ expect(alignLeft).toHaveFocus();
+ await user.click(zoomOut);
+ await user.keyboard('{ArrowDown}');
+ expect(zoomOut).toHaveFocus();
+
+ // Other keys don't affect focus
+ await user.keyboard('{Enter}');
+ expect(zoomOut).toHaveFocus();
+ });
+
+ it('supports RTL', async () => {
+ render(
+
+ Before
+
+
+ -
+
Align left
+
+ -
+
Align center
+
+ -
+
Align right
+
+
+
+
+ -
+
Zoom in
+
+ -
+
Zoom out
+
+
+
+ After
+
+ );
+
+ await user.tab();
+ await user.tab();
+ expect(screen.getByRole('button', {name: 'Align left'})).toHaveFocus();
+
+ // Left arrow key navigates to next action buttons
+ await user.keyboard('{ArrowLeft}');
+ expect(screen.getByRole('button', {name: 'Align center'})).toHaveFocus();
+ // Up/Down still go the same direction
+ await user.keyboard('{ArrowUp}');
+ expect(screen.getByRole('button', {name: 'Align left'})).toHaveFocus();
+ await user.keyboard('{ArrowDown}');
+ expect(screen.getByRole('button', {name: 'Align center'})).toHaveFocus();
+
+ await user.keyboard('{ArrowLeft}');
+ // Right arrow key navigates to previous action buttons
+ await user.keyboard('{ArrowRight}');
+ expect(screen.getByRole('button', {name: 'Align center'})).toHaveFocus();
+ });
+});
diff --git a/packages/@fds-design/autocomplete/README.md b/packages/@fds-design/autocomplete/README.md
new file mode 100644
index 0000000..13f8c6e
--- /dev/null
+++ b/packages/@fds-design/autocomplete/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/autocomplete
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/autocomplete/chromatic-fc/SearchAutocomplete.stories.tsx b/packages/@fds-design/autocomplete/chromatic-fc/SearchAutocomplete.stories.tsx
new file mode 100644
index 0000000..767d291
--- /dev/null
+++ b/packages/@fds-design/autocomplete/chromatic-fc/SearchAutocomplete.stories.tsx
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Template} from '../chromatic/SearchAutocomplete.stories';
+
+export default {
+ title: 'SearchAutocomplete'
+};
+
+export const PropInputValue = {
+ render: Template,
+ name: 'inputValue: Blah',
+ args: {inputValue: 'Blah'}
+};
diff --git a/packages/@fds-design/autocomplete/chromatic/SearchAutocomplete.stories.tsx b/packages/@fds-design/autocomplete/chromatic/SearchAutocomplete.stories.tsx
new file mode 100644
index 0000000..a6c2d62
--- /dev/null
+++ b/packages/@fds-design/autocomplete/chromatic/SearchAutocomplete.stories.tsx
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import Filter from '@spectrum-icons/workflow/Filter';
+import {generatePowerset} from '@react-spectrum/story-utils';
+import {Grid, repeat} from '@react-spectrum/layout';
+import {Item, SearchAutocomplete} from '../';
+import {Meta, StoryFn} from '@storybook/react';
+import React from 'react';
+import {SpectrumSearchAutocompleteProps} from '@react-types/autocomplete';
+
+// Skipping focus styles because don't have a way of applying it via classnames
+// No controlled open state also means no menu
+let states = [
+ {isQuiet: true},
+ {isReadOnly: true},
+ {isDisabled: true},
+ {validationState: ['valid', 'invalid']},
+ {isRequired: true},
+ {necessityIndicator: 'label'}
+];
+
+let combinations = generatePowerset(states);
+
+function shortName(key, value) {
+ let returnVal = '';
+ switch (key) {
+ case 'isQuiet':
+ returnVal = 'quiet';
+ break;
+ case 'isReadOnly':
+ returnVal = 'ro';
+ break;
+ case 'isDisabled':
+ returnVal = 'disable';
+ break;
+ case 'validationState':
+ returnVal = `vs ${value}`;
+ break;
+ case 'isRequired':
+ returnVal = 'req';
+ break;
+ case 'necessityIndicator':
+ returnVal = 'necInd=label';
+ break;
+ }
+ return returnVal;
+}
+
+const meta: Meta> = {
+ title: 'SearchAutocomplete',
+ parameters: {
+ chromaticProvider: {
+ colorSchemes: ['light', 'dark', 'lightest', 'darkest'],
+ locales: ['en-US'],
+ scales: ['medium', 'large']
+ }
+ },
+ excludeStories: ['Template']
+};
+
+export default meta;
+
+let items = [
+ {name: 'Aardvark', id: '1'},
+ {name: 'Kangaroo', id: '2'},
+ {name: 'Snake', id: '3'}
+];
+
+export const Template: StoryFn> = (args) => (
+
+ {combinations.map(c => {
+ let key = Object.keys(c).map(k => shortName(k, c[k])).join(' ');
+ if (!key) {
+ key = 'empty';
+ }
+
+ return (
+
+ {(item: any) => - {item.name}
}
+
+ );
+ })}
+
+);
+
+// Chromatic can't handle the size of the side label story so removed some extraneous props that don't matter for side label case.
+const TemplateSideLabel: StoryFn> = (args) => (
+
+ {combinations.filter(combo => !(combo.isReadOnly || combo.isDisabled)).map(c => {
+ let key = Object.keys(c).map(k => shortName(k, c[k])).join(' ');
+ if (!key) {
+ key = 'empty';
+ }
+
+ return (
+
+ {(item: any) => - {item.name}
}
+
+ );
+ })}
+
+);
+
+export const PropDefaults = {
+ render: Template,
+ name: 'default',
+ args: {}
+};
+
+export const PropInputValue = {
+ render: Template,
+ name: 'inputValue: Blah',
+ args: {inputValue: 'Blah'}
+};
+
+export const PropAriaLabelled = {
+ render: Template,
+ name: 'aria-label',
+ args: {'aria-label': 'Label'}
+};
+
+export const PropLabelEnd = {
+ render: Template,
+ name: 'label end',
+ args: {...PropDefaults.args, labelAlign: 'end'}
+};
+
+export const PropLabelSide = {
+ render: TemplateSideLabel,
+ name: 'label side',
+ args: {...PropDefaults.args, labelPosition: 'side'}
+};
+
+export const PropCustomWidth = {
+ render: Template,
+ name: 'custom width',
+ args: {...PropDefaults.args, width: 'size-1600'},
+
+ parameters: {
+ chromaticProvider: {
+ express: false
+ }
+ }
+};
+
+export const PropIconFilter = {
+ render: Template,
+ name: 'icon: Filter',
+ args: {...PropDefaults.args, icon: }
+};
+
+export const PropIconNull = {
+ render: Template,
+ name: 'icon: null',
+ args: {...PropDefaults.args, icon: null}
+};
diff --git a/packages/@fds-design/autocomplete/chromatic/SearchAutocompleteRTL.stories.tsx b/packages/@fds-design/autocomplete/chromatic/SearchAutocompleteRTL.stories.tsx
new file mode 100644
index 0000000..7256b26
--- /dev/null
+++ b/packages/@fds-design/autocomplete/chromatic/SearchAutocompleteRTL.stories.tsx
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Meta} from '@storybook/react';
+
+// Original SearchAutocomplete chromatic story was too large to be processed
+const meta: Meta = {
+ title: 'SearchAutocompleteRTL',
+ parameters: {
+ chromaticProvider: {colorSchemes: ['light', 'dark', 'lightest', 'darkest'], locales: ['ar-AE'], scales: ['medium', 'large']}
+ }
+};
+
+export default meta;
+
+export {PropDefaults, PropInputValue, PropAriaLabelled, PropLabelEnd, PropLabelSide, PropCustomWidth, PropIconFilter, PropIconNull} from './SearchAutocomplete.stories';
diff --git a/packages/@fds-design/autocomplete/docs/SearchAutocomplete.mdx b/packages/@fds-design/autocomplete/docs/SearchAutocomplete.mdx
new file mode 100644
index 0000000..9649f54
--- /dev/null
+++ b/packages/@fds-design/autocomplete/docs/SearchAutocomplete.mdx
@@ -0,0 +1,554 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/autocomplete';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/autocomplete/package.json';
+
+```jsx import
+import {SearchAutocomplete, Section, Item} from '@react-spectrum/autocomplete';
+import {useFilter} from '@react-aria/i18n';
+import Email from '@spectrum-icons/workflow/Email';
+import Document from '@spectrum-icons/workflow/Document';
+import WebPages from '@spectrum-icons/workflow/WebPages';
+import SocialNetwork from '@spectrum-icons/workflow/SocialNetwork';
+import ShoppingCart from '@spectrum-icons/workflow/ShoppingCart';
+import Folder from '@spectrum-icons/workflow/Folder';
+import {Text} from '@react-spectrum/text';
+import {Avatar} from "@react-spectrum/avatar";
+```
+
+---
+category: Pickers
+keywords: [search field, input]
+after_version: 3.0.0
+---
+
+# SearchAutocomplete
+
+{docs.exports.SearchAutocomplete.description}
+
+
+
+## Example
+
+```tsx example
+
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+## Content
+SearchAutocomplete follows the [Collection Components](../react-stately/collections.html) API, accepting both static and dynamic collections.
+Similar to [ComboBox](ComboBox.html), SearchAutocomplete accepts `- ` elements as children, each with a `key` prop. Basic usage of SearchAutocomplete, seen in the example above, shows multiple options populated with a string.
+Static collections, as in this example, can be used when the full list of options is known ahead of time.
+
+Dynamic collections, as shown below, can be used when the options come from an external data source such as an API call, or update over time.
+Providing the data in this way allows SearchAutocomplete to automatically cache the rendering of each item, which dramatically improves performance.
+
+As seen below, an iterable list of options is passed to the SearchAutocomplete using the `defaultItems` prop.
+
+```tsx example
+function Example() {
+ let options = [
+ {id: 1, name: 'Aerospace'},
+ {id: 2, name: 'Mechanical'},
+ {id: 3, name: 'Civil'},
+ {id: 4, name: 'Biomedical'},
+ {id: 5, name: 'Nuclear'},
+ {id: 6, name: 'Industrial'},
+ {id: 7, name: 'Chemical'},
+ {id: 8, name: 'Agricultural'},
+ {id: 9, name: 'Electrical'}
+ ];
+
+ return (
+
+ {item => - {item.name}
}
+
+ );
+}
+```
+
+Alternatively, passing your list of options to SearchAutocomplete's `items` prop will cause the list of items to be controlled, useful for when you want to provide your own
+filtering logic. See the [Custom Filtering](#custom-filtering) section for more detail.
+
+### Internationalization
+To internationalize a SearchAutocomplete, a localized string should be passed to the `children` of each `Item`.
+For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the SearchAutocomplete is automatically flipped.
+
+## Labeling
+SearchAutocomplete can be labeled using the `label` prop. If the SearchAutocomplete is a required field, the `isRequired` and `necessityIndicator` props can be used to show a required state.
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+### Accessibility
+
+If a visible label isn't specified, an `aria-label` must be provided to the SearchAutocomplete for
+accessibility. If the field is labeled by a separate element, an `aria-labelledby` prop must be provided using
+the `id` of the labeling element instead.
+
+### Internationalization
+
+In order to internationalize a SearchAutocomplete, a localized string should be passed to the `label` or `aria-label` prop.
+When the `necessityIndicator` prop is set to `"label"`, a localized string will be provided for `"(required)"` or `"(optional)"` automatically.
+
+## Links
+
+By default, interacting with an item in a SearchAutocomplete updates the input value. Alternatively, items may be links to another page or website. This can be achieved by passing the `href` prop to the `- ` component. Interacting with link items navigates to the provided URL and does not update the input value.
+
+```tsx example
+
+ - Adobe
+ - Apple
+ - Google
+ - Microsoft
+
+```
+
+### Client side routing
+
+The `- ` component works with frameworks and client side routers like [Next.js](https://nextjs.org/) and [React Router](https://reactrouter.com/en/main). As with other React Spectrum components that support links, this works via the [Provider](Provider.html) component at the root of your app. See the [client side routing guide](routing.html) to learn how to set this up.
+
+## Sections
+SearchAutocomplete supports sections in order to group options. Sections can be used by wrapping groups of items in a `Section` element. Each `Section` takes a `title` and `key` prop.
+
+### Static items
+```tsx example
+
+
+ - Apple
+ - Banana
+ - Orange
+ - Honeydew
+ - Grapes
+ - Watermelon
+ - Cantaloupe
+ - Pear
+
+
+ - Cabbage
+ - Broccoli
+ - Carrots
+ - Lettuce
+ - Spinach
+ - Bok Choy
+ - Cauliflower
+ - Potatoes
+
+
+```
+
+### Dynamic items
+Sections used with dynamic items are populated from a hierarchical data structure. Please note that `Section` takes an array of data using the `items` prop only.
+
+```tsx example
+function Example() {
+ let options = [
+ {name: 'Fruit', children: [
+ {name: 'Apple'},
+ {name: 'Banana'},
+ {name: 'Orange'},
+ {name: 'Honeydew'},
+ {name: 'Grapes'},
+ {name: 'Watermelon'},
+ {name: 'Cantaloupe'},
+ {name: 'Pear'}
+ ]},
+ {name: 'Vegetable', children: [
+ {name: 'Cabbage'},
+ {name: 'Broccoli'},
+ {name: 'Carrots'},
+ {name: 'Lettuce'},
+ {name: 'Spinach'},
+ {name: 'Bok Choy'},
+ {name: 'Cauliflower'},
+ {name: 'Potatoes'}
+ ]}
+ ];
+
+ return (
+
+ {item => (
+
+ {item => - {item.name}
}
+
+ )}
+
+ );
+}
+```
+
+## Complex items
+Items within SearchAutocomplete also allow for additional content used to better communicate options. Icons, avatars, and descriptions can be added to the `children` of `Item` as shown in the example below.
+If a description is added, the prop `slot="description"` must be used to distinguish the different `` elements.
+See Icon's [labeling](workflow-icons.html#labeling) section and Avatar's [accessibility](Avatar.html#accessibility) section for more information on how to label these elements.
+
+```tsx example
+
+
+ -
+
+ Mail
+ Send and recieve emails
+
+ -
+
+ File Explorer
+ Navigate directories and open files
+
+ -
+
+ Document Editor
+ Edit documents
+
+
+
+ -
+
+ Web Browser
+ Browse the internet
+
+ -
+
+ Social Media
+ Connect with friends
+
+ -
+
+ Shopping
+ Shop online
+
+
+
+```
+
+### With avatars
+
+```tsx example
+
+ -
+
+ User 1
+
+ -
+
+ User 2
+
+ -
+
+ User 3
+
+ -
+
+ User 4
+
+
+```
+
+## Asynchronous loading
+
+SearchAutocomplete supports loading data asynchronously, and will display a progress circle reflecting the current load state,
+set by the `loadingState` prop. It also supports infinite scrolling to load more data on demand as the user scrolls, via the `onLoadMore` prop.
+
+This example uses the [useAsyncList](../react-stately/useAsyncList.html) hook to handle loading the data. See the docs for more information.
+
+```tsx example
+import {useAsyncList} from '@react-stately/data';
+
+interface Character {
+ name: string
+}
+
+function AsyncLoadingExample() {
+ let list = useAsyncList({
+ async load({signal, cursor, filterText}) {
+ if (cursor) {
+ cursor = cursor.replace(/^http:\/\//i, 'https://');
+ }
+
+ // If no cursor is available, then we're loading the first page,
+ // filtering the results returned via a query string that
+ // mirrors the SearchAutocomplete input text.
+ // Otherwise, the cursor is the next URL to load,
+ // as returned from the previous page.
+ let res = await fetch(cursor || `https://swapi.py4e.com/api/people/?search=${filterText}`, {signal});
+ let json = await res.json();
+
+ return {
+ items: json.results,
+ cursor: json.next
+ };
+ }
+ });
+
+ return (
+
+ {item => - {item.name}
}
+
+ );
+}
+```
+
+## Validation
+
+SearchAutocomplete supports the `isRequired` prop to ensure the user enters a value, as well as custom client and server-side validation. It can also be integrated with other form libraries. See the [Forms](forms.html) guide to learn more.
+
+When the [Form](Form.html) component has the `validationBehavior="native"` prop, validation errors block form submission and are displayed as help text automatically. Errors are displayed when the user blurs the search field or submits the form.
+
+```tsx example
+import {Form, ButtonGroup, Button} from '@adobe/react-spectrum';
+
+
+```
+
+By default, `SearchAutocomplete` displays default validation messages provided by the browser. See [Customizing error messages](forms.html#customizing-error-messages) in the Forms guide to learn how to provide your own custom errors.
+
+## Custom Filtering
+By default, SearchAutocomplete uses a string "contains" filtering strategy when deciding what items to display in the dropdown menu. This filtering strategy can be overwritten
+by filtering the list of items yourself and passing the filtered list to the SearchAutocomplete via the `items` prop.
+
+The example below uses a string "startsWith" filter function obtained from the `useFilter` hook to display items that start with the SearchAutocomplete's current input
+value only. By using the `menuTrigger` returned by `onOpenChange`, it also handles displaying the entire option list regardless of the current filter value when the SearchAutocomplete menu is
+opened via the trigger button or arrow keys. `menuTrigger` tells you if the menu was opened manually by the user ("manual"), by focusing the SearchAutocomplete ("focus"), or by
+changes in the input field ("input"), allowing you to make updates to other controlled aspects of your SearchAutocomplete accordingly.
+
+```tsx example
+function Example() {
+ let options = [
+ {id: 1, email: 'fake@email.com'},
+ {id: 2, email: 'anotherfake@email.com'},
+ {id: 3, email: 'bob@email.com'},
+ {id: 4, email: 'joe@email.com'},
+ {id: 5, email: 'yourEmail@email.com'},
+ {id: 6, email: 'valid@email.com'},
+ {id: 7, email: 'spam@email.com'},
+ {id: 8, email: 'newsletter@email.com'},
+ {id: 9, email: 'subscribe@email.com'}
+ ];
+
+ let [showAll, setShowAll] = React.useState(false);
+ let [filterValue, setFilterValue] = React.useState('');
+ let {startsWith} = useFilter({sensitivity: 'base'});
+ let filteredItems = React.useMemo(() => options.filter(item => startsWith(item.email, filterValue)), [options, filterValue]);
+
+ return (
+ {
+ // Show all items if menu is opened manually
+ // i.e. by the arrow keys or trigger button
+ if (menuTrigger === 'manual' && isOpen) {
+ setShowAll(true);
+ }
+ }}
+ width="size-3000"
+ label="Search Email Addresses"
+ items={showAll ? options : filteredItems}
+ inputValue={filterValue}
+ onInputChange={(value) => {
+ setShowAll(false);
+ setFilterValue(value);
+ }}>
+ {item => - {item.email}
}
+
+ );
+}
+```
+
+## Trigger options
+By default, the SearchAutocomplete's menu is opened when the user types into the input field ("input"). There are two other supported modes: one where the menu opens when the SearchAutocomplete is focused ("focus") and
+the other where the menu only opens when the user clicks or taps on the SearchAutocomplete's field button ("manual"). These can be set by providing "focus" or "manual" to the `menuTrigger` prop.
+Guidelines on when to use a specific mode can be found [here](https://spectrum.adobe.com/page/combo-box/#Menu-trigger). Note that the mobile SearchAutocomplete experience requires the end user to press the SearchAutocomplete button
+to open the tray regardless of the `menuTrigger` setting.
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+## Props
+
+
+
+## Visual options
+
+### Label alignment and position
+
+By default, the label is positioned above the SearchAutocomplete. The `labelPosition` prop can be used to position the label to the side.
+The `labelAlign` prop can be used to align the label as "start" or "end". For left-to-right (LTR) languages, "start" refers to the left most edge of the SearchAutocomplete and "end" refers to the right most edge.
+For right-to-left (RTL) languages, this is flipped.
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+### Quiet
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+### Disabled
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+### Read only
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+### Custom widths
+
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+### Menu direction
+```tsx example
+
+ - Red Panda
+ - Cat
+ - Dog
+ - Aardvark
+ - Kangaroo
+ - Snake
+
+```
+
+## Testing
+
+The SearchAutocomplete features an overlay that transitions in and out of the page as it is opened and closed. Depending on
+your device configuration, this overlay may render as a tray or a dropdown and the trigger itself may render as a button or a input. Additionally,
+the SearchAutocomplete features automatic virtualization and may need specific mocks in a test environment to enable said virtualization properly.
+Please see the following sections in the testing docs for more information on how to handle these
+behaviors in your test suite.
+
+[Timers](./testing.html#timers)
+
+[Desktop vs Mobile](./testing.html#desktop-vs-mobile)
+
+[Virtualized Components](./testing.html#virtualized-components)
+
+[Long press](./testing.html#simulating-user-long-press)
+
+Please also refer to [React Spectrum's test suite](https://github.com/adobe/react-spectrum/blob/main/packages/%40react-spectrum/autocomplete/test/SearchAutocomplete.test.js) if you find that the above
+isn't sufficient when resolving issues in your own test cases.
diff --git a/packages/@fds-design/autocomplete/index.ts b/packages/@fds-design/autocomplete/index.ts
new file mode 100644
index 0000000..b1a5da0
--- /dev/null
+++ b/packages/@fds-design/autocomplete/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2021 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/autocomplete/intl/ar-AE.json b/packages/@fds-design/autocomplete/intl/ar-AE.json
new file mode 100644
index 0000000..fd974a2
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/ar-AE.json
@@ -0,0 +1,6 @@
+{
+ "clear": "مسح",
+ "invalid": "(غير صالح)",
+ "loading": "جارٍ التحميل...",
+ "noResults": "لا توجد نتائج"
+}
diff --git a/packages/@fds-design/autocomplete/intl/bg-BG.json b/packages/@fds-design/autocomplete/intl/bg-BG.json
new file mode 100644
index 0000000..8236633
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/bg-BG.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Изчисти",
+ "invalid": "(невалиден)",
+ "loading": "Зареждане...",
+ "noResults": "Няма резултати"
+}
diff --git a/packages/@fds-design/autocomplete/intl/cs-CZ.json b/packages/@fds-design/autocomplete/intl/cs-CZ.json
new file mode 100644
index 0000000..4ad93ca
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/cs-CZ.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Vymazat",
+ "invalid": "(neplatné)",
+ "loading": "Načítání...",
+ "noResults": "Žádné výsledky"
+}
diff --git a/packages/@fds-design/autocomplete/intl/da-DK.json b/packages/@fds-design/autocomplete/intl/da-DK.json
new file mode 100644
index 0000000..8e8aa04
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/da-DK.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Ryd",
+ "invalid": "(ugyldig)",
+ "loading": "Indlæser...",
+ "noResults": "Ingen resultater"
+}
diff --git a/packages/@fds-design/autocomplete/intl/de-DE.json b/packages/@fds-design/autocomplete/intl/de-DE.json
new file mode 100644
index 0000000..2efed8d
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/de-DE.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Löschen",
+ "invalid": "(ungültig)",
+ "loading": "Wird geladen...",
+ "noResults": "Keine Ergebnisse"
+}
diff --git a/packages/@fds-design/autocomplete/intl/el-GR.json b/packages/@fds-design/autocomplete/intl/el-GR.json
new file mode 100644
index 0000000..ad34ada
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/el-GR.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Καθαρισμός",
+ "invalid": "(δεν ισχύει)",
+ "loading": "Φόρτωση...",
+ "noResults": "Χωρίς αποτέλεσμα"
+}
diff --git a/packages/@fds-design/autocomplete/intl/en-US.json b/packages/@fds-design/autocomplete/intl/en-US.json
new file mode 100644
index 0000000..38d1892
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/en-US.json
@@ -0,0 +1,6 @@
+{
+ "loading": "Loading...",
+ "noResults": "No results",
+ "clear": "Clear",
+ "invalid": "(invalid)"
+}
diff --git a/packages/@fds-design/autocomplete/intl/es-ES.json b/packages/@fds-design/autocomplete/intl/es-ES.json
new file mode 100644
index 0000000..697ac32
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/es-ES.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Borrar",
+ "invalid": "(no válido)",
+ "loading": "Cargando…",
+ "noResults": "Sin resultados"
+}
diff --git a/packages/@fds-design/autocomplete/intl/et-EE.json b/packages/@fds-design/autocomplete/intl/et-EE.json
new file mode 100644
index 0000000..c71916a
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/et-EE.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Kustuta",
+ "invalid": "(kehtetu)",
+ "loading": "Laadimine...",
+ "noResults": "Tulemusi pole"
+}
diff --git a/packages/@fds-design/autocomplete/intl/fi-FI.json b/packages/@fds-design/autocomplete/intl/fi-FI.json
new file mode 100644
index 0000000..3bf91ab
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/fi-FI.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Kirkas",
+ "invalid": "(epäkelpo)",
+ "loading": "Ladataan...",
+ "noResults": "Ei tuloksia"
+}
diff --git a/packages/@fds-design/autocomplete/intl/fr-FR.json b/packages/@fds-design/autocomplete/intl/fr-FR.json
new file mode 100644
index 0000000..f7b3af9
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/fr-FR.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Effacer",
+ "invalid": "(non valide)",
+ "loading": "Chargement en cours…",
+ "noResults": "Aucun résultat"
+}
diff --git a/packages/@fds-design/autocomplete/intl/he-IL.json b/packages/@fds-design/autocomplete/intl/he-IL.json
new file mode 100644
index 0000000..350ddbc
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/he-IL.json
@@ -0,0 +1,6 @@
+{
+ "clear": "נקה",
+ "invalid": "(לא חוקי)",
+ "loading": "טוען...",
+ "noResults": "אין תוצאות"
+}
diff --git a/packages/@fds-design/autocomplete/intl/hr-HR.json b/packages/@fds-design/autocomplete/intl/hr-HR.json
new file mode 100644
index 0000000..8af07bf
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/hr-HR.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Izbriši",
+ "invalid": "(nevažeće)",
+ "loading": "Učitavam...",
+ "noResults": "Nema rezultata"
+}
diff --git a/packages/@fds-design/autocomplete/intl/hu-HU.json b/packages/@fds-design/autocomplete/intl/hu-HU.json
new file mode 100644
index 0000000..84c8b9e
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/hu-HU.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Törlés",
+ "invalid": "(érvénytelen)",
+ "loading": "Betöltés folyamatban…",
+ "noResults": "Nincsenek találatok"
+}
diff --git a/packages/@fds-design/autocomplete/intl/it-IT.json b/packages/@fds-design/autocomplete/intl/it-IT.json
new file mode 100644
index 0000000..81767f2
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/it-IT.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Cancella",
+ "invalid": "(non valido)",
+ "loading": "Caricamento...",
+ "noResults": "Nessun risultato"
+}
diff --git a/packages/@fds-design/autocomplete/intl/ja-JP.json b/packages/@fds-design/autocomplete/intl/ja-JP.json
new file mode 100644
index 0000000..da42db4
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/ja-JP.json
@@ -0,0 +1,6 @@
+{
+ "clear": "クリア",
+ "invalid": "(無効)",
+ "loading": "読み込み中...",
+ "noResults": "結果なし"
+}
diff --git a/packages/@fds-design/autocomplete/intl/ko-KR.json b/packages/@fds-design/autocomplete/intl/ko-KR.json
new file mode 100644
index 0000000..e9e0a53
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/ko-KR.json
@@ -0,0 +1,6 @@
+{
+ "clear": "지우기",
+ "invalid": "(유효하지 않음)",
+ "loading": "로드 중...",
+ "noResults": "결과 없음"
+}
diff --git a/packages/@fds-design/autocomplete/intl/lt-LT.json b/packages/@fds-design/autocomplete/intl/lt-LT.json
new file mode 100644
index 0000000..5f9ac99
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/lt-LT.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Išvalyti",
+ "invalid": "(netinkama)",
+ "loading": "Įkeliama...",
+ "noResults": "Rezultatų nėra"
+}
diff --git a/packages/@fds-design/autocomplete/intl/lv-LV.json b/packages/@fds-design/autocomplete/intl/lv-LV.json
new file mode 100644
index 0000000..6a1c086
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/lv-LV.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Notīrīt",
+ "invalid": "(nederīgs)",
+ "loading": "Notiek ielāde...",
+ "noResults": "Nav rezultātu"
+}
diff --git a/packages/@fds-design/autocomplete/intl/nb-NO.json b/packages/@fds-design/autocomplete/intl/nb-NO.json
new file mode 100644
index 0000000..fb3753d
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/nb-NO.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Tøm",
+ "invalid": "(ugyldig)",
+ "loading": "Laster inn...",
+ "noResults": "Ingen resultater"
+}
diff --git a/packages/@fds-design/autocomplete/intl/nl-NL.json b/packages/@fds-design/autocomplete/intl/nl-NL.json
new file mode 100644
index 0000000..6ad4662
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/nl-NL.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Wissen",
+ "invalid": "(ongeldig)",
+ "loading": "Laden...",
+ "noResults": "Geen resultaten"
+}
diff --git a/packages/@fds-design/autocomplete/intl/pl-PL.json b/packages/@fds-design/autocomplete/intl/pl-PL.json
new file mode 100644
index 0000000..142619d
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/pl-PL.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Wyczyść",
+ "invalid": "(nieprawidłowy)",
+ "loading": "Wczytywanie...",
+ "noResults": "Brak wyników"
+}
diff --git a/packages/@fds-design/autocomplete/intl/pt-BR.json b/packages/@fds-design/autocomplete/intl/pt-BR.json
new file mode 100644
index 0000000..30704ea
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/pt-BR.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Limpar",
+ "invalid": "(inválido)",
+ "loading": "Carregando...",
+ "noResults": "Nenhum resultado"
+}
diff --git a/packages/@fds-design/autocomplete/intl/pt-PT.json b/packages/@fds-design/autocomplete/intl/pt-PT.json
new file mode 100644
index 0000000..99be1c1
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/pt-PT.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Limpar",
+ "invalid": "(inválido)",
+ "loading": "A carregar...",
+ "noResults": "Sem resultados"
+}
diff --git a/packages/@fds-design/autocomplete/intl/ro-RO.json b/packages/@fds-design/autocomplete/intl/ro-RO.json
new file mode 100644
index 0000000..97b8051
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/ro-RO.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Golire",
+ "invalid": "(nevalid)",
+ "loading": "Se încarcă...",
+ "noResults": "Niciun rezultat"
+}
diff --git a/packages/@fds-design/autocomplete/intl/ru-RU.json b/packages/@fds-design/autocomplete/intl/ru-RU.json
new file mode 100644
index 0000000..9cef032
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/ru-RU.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Очистить",
+ "invalid": "(недействительно)",
+ "loading": "Загрузка...",
+ "noResults": "Результаты отсутствуют"
+}
diff --git a/packages/@fds-design/autocomplete/intl/sk-SK.json b/packages/@fds-design/autocomplete/intl/sk-SK.json
new file mode 100644
index 0000000..6d78b2d
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/sk-SK.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Vymazať",
+ "invalid": "(neplatné)",
+ "loading": "Načítava sa...",
+ "noResults": "Žiadne výsledky"
+}
diff --git a/packages/@fds-design/autocomplete/intl/sl-SI.json b/packages/@fds-design/autocomplete/intl/sl-SI.json
new file mode 100644
index 0000000..05b3d7c
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/sl-SI.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Pobrišite",
+ "invalid": "(neveljavno)",
+ "loading": "Nalaganje...",
+ "noResults": "Ni rezultatov"
+}
diff --git a/packages/@fds-design/autocomplete/intl/sr-SP.json b/packages/@fds-design/autocomplete/intl/sr-SP.json
new file mode 100644
index 0000000..8af07bf
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/sr-SP.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Izbriši",
+ "invalid": "(nevažeće)",
+ "loading": "Učitavam...",
+ "noResults": "Nema rezultata"
+}
diff --git a/packages/@fds-design/autocomplete/intl/sv-SE.json b/packages/@fds-design/autocomplete/intl/sv-SE.json
new file mode 100644
index 0000000..d2221d8
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/sv-SE.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Rensa",
+ "invalid": "(ogiltigt)",
+ "loading": "Läser in...",
+ "noResults": "Inga resultat"
+}
diff --git a/packages/@fds-design/autocomplete/intl/tr-TR.json b/packages/@fds-design/autocomplete/intl/tr-TR.json
new file mode 100644
index 0000000..b5a5f05
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/tr-TR.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Temizle",
+ "invalid": "(geçersiz)",
+ "loading": "Yükleniyor...",
+ "noResults": "Sonuç yok"
+}
diff --git a/packages/@fds-design/autocomplete/intl/uk-UA.json b/packages/@fds-design/autocomplete/intl/uk-UA.json
new file mode 100644
index 0000000..bb9b44f
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/uk-UA.json
@@ -0,0 +1,6 @@
+{
+ "clear": "Очистити",
+ "invalid": "(недійсне)",
+ "loading": "Завантаження...",
+ "noResults": "Результатів немає"
+}
diff --git a/packages/@fds-design/autocomplete/intl/zh-CN.json b/packages/@fds-design/autocomplete/intl/zh-CN.json
new file mode 100644
index 0000000..9a1363b
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/zh-CN.json
@@ -0,0 +1,6 @@
+{
+ "clear": "清除",
+ "invalid": "(无效)",
+ "loading": "正在加载...",
+ "noResults": "无结果"
+}
diff --git a/packages/@fds-design/autocomplete/intl/zh-TW.json b/packages/@fds-design/autocomplete/intl/zh-TW.json
new file mode 100644
index 0000000..4f8c934
--- /dev/null
+++ b/packages/@fds-design/autocomplete/intl/zh-TW.json
@@ -0,0 +1,6 @@
+{
+ "clear": "清除",
+ "invalid": "(無效)",
+ "loading": "正在載入...",
+ "noResults": "無任何結果"
+}
diff --git a/packages/@fds-design/autocomplete/package.json b/packages/@fds-design/autocomplete/package.json
new file mode 100644
index 0000000..ad8f84a
--- /dev/null
+++ b/packages/@fds-design/autocomplete/package.json
@@ -0,0 +1,78 @@
+{
+ "name": "@fds-design/autocomplete",
+ "version": "3.0.0-alpha.38",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/autocomplete": "3.0.0-alpha.36",
+ "@react-aria/button": "^3.11.0",
+ "@react-aria/dialog": "^3.5.20",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/form": "^3.0.11",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/label": "^3.7.13",
+ "@react-aria/overlays": "^3.24.0",
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/button": "file:../../button",
+ "@react-spectrum/form": "file:../../form",
+ "@react-spectrum/label": "file:../../label",
+ "@react-spectrum/listbox": "file:../../listbox",
+ "@react-spectrum/overlays": "file:../../overlays",
+ "@react-spectrum/progress": "file:../../progress",
+ "@react-spectrum/textfield": "file:../../textfield",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/combobox": "^3.10.1",
+ "@react-types/autocomplete": "3.0.0-alpha.27",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/autocomplete/src/MobileSearchAutocomplete.tsx b/packages/@fds-design/autocomplete/src/MobileSearchAutocomplete.tsx
new file mode 100644
index 0000000..60e246b
--- /dev/null
+++ b/packages/@fds-design/autocomplete/src/MobileSearchAutocomplete.tsx
@@ -0,0 +1,632 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import AlertMedium from '@spectrum-icons/ui/AlertMedium';
+import {AriaButtonProps} from '@react-types/button';
+import CheckmarkMedium from '@spectrum-icons/ui/CheckmarkMedium';
+import {classNames, useFocusableRef} from '../../utils';
+import {ClearButton} from '../../button';
+import {ComboBoxState, useComboBoxState} from '@react-stately/combobox';
+import {DismissButton, useOverlayTrigger} from '@react-aria/overlays';
+import {Field} from '../../label';
+import {FocusableRef, ValidationState} from '@react-types/shared';
+import {focusSafely, FocusScope, useFocusRing} from '@react-aria/focus';
+// @ts-ignore
+import intlMessages from '../intl/*.json';
+import {ListBoxBase, useListBoxLayout} from '../../listbox';
+import Magnifier from '@spectrum-icons/ui/Magnifier';
+import {mergeProps, useFormReset, useId} from '@react-aria/utils';
+import {ProgressCircle} from '../../progress';
+import React, {
+ HTMLAttributes,
+ InputHTMLAttributes,
+ ReactElement,
+ ReactNode,
+ useCallback,
+ useEffect,
+ useRef,
+ useState
+} from 'react';
+import searchAutocompleteStyles from './searchautocomplete.css';
+import searchStyles from '@adobe/spectrum-css-temp/components/search/vars.css';
+import {setInteractionModality, useHover} from '@react-aria/interactions';
+import {SpectrumSearchAutocompleteProps} from '@react-types/autocomplete';
+import styles from '@adobe/spectrum-css-temp/components/inputgroup/vars.css';
+import {TextFieldBase} from '../../textfield';
+import textfieldStyles from '@adobe/spectrum-css-temp/components/textfield/vars.css';
+import {Tray} from '../../overlays';
+import {useButton} from '@react-aria/button';
+import {useDialog} from '@react-aria/dialog';
+import {useField} from '@react-aria/label';
+import {useFilter, useLocalizedStringFormatter} from '@react-aria/i18n';
+import {useFormValidation} from '@react-aria/form';
+import {useProviderProps} from '../../provider';
+import {useSearchAutocomplete} from '@react-aria/autocomplete';
+
+function ForwardMobileSearchAutocomplete(props: SpectrumSearchAutocompleteProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+
+ let {
+ isQuiet,
+ isDisabled,
+ isRequired,
+ validationBehavior,
+ validate,
+ name,
+ isReadOnly,
+ onSubmit = () => {}
+ } = props;
+
+ let {contains} = useFilter({sensitivity: 'base'});
+ let state = useComboBoxState({
+ ...props,
+ defaultFilter: contains,
+ allowsEmptyCollection: true,
+ // Needs to be false here otherwise we double up on commitSelection/commitCustomValue calls when
+ // user taps on underlay (i.e. initial tap will call setFocused(false) -> commitSelection/commitCustomValue via onBlur,
+ // then the closing of the tray will call setFocused(false) again due to cleanup effect)
+ shouldCloseOnBlur: false,
+ allowsCustomValue: true,
+ onSelectionChange: (key) => key !== null && onSubmit(null, key),
+ selectedKey: undefined,
+ defaultSelectedKey: undefined,
+ validate: useCallback(v => validate?.(v.inputValue), [validate])
+ });
+
+ let buttonRef = useRef(null);
+ let domRef = useFocusableRef(ref, buttonRef);
+ let {triggerProps, overlayProps} = useOverlayTrigger({type: 'listbox'}, state, buttonRef);
+
+ let inputRef = useRef(null);
+ useFormValidation({
+ ...props,
+ focus: () => buttonRef.current?.focus()
+ }, state, inputRef);
+ let {isInvalid, validationErrors, validationDetails} = state.displayValidation;
+ let validationState = props.validationState || (isInvalid ? 'invalid' : undefined);
+ let errorMessage = props.errorMessage ?? validationErrors.join(' ');
+
+ let {labelProps, fieldProps, descriptionProps, errorMessageProps} = useField({
+ ...props,
+ labelElementType: 'span',
+ isInvalid,
+ errorMessage
+ });
+
+ // Focus the button and show focus ring when clicking on the label
+ labelProps.onClick = () => {
+ if (!props.isDisabled && buttonRef.current) {
+ buttonRef.current.focus();
+ setInteractionModality('keyboard');
+ }
+ };
+
+ let inputProps: InputHTMLAttributes = {
+ type: 'hidden',
+ name,
+ value: state.inputValue
+ };
+
+ if (validationBehavior === 'native') {
+ // Use a hidden rather than
+ // so that an empty value blocks HTML form submission when the field is required.
+ inputProps.type = 'text';
+ inputProps.hidden = true;
+ inputProps.required = isRequired;
+ // Ignore react warning.
+ inputProps.onChange = () => {};
+ }
+
+ useFormReset(inputRef, state.inputValue, state.setInputValue);
+
+ return (
+ <>
+
+ state.setInputValue('')}
+ onPress={() => !isReadOnly && state.open(null, 'manual')}>
+ {state.inputValue || props.placeholder || ''}
+
+
+
+
+
+
+ >
+ );
+}
+
+export let MobileSearchAutocomplete = React.forwardRef(ForwardMobileSearchAutocomplete) as (props: SpectrumSearchAutocompleteProps & {ref?: FocusableRef}) => ReactElement;
+
+
+interface SearchAutocompleteButtonProps extends AriaButtonProps {
+ icon?: ReactElement | null,
+ isQuiet?: boolean,
+ isDisabled?: boolean,
+ isReadOnly?: boolean,
+ isPlaceholder?: boolean,
+ validationState?: ValidationState,
+ inputValue?: string,
+ clearInput?: () => void,
+ children?: ReactNode,
+ style?: React.CSSProperties,
+ className?: string
+}
+
+// any type is because we don't want to call useObjectRef because this is an internal component and we know
+// we are always passing an object ref
+const SearchAutocompleteButton = React.forwardRef(function SearchAutocompleteButton(props: SearchAutocompleteButtonProps, ref: any) {
+ let searchIcon = (
+
+ );
+
+ let {
+ icon = searchIcon,
+ isQuiet,
+ isDisabled,
+ isReadOnly,
+ isPlaceholder,
+ validationState,
+ inputValue,
+ clearInput,
+ children,
+ style,
+ className
+} = props;
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../autocomplete');
+ let valueId = useId();
+ let invalidId = useId();
+ let validationIcon = validationState === 'invalid'
+ ?
+ : ;
+
+ if (icon) {
+ icon = React.cloneElement(icon, {
+ UNSAFE_className: classNames(
+ textfieldStyles,
+ 'spectrum-Textfield-icon'
+ ),
+ size: 'S'
+ });
+ }
+
+ let clearButton = (
+ {
+ clearInput?.();
+ props?.onPress?.(e);
+ }}
+ preventFocus
+ aria-label={stringFormatter.format('clear')}
+ excludeFromTabOrder
+ UNSAFE_className={
+ classNames(
+ searchStyles,
+ 'spectrum-ClearButton'
+ )
+ }
+ isDisabled={isDisabled} />
+ );
+
+ let validation = React.cloneElement(validationIcon, {
+ UNSAFE_className: classNames(
+ textfieldStyles,
+ 'spectrum-Textfield-validationIcon',
+ classNames(
+ styles,
+ 'spectrum-InputGroup-input-validationIcon'
+ ),
+ classNames(
+ searchStyles,
+ 'spectrum-Search-validationIcon'
+ )
+ )
+ });
+
+ let {hoverProps, isHovered} = useHover({});
+ let {isFocused, isFocusVisible, focusProps} = useFocusRing();
+ let {buttonProps} = useButton({
+ ...props,
+ 'aria-labelledby': [
+ props['aria-labelledby'],
+ props['aria-label'] && !props['aria-labelledby'] ? props.id : null,
+ valueId,
+ validationState === 'invalid' ? invalidId : null
+ ].filter(Boolean).join(' '),
+ elementType: 'div'
+ }, ref);
+
+ return (
+
+
+
+ {icon}
+
+ {children}
+
+
+ {validationState && !isDisabled ? validation : null}
+ {(inputValue !== '' || validationState != null) && !isReadOnly && clearButton}
+
+
+ );
+});
+
+interface SearchAutocompleteTrayProps extends SpectrumSearchAutocompleteProps {
+ state: ComboBoxState,
+ overlayProps: HTMLAttributes,
+ loadingIndicator?: ReactElement,
+ onClose: () => void
+}
+
+function SearchAutocompleteTray(props: SearchAutocompleteTrayProps) {
+ let searchIcon = (
+
+ );
+
+ let {
+ // completionMode = 'suggest',
+ state,
+ icon = searchIcon,
+ isDisabled,
+ validationState,
+ label,
+ overlayProps,
+ loadingState,
+ onLoadMore,
+ onClose,
+ onSubmit
+ } = props;
+
+ let timeout = useRef | null>(null);
+ let [showLoading, setShowLoading] = useState(false);
+ let inputRef = useRef(null);
+ let popoverRef = useRef(null);
+ let listBoxRef = useRef(null);
+ let isLoading = loadingState === 'loading' || loadingState === 'loadingMore';
+ let layout = useListBoxLayout();
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../autocomplete');
+
+ let {inputProps, listBoxProps, labelProps, clearButtonProps} = useSearchAutocomplete(
+ {
+ ...props,
+ layoutDelegate: layout,
+ popoverRef: popoverRef,
+ listBoxRef,
+ inputRef,
+ // Handled outside the tray.
+ name: undefined
+ },
+ state
+ );
+
+ React.useEffect(() => {
+ if (inputRef.current) {
+ focusSafely(inputRef.current);
+ }
+ }, []);
+
+ React.useEffect(() => {
+ // When the tray closes, set state.isFocused (i.e. the tray input's focus tracker) to false.
+ // This is to prevent state.isFocused from being set to true when the tray closes via tapping on the underlay
+ // (FocusScope attempts to restore focus to the tray input when tapping outside the tray due to "contain")
+ // Have to do this manually since React doesn't call onBlur when a component is unmounted: https://github.com/facebook/react/issues/12363
+ if (!state.isOpen && state.isFocused) {
+ state.setFocused(false);
+ }
+ });
+
+ let {dialogProps} = useDialog({
+ 'aria-labelledby': useId(labelProps.id)
+ }, popoverRef);
+
+ // Override the role of the input to "searchbox" instead of "combobox".
+ // Since the listbox is always visible, the combobox role doesn't really give us anything.
+ // VoiceOver on iOS reads "double tap to collapse" when focused on the input rather than
+ // "double tap to edit text", as with a textbox or searchbox. We'd like double tapping to
+ // open the virtual keyboard rather than closing the tray.
+ inputProps.role = 'searchbox';
+ inputProps['aria-haspopup'] = 'listbox';
+ delete inputProps.onTouchEnd;
+
+ let clearButton = (
+
+ );
+
+ let loadingCircle = (
+
+ );
+
+ // Close the software keyboard on scroll to give the user a bigger area to scroll.
+ // But only do this if scrolling with touch, otherwise it can cause issues with touch
+ // screen readers.
+ let isTouchDown = useRef(false);
+ let onTouchStart = () => {
+ isTouchDown.current = true;
+ };
+
+ let onTouchEnd = () => {
+ isTouchDown.current = false;
+ };
+
+ let onScroll = useCallback(() => {
+ if (!inputRef.current || document.activeElement !== inputRef.current || !isTouchDown.current) {
+ return;
+ }
+
+ if (popoverRef.current) {
+ popoverRef.current.focus();
+ }
+ }, [inputRef, popoverRef, isTouchDown]);
+
+ let inputValue = inputProps.value;
+ let lastInputValue = useRef(inputValue);
+ useEffect(() => {
+ if (loadingState === 'filtering' && !showLoading) {
+ if (timeout.current === null) {
+ timeout.current = setTimeout(() => {
+ setShowLoading(true);
+ }, 500);
+ }
+
+ // If user is typing, clear the timer and restart since it is a new request
+ if (inputValue !== lastInputValue.current) {
+ clearTimeout(timeout.current);
+ timeout.current = setTimeout(() => {
+ setShowLoading(true);
+ }, 500);
+ }
+ } else if (loadingState !== 'filtering') {
+ // If loading is no longer happening, clear any timers and hide the loading circle
+ setShowLoading(false);
+ if (timeout.current !== null) {
+ clearTimeout(timeout.current);
+ timeout.current = null;
+ }
+ }
+
+ lastInputValue.current = inputValue;
+ }, [loadingState, inputValue, showLoading]);
+
+ let onKeyDown = (e) => {
+ // Close virtual keyboard, close tray, and fire onSubmit if user hits Enter w/o any focused options
+ if (e.key === 'Enter' && state.selectionManager.focusedKey == null) {
+ popoverRef.current?.focus();
+ if (onClose) {
+ onClose();
+ }
+ if (onSubmit) {
+ onSubmit(inputValue == null ? null : inputValue.toString(), null);
+ }
+ } else {
+ if (inputProps.onKeyDown) {
+ inputProps.onKeyDown(e);
+ }
+ }
+ };
+
+ if (icon) {
+ icon = React.cloneElement(icon, {
+ UNSAFE_className: classNames(
+ textfieldStyles,
+ 'spectrum-Textfield-icon'
+ ),
+ size: 'S'
+ });
+ }
+
+ return (
+
+
+
+
+ loadingState !== 'loading' && (
+
+ {stringFormatter.format('noResults')}
+
+ )}
+ UNSAFE_className={
+ classNames(
+ searchAutocompleteStyles,
+ 'tray-listbox'
+ )
+ }
+ ref={listBoxRef}
+ onScroll={onScroll}
+ onLoadMore={onLoadMore}
+ isLoading={isLoading} />
+
+
+
+ );
+}
diff --git a/packages/@fds-design/autocomplete/src/SearchAutocomplete.tsx b/packages/@fds-design/autocomplete/src/SearchAutocomplete.tsx
new file mode 100644
index 0000000..94f7ccb
--- /dev/null
+++ b/packages/@fds-design/autocomplete/src/SearchAutocomplete.tsx
@@ -0,0 +1,374 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+import {AriaButtonProps} from '@react-types/button';
+import {classNames, dimensionValue, useFocusableRef, useIsMobileDevice, useResizeObserver, useUnwrapDOMRef} from '../../utils';
+import {ClearButton} from '../../button';
+import {DOMRefValue, FocusableRef} from '@react-types/shared';
+import {Field} from '../../label';
+import {filterDOMProps, useLayoutEffect} from '@react-aria/utils';
+import {FocusRing} from '@react-aria/focus';
+// @ts-ignore
+import intlMessages from '../intl/*.json';
+import {ListBoxBase, useListBoxLayout} from '../../listbox';
+import Magnifier from '@spectrum-icons/ui/Magnifier';
+import {MobileSearchAutocomplete} from './MobileSearchAutocomplete';
+import {Popover} from '../../overlays';
+import {ProgressCircle} from '../../progress';
+import React, {
+ forwardRef,
+ InputHTMLAttributes,
+ ReactElement,
+ RefObject,
+ useCallback,
+ useEffect,
+ useRef,
+ useState
+} from 'react';
+import searchAutocompleteStyles from './searchautocomplete.css';
+import searchStyles from '@adobe/spectrum-css-temp/components/search/vars.css';
+import {SpectrumSearchAutocompleteProps} from '@react-types/autocomplete';
+import styles from '@adobe/spectrum-css-temp/components/inputgroup/vars.css';
+import {TextFieldBase} from '../../textfield';
+import textfieldStyles from '@adobe/spectrum-css-temp/components/textfield/vars.css';
+import {useComboBoxState} from '@react-stately/combobox';
+import {useFilter, useLocalizedStringFormatter} from '@react-aria/i18n';
+import {useFormProps} from '../../form';
+import {useHover} from '@react-aria/interactions';
+import {useProvider, useProviderProps} from '../../provider';
+import {useSearchAutocomplete} from '@react-aria/autocomplete';
+
+function SearchAutocomplete(props: SpectrumSearchAutocompleteProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ props = useFormProps(props);
+
+ if (props.placeholder) {
+ console.warn('Placeholders are deprecated due to accessibility issues. Please use help text instead.');
+ }
+
+ let isMobile = useIsMobileDevice();
+ if (isMobile) {
+ // menuTrigger=focus/manual don't apply to mobile searchwithin
+ return ;
+ } else {
+ return ;
+ }
+}
+
+function ForwardSearchAutocompleteBase(props: SpectrumSearchAutocompleteProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+
+ let {
+ menuTrigger = 'input',
+ shouldFlip = true,
+ direction = 'bottom',
+ align = 'start',
+ isQuiet,
+ menuWidth: customMenuWidth,
+ loadingState,
+ onLoadMore,
+ onSubmit = () => {},
+ validate
+ } = props;
+
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../autocomplete');
+ let isAsync = loadingState != null;
+ let popoverRef = useRef>(null);
+ let unwrappedPopoverRef = useUnwrapDOMRef(popoverRef);
+ let listBoxRef = useRef(null);
+ let inputRef = useRef(null);
+ let domRef = useFocusableRef(ref, inputRef);
+
+ let {contains} = useFilter({sensitivity: 'base'});
+ let state = useComboBoxState(
+ {
+ ...props,
+ defaultFilter: contains,
+ allowsEmptyCollection: isAsync,
+ allowsCustomValue: true,
+ onSelectionChange: (key) => key !== null && onSubmit(null, key),
+ selectedKey: undefined,
+ defaultSelectedKey: undefined,
+ validate: useCallback(v => validate?.(v.inputValue), [validate])
+ }
+ );
+ let layout = useListBoxLayout();
+
+ let {inputProps, listBoxProps, labelProps, clearButtonProps, descriptionProps, errorMessageProps, isInvalid, validationErrors, validationDetails} = useSearchAutocomplete(
+ {
+ ...props,
+ layoutDelegate: layout,
+ popoverRef: unwrappedPopoverRef,
+ listBoxRef,
+ inputRef,
+ menuTrigger
+ },
+ state
+ );
+
+ // Measure the width of the inputfield to inform the width of the menu (below).
+ let [menuWidth, setMenuWidth] = useState(0);
+ let {scale} = useProvider();
+
+ let onResize = useCallback(() => {
+ if (inputRef.current) {
+ let inputWidth = inputRef.current.offsetWidth;
+ setMenuWidth(inputWidth);
+ }
+ }, [inputRef, setMenuWidth]);
+
+ useResizeObserver({
+ ref: domRef,
+ onResize: onResize
+ });
+
+ useLayoutEffect(onResize, [scale, onResize]);
+
+ let width = isQuiet ? undefined : menuWidth;
+ let style = {
+ width: customMenuWidth ? dimensionValue(customMenuWidth) : width,
+ minWidth: isQuiet ? `calc(${menuWidth}px + calc(2 * var(--spectrum-dropdown-quiet-offset)))` : menuWidth
+ };
+
+ return (
+ <>
+
+
+
+
+ isAsync && (
+
+ {stringFormatter.format('noResults')}
+
+ )} />
+
+ >
+ );
+}
+
+let SearchAutocompleteBase = React.forwardRef(ForwardSearchAutocompleteBase) as (props: SpectrumSearchAutocompleteProps & {ref?: FocusableRef}) => ReactElement;
+
+
+interface SearchAutocompleteInputProps extends SpectrumSearchAutocompleteProps {
+ inputProps: InputHTMLAttributes,
+ inputRef: RefObject,
+ style?: React.CSSProperties,
+ className?: string,
+ isOpen?: boolean,
+ clearButtonProps: AriaButtonProps
+}
+
+// any type is because we don't want to call useObjectRef because this is an internal component and we know
+// we are always passing an object ref
+function ForwardSearchAutocompleteInput(props: SearchAutocompleteInputProps, ref: any) {
+ let searchIcon = (
+
+ );
+
+ let {
+ icon = searchIcon,
+ isQuiet,
+ isDisabled,
+ isReadOnly,
+ validationState,
+ inputProps,
+ inputRef,
+ autoFocus,
+ style,
+ className,
+ loadingState,
+ isOpen,
+ menuTrigger,
+ clearButtonProps
+ } = props;
+ let {hoverProps, isHovered} = useHover({});
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../autocomplete');
+ let domProps = filterDOMProps(props);
+ let timeout = useRef | null>(null);
+ let [showLoading, setShowLoading] = useState(false);
+
+ let loadingCircle = (
+
+ );
+
+ let clearButton = (
+
+ );
+
+ let isLoading = loadingState === 'loading' || loadingState === 'filtering';
+ let inputValue = inputProps.value;
+ let lastInputValue = useRef(inputValue);
+ useEffect(() => {
+ if (isLoading && !showLoading) {
+ if (timeout.current === null) {
+ timeout.current = setTimeout(() => {
+ setShowLoading(true);
+ }, 500);
+ }
+
+ // If user is typing, clear the timer and restart since it is a new request
+ if (inputValue !== lastInputValue.current) {
+ clearTimeout(timeout.current);
+ timeout.current = setTimeout(() => {
+ setShowLoading(true);
+ }, 500);
+ }
+ } else if (!isLoading) {
+ // If loading is no longer happening, clear any timers and hide the loading circle
+ setShowLoading(false);
+ if (timeout.current != null) {
+ clearTimeout(timeout.current);
+ timeout.current = null;
+ }
+ }
+
+ lastInputValue.current = inputValue;
+ }, [isLoading, showLoading, inputValue]);
+
+ return (
+ (
+ }
+ style={style}
+ className={
+ classNames(
+ styles,
+ 'spectrum-InputGroup',
+ {
+ 'spectrum-InputGroup--quiet': isQuiet,
+ 'is-disabled': isDisabled,
+ 'spectrum-InputGroup--invalid': validationState === 'invalid' && !isDisabled,
+ 'is-hovered': isHovered
+ },
+ classNames(
+ searchAutocompleteStyles,
+ 'searchautocomplete'
+ ),
+ className
+ )
+ }>
+
+
+ )
+ );
+}
+
+let SearchAutocompleteInput = React.forwardRef(ForwardSearchAutocompleteInput) as (props: SearchAutocompleteInputProps & {ref?: any}) => ReactElement;
+
+
+/**
+ * A SearchAutocomplete is a searchfield that supports a dynamic list of suggestions.
+ */
+let ForwardSearchAutocomplete = forwardRef(SearchAutocomplete) as (props: SpectrumSearchAutocompleteProps & {ref?: FocusableRef}) => ReactElement;
+export {ForwardSearchAutocomplete as SearchAutocomplete};
diff --git a/packages/@fds-design/autocomplete/src/index.ts b/packages/@fds-design/autocomplete/src/index.ts
new file mode 100644
index 0000000..1132713
--- /dev/null
+++ b/packages/@fds-design/autocomplete/src/index.ts
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2021 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.
+ */
+///
+export {SearchAutocomplete} from './SearchAutocomplete';
+export {Item, Section} from '@react-stately/collections';
+export type {SpectrumSearchAutocompleteProps} from '@react-types/autocomplete';
diff --git a/packages/@fds-design/autocomplete/src/searchautocomplete.css b/packages/@fds-design/autocomplete/src/searchautocomplete.css
new file mode 100644
index 0000000..7fe7d86
--- /dev/null
+++ b/packages/@fds-design/autocomplete/src/searchautocomplete.css
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2020 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.
+ */
+
+.no-results {
+ display: block;
+ /*
+ Renamed from padding-y to padding-height to fix docs issue where fallback var replaced this value
+ (due to old spectrum-css postcss-custom-properties-custom-mapping plugin).
+ */
+ padding-top: var(--spectrum-selectlist-option-padding-height);
+ padding-inline-start: var(--spectrum-selectlist-option-padding);
+ font-size: var(--spectrum-selectlist-option-text-size);
+ font-weight: var(--spectrum-selectlist-option-text-font-weight);
+}
+
+/* override .spectrum-InputGroup */
+.searchautocomplete.searchautocomplete {
+ border-radius: var(--spectrum-search-border-radius);
+ --spectrum-focus-ring-border-radius: var(--spectrum-search-border-radius);
+}
+
+.mobile-searchautocomplete {
+ outline: none;
+}
+
+.mobile-input {
+ display: flex;
+ align-items: center;
+}
+
+.mobile-value {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.tray-dialog {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ outline: none;
+}
+
+.tray-textfield {
+ margin: var(--spectrum-global-dimension-size-150);
+ margin-bottom: var(--spectrum-global-dimension-size-50);
+ flex-shrink: 0;
+ width: initial !important;
+
+ &.has-label {
+ margin-top: var(--spectrum-global-dimension-size-50);
+ }
+
+ .tray-textfield-input {
+ padding-inline-start: var(--spectrum-textfield-padding-x);
+ }
+}
+
+.tray-listbox {
+ width: 100%;
+ flex: 1;
+}
diff --git a/packages/@fds-design/autocomplete/stories/SearchAutocomplete.stories.tsx b/packages/@fds-design/autocomplete/stories/SearchAutocomplete.stories.tsx
new file mode 100644
index 0000000..d1bf9ce
--- /dev/null
+++ b/packages/@fds-design/autocomplete/stories/SearchAutocomplete.stories.tsx
@@ -0,0 +1,346 @@
+
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {Avatar} from '@react-spectrum/avatar';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import Filter from '@spectrum-icons/workflow/Filter';
+import {Flex} from '@react-spectrum/layout';
+import {Item, SearchAutocomplete} from '@react-spectrum/autocomplete';
+import {mergeProps} from '@react-aria/utils';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+import {useAsyncList} from '@react-stately/data';
+
+
+type SearchAutocompleteStory = ComponentStoryObj;
+
+export default {
+ title: 'SearchAutocomplete',
+ component: SearchAutocomplete,
+ render: (args) => (
+
+ - Aerospace
+ - Mechanical
+ - Civil
+ - Biomedical
+ - Nuclear
+ - Industrial
+ - Chemical
+ - Agricultural
+ - Electrical
+
+ ),
+ args: {
+ label: 'Search with Autocomplete',
+ onOpenChange: action('onOpenChange'),
+ onInputChange: action('onInputChange'),
+ onSelectionChange: action('onSelectionChange'),
+ onBlur: action('onBlur'),
+ onFocus: action('onFocus'),
+ onSubmit: action('onSubmit'),
+ onClear: action('onClear')
+ },
+ argTypes: {
+ defaultItems: {
+ table: {
+ disable: true
+ }
+ },
+ contextualHelp: {
+ table: {
+ disable: true
+ }
+ },
+ onOpenChange: {
+ table: {
+ disable: true
+ }
+ },
+ disabledKeys: {
+ table: {
+ disable: true
+ }
+ },
+ inputValue: {
+ table: {
+ disable: true
+ }
+ },
+ defaultInputValue: {
+ table: {
+ disable: true
+ }
+ },
+ defaultSelectedKey: {
+ table: {
+ disable: true
+ }
+ },
+ selectedKey: {
+ table: {
+ disable: true
+ }
+ },
+ onInputChange: {
+ table: {
+ disable: true
+ }
+ },
+ onSelectionChange: {
+ table: {
+ disable: true
+ }
+ },
+ onBlur: {
+ table: {
+ disable: true
+ }
+ },
+ onFocus: {
+ table: {
+ disable: true
+ }
+ },
+ label: {
+ control: 'text'
+ },
+ 'aria-label': {
+ control: 'text'
+ },
+ isDisabled: {
+ control: 'boolean'
+ },
+ isQuiet: {
+ control: 'boolean'
+ },
+ isReadOnly: {
+ control: 'boolean'
+ },
+ autoFocus: {
+ control: 'boolean'
+ },
+ isRequired: {
+ control: 'boolean'
+ },
+ necessityIndicator: {
+ control: 'select',
+ options: ['icon', 'label']
+ },
+ labelAlign: {
+ control: 'select',
+ options: ['end', 'start']
+ },
+ labelPosition: {
+ control: 'select',
+ options: ['top', 'side']
+ },
+ loadingState: {
+ control: 'select',
+ options: ['idle', 'loading', 'loadingMore', 'filtering']
+ },
+ validationState: {
+ control: 'select',
+ options: [null, 'valid', 'invalid']
+ },
+ description: {
+ control: 'text'
+ },
+ errorMessage: {
+ control: 'text'
+ },
+ menuTrigger: {
+ control: 'select',
+ options: ['focus', 'manual']
+ },
+ direction: {
+ control: 'radio',
+ options: ['top', 'bottom']
+ },
+ align: {
+ control: 'radio',
+ options: ['start', 'end']
+ },
+ width: {
+ control: {
+ type: 'radio',
+ options: [null, '100px', '480px', 'size-4600']
+ }
+ },
+ menuWidth: {
+ control: {
+ type: 'radio',
+ options: [null, '100px', '480px', 'size-4600']
+ }
+ }
+ }
+} as ComponentMeta;
+
+let items = [
+ {id: 1, name: 'Aerospace'},
+ {id: 2, name: 'Mechanical'},
+ {id: 3, name: 'Civil'},
+ {id: 4, name: 'Biomedical'},
+ {id: 5, name: 'Nuclear'},
+ {id: 6, name: 'Industrial'},
+ {id: 7, name: 'Chemical'},
+ {id: 8, name: 'Agricultural'},
+ {id: 9, name: 'Electrical'}
+];
+
+export const Default: SearchAutocompleteStory = {
+ name: 'static items'
+};
+
+export const Dynamic: SearchAutocompleteStory = {
+ args: {defaultItems: items},
+ render: (args) => (
+
+ {(item: any) => - {item.name}
}
+
+ ),
+ name: 'dynamic items'
+};
+
+export const NoItems: SearchAutocompleteStory = {
+ ...Dynamic,
+ args: {defaultItems: []},
+ name: 'no items'
+};
+
+export const MappedItems: SearchAutocompleteStory = {
+ render: (args) => (
+
+ {items.map((item) => (
+ -
+ {item.name}
+
+ ))}
+
+ ),
+ name: 'with mapped items'
+};
+
+
+function CustomOnSubmit(props) {
+ let [searchTerm, setSearchTerm] = React.useState('');
+
+ let onSubmit = (value, key) => {
+ if (value) {
+ setSearchTerm(value);
+ } else if (key) {
+ let term = items.find(o => o.id === key)?.name;
+ setSearchTerm(term ? term : '');
+ }
+ };
+
+ return (
+
+
+ {(item: any) => - {item.name}
}
+
+
+ Search results for: {searchTerm}
+
+
+ );
+}
+
+export const noVisibleLabel: SearchAutocompleteStory = {
+ args: {label: undefined, 'aria-label': 'Search Autocomplete'},
+ name: 'No visible label'
+};
+
+export const customOnSubmit: SearchAutocompleteStory = {
+ render: (args) => ,
+ name: 'custom onSubmit'
+};
+
+export const iconFilter: SearchAutocompleteStory = {
+ args: {icon: },
+ name: 'icon: Filter'
+};
+
+export const iconNull: SearchAutocompleteStory = {
+ args: {icon: null},
+ name: 'icon: null'
+};
+
+export const WithAvatars: SearchAutocompleteStory = {
+ args: {label: 'Search users'},
+ render: (args) => (
+
+ -
+
+ User 1
+
+ -
+
+ User 2
+
+ -
+
+ User 3
+
+ -
+
+ User 4
+
+
+ )
+};
+
+interface Character {
+ name: string
+}
+
+function AsyncLoadingExample() {
+ let list = useAsyncList({
+ async load({signal, cursor, filterText}) {
+ if (cursor) {
+ cursor = cursor.replace(/^http:\/\//i, 'https://');
+ }
+
+ // If no cursor is available, then we're loading the first page,
+ // filtering the results returned via a query string that
+ // mirrors the SearchAutocomplete input text.
+ // Otherwise, the cursor is the next URL to load,
+ // as returned from the previous page.
+ let res = await fetch(cursor || `https://swapi.py4e.com/api/people/?search=${filterText}`, {signal});
+ let json = await res.json();
+
+ return {
+ items: json.results,
+ cursor: json.next
+ };
+ }
+ });
+
+ return (
+
+ {item => - {item.name}
}
+
+ );
+}
+
+export const AsyncList: SearchAutocompleteStory = {
+ render: (args) => (
+
+ )
+};
diff --git a/packages/@fds-design/autocomplete/test/SearchAutocomplete.test.js b/packages/@fds-design/autocomplete/test/SearchAutocomplete.test.js
new file mode 100644
index 0000000..94a04c8
--- /dev/null
+++ b/packages/@fds-design/autocomplete/test/SearchAutocomplete.test.js
@@ -0,0 +1,3351 @@
+/*
+ * Copyright 2020 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.
+ */
+
+jest.mock('@react-aria/live-announcer');
+import {act, fireEvent, pointerMap, render, simulateDesktop, simulateMobile, waitFor, within} from '@react-spectrum/test-utils-internal';
+import {announce} from '@react-aria/live-announcer';
+import {Button} from '@react-spectrum/button';
+import Filter from '@spectrum-icons/workflow/Filter';
+import {Form} from '@react-spectrum/form';
+import {Item, SearchAutocomplete, Section} from '../';
+import {Provider} from '@react-spectrum/provider';
+import React from 'react';
+import scaleMedium from '@adobe/spectrum-css-temp/vars/spectrum-medium-unique.css';
+import themeLight from '@adobe/spectrum-css-temp/vars/spectrum-light-unique.css';
+import userEvent from '@testing-library/user-event';
+
+let theme = {
+ light: themeLight,
+ medium: scaleMedium
+};
+
+let onOpenChange = jest.fn();
+let onInputChange = jest.fn();
+let outerBlur = jest.fn();
+let onFocus = jest.fn();
+let onBlur = jest.fn();
+let onClear = jest.fn();
+
+let defaultProps = {
+ label: 'Test',
+ onOpenChange,
+ onInputChange,
+ onFocus,
+ onBlur,
+ onClear
+};
+
+const ExampleSearchAutocomplete = React.forwardRef((props = {}, ref) => (
+
+
+ - One
+ - Two
+ - Three
+
+
+ ));
+
+function renderSearchAutocomplete(props = {}) {
+ return render( );
+}
+
+function renderSectionSearchAutocomplete(props = {}) {
+ return render(
+
+
+
+
+
+
+ );
+}
+
+let items = [
+ {name: 'One', id: '1'},
+ {name: 'Two', id: '2'},
+ {name: 'Three', id: '3'}
+];
+
+function ControlledValueSearchAutocomplete(props) {
+ let [inputValue, setInputValue] = React.useState('');
+
+ return (
+
+
+ {(item) => - {item.name}
}
+
+
+ );
+}
+
+let initialFilterItems = [
+ {name: 'Aardvark', id: '1'},
+ {name: 'Kangaroo', id: '2'},
+ {name: 'Snake', id: '3'}
+];
+
+describe('SearchAutocomplete', function () {
+ let user;
+ async function testSearchAutocompleteOpen(searchAutocomplete, listbox, focusedItemIndex) {
+ let searchAutocompleteLabelledBy = searchAutocomplete.getAttribute('aria-labelledby');
+
+ expect(listbox).toBeVisible();
+ expect(listbox).toHaveAttribute('aria-label', 'Suggestions');
+ expect(listbox).toHaveAttribute('aria-labelledby', `${listbox.id} ${searchAutocompleteLabelledBy}`);
+ expect(searchAutocomplete).toHaveAttribute('aria-controls', listbox.id);
+ expect(searchAutocomplete).toHaveAttribute('aria-expanded', 'true');
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(3);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[2]).toHaveTextContent('Three');
+
+ expect(listbox).toHaveAttribute('tabIndex', '-1');
+ for (let item of items) {
+ expect(item).not.toHaveAttribute('tabIndex');
+ }
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+
+ if (typeof focusedItemIndex === 'undefined') {
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+ } else {
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[focusedItemIndex].id);
+ }
+ }
+
+ beforeAll(function () {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(() => 1000);
+ jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockImplementation(() => 1000);
+ window.HTMLElement.prototype.scrollIntoView = jest.fn();
+ simulateDesktop();
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ act(() => jest.runAllTimers());
+ });
+
+ afterAll(function () {
+ jest.restoreAllMocks();
+ });
+
+ it('renders correctly', function () {
+ let {getAllByText, getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete).toHaveAttribute('autoCorrect', 'off');
+ expect(searchAutocomplete).toHaveAttribute('spellCheck', 'false');
+ expect(searchAutocomplete).toHaveAttribute('autoComplete', 'off');
+
+ let label = getAllByText('Test')[0];
+ expect(label).toBeVisible();
+ });
+
+ it('should support custom icons', function () {
+ let {getByTestId} = renderSearchAutocomplete({icon: });
+
+ expect(getByTestId('filtericon')).toBeTruthy();
+ });
+
+ it('should support no icons', function () {
+ let {queryByTestId} = renderSearchAutocomplete({icon: null});
+
+ expect(queryByTestId('searchicon')).toBeNull();
+ });
+
+ it('renders with placeholder text and shows warning', function () {
+ let spyWarn = jest.spyOn(console, 'warn').mockImplementation(() => {});
+ let {getByPlaceholderText, getByRole} = renderSearchAutocomplete({placeholder: 'Test placeholder'});
+
+ let searchAutocomplete = getByRole('combobox');
+
+ expect(getByPlaceholderText('Test placeholder')).toBeTruthy();
+ expect(searchAutocomplete.placeholder).toBe('Test placeholder');
+ expect(spyWarn).toHaveBeenCalledWith('Placeholders are deprecated due to accessibility issues. Please use help text instead.');
+ });
+
+ it('can be disabled', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete({isDisabled: true});
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('One');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+ expect(onFocus).not.toHaveBeenCalled();
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+ });
+
+ it('can be readonly', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete({isReadOnly: true, defaultInputValue: 'Blargh'});
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('One');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(searchAutocomplete.value).toBe('Blargh');
+ expect(onOpenChange).not.toHaveBeenCalled();
+ expect(onFocus).toHaveBeenCalled();
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+ });
+
+ it('features default behavior of completionMode suggest and menuTrigger input', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete).not.toHaveAttribute('aria-controls');
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ expect(searchAutocomplete).toHaveAttribute('aria-autocomplete', 'list');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('On');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+
+ expect(searchAutocomplete.value).toBe('On');
+ expect(items[0]).toHaveTextContent('One');
+ expect(searchAutocomplete).toHaveAttribute('aria-controls', listbox.id);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+ });
+
+ it('supports custom data attributes', function () {
+ let {getByRole} = renderSearchAutocomplete({'data-testid': 'test'});
+
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete).toHaveAttribute('data-testid', 'test');
+ });
+
+ describe('refs', function () {
+ it('attaches a ref to the label wrapper', function () {
+ let ref = React.createRef();
+ let {getByText} = renderSearchAutocomplete({ref});
+
+ expect(ref.current.UNSAFE_getDOMNode()).toBe(getByText('Test').parentElement);
+ });
+
+ it('attaches a ref to the searchAutocomplete wrapper if no label', function () {
+ let ref = React.createRef();
+ let {getByRole} = renderSearchAutocomplete({ref, label: null, 'aria-label': 'test'});
+
+ expect(ref.current.UNSAFE_getDOMNode()).toBe(getByRole('combobox').parentElement.parentElement.parentElement.parentElement);
+ });
+
+ it('calling focus() on the ref focuses the input field', function () {
+ let ref = React.createRef();
+ let {getByRole} = renderSearchAutocomplete({ref});
+
+ act(() => {ref.current.focus();});
+ expect(document.activeElement).toBe(getByRole('combobox'));
+ });
+ });
+
+ describe('opening', function () {
+ describe('menuTrigger = focus', function () {
+ it('opens menu when searchAutocomplete is focused', async function () {
+ let {getByRole} = renderSearchAutocomplete({menuTrigger: 'focus'});
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(onOpenChange).toBeCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'focus');
+ await testSearchAutocompleteOpen(searchAutocomplete, listbox);
+ });
+ });
+
+ describe('keyboard input', function () {
+ it('opens the menu on down arrow press', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {searchAutocomplete.focus();});
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'manual');
+ await testSearchAutocompleteOpen(searchAutocomplete, listbox, 0);
+ });
+
+ it('opens the menu on up arrow press', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {searchAutocomplete.focus();});
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+
+ await user.keyboard('{ArrowUp}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'manual');
+ await testSearchAutocompleteOpen(searchAutocomplete, listbox, 2);
+ });
+
+ it('opens the menu on user typing', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {searchAutocomplete.focus();});
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+
+ await user.keyboard('Two');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'input');
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(searchAutocomplete).toHaveAttribute('aria-controls', listbox.id);
+ expect(searchAutocomplete).toHaveAttribute('aria-expanded', 'true');
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ expect(items[0]).toHaveTextContent('Two');
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('doesn\'t select an item on matching input if it is a disabled key', async function () {
+ let {getByRole} = renderSearchAutocomplete({disabledKeys: ['2']});
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {searchAutocomplete.focus();});
+ expect(onOpenChange).not.toHaveBeenCalled();
+ await user.keyboard('Two');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'input');
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ expect(items[0]).toHaveTextContent('Two');
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('closes the menu if there are no matching items', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ expect(onOpenChange).not.toHaveBeenCalled();
+ act(() => {searchAutocomplete.focus();});
+ await user.keyboard('One');
+ act(() => jest.runAllTimers());
+
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'input');
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+
+ await user.keyboard('z');
+ act(() => jest.runAllTimers());
+ expect(queryByRole('listbox')).toBeNull();
+ expect(searchAutocomplete).not.toHaveAttribute('aria-controls');
+ expect(searchAutocomplete).toHaveAttribute('aria-expanded', 'false');
+ });
+
+ it('doesn\'t open the menu if no items match', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => searchAutocomplete.focus());
+ await user.keyboard('X', {skipClick: true});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).not.toHaveBeenCalled();
+ });
+ });
+ });
+ describe('showing menu', function () {
+ it('keeps the menu open if the user clears the input field if menuTrigger = focus', async function () {
+ let {getByRole} = renderSearchAutocomplete({menuTrigger: 'focus'});
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('Two');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+
+ fireEvent.change(searchAutocomplete, {target: {value: ''}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ listbox = getByRole('listbox');
+ items = within(listbox).getAllByRole('option');
+ expect(listbox).toBeVisible();
+ expect(searchAutocomplete).toHaveAttribute('aria-controls', listbox.id);
+ expect(searchAutocomplete).toHaveAttribute('aria-expanded', 'true');
+ expect(items).toHaveLength(3);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[2]).toHaveTextContent('Three');
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('allows the user to navigate the menu via arrow keys', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+
+ await user.keyboard('{ArrowDown}');
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[1].id);
+
+ await user.keyboard('{ArrowUp}');
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+ });
+
+ it('allows the user to select an item via Enter', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete.value).toBe('');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+
+ await user.keyboard('{Enter}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(searchAutocomplete.value).toBe('One');
+ });
+
+ it('doesn\'t focus the first key if the previously focused key is filtered out of the list', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('O');
+ act(() => {
+ jest.runAllTimers();
+ });
+ await user.keyboard('{ArrowDown}');
+ await user.keyboard('{ArrowDown}');
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(2);
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[1].id);
+ expect(items[1].textContent).toBe('Two');
+
+ await user.keyboard('n');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ listbox = getByRole('listbox');
+ items = within(listbox).getAllByRole('option');
+ expect(searchAutocomplete.value).toBe('On');
+ expect(items).toHaveLength(1);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ expect(items[0].textContent).toBe('One');
+ });
+
+ it('closes menu when pressing Enter on an already selected item', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => searchAutocomplete.focus());
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeTruthy();
+
+ await user.keyboard('{Enter}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ });
+ });
+
+ describe('typing in the textfield', function () {
+ it('can be uncontrolled', async function () {
+ let {getByRole} = render(
+
+
+ - Bulbasaur
+ - Squirtle
+ - Charmander
+
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('Bul');
+
+ expect(onOpenChange).toHaveBeenCalled();
+ });
+
+ it('can select by mouse', async function () {
+ let {getByRole} = render(
+
+
+ - Cheer
+ - Cheerio
+ - Cheeriest
+
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('Che');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onOpenChange).toHaveBeenCalled();
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[1]);
+ act(() => {
+ jest.runAllTimers();
+ });
+ });
+
+ it('filters searchAutocomplete items using contains strategy', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(searchAutocomplete).toHaveAttribute('aria-controls', listbox.id);
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(2);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[1]).toHaveTextContent('Two');
+ });
+
+ it('should not match any items if input is just a space', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard(' ');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ });
+
+ it('doesn\'t focus the first item in searchAutocomplete menu if you completely clear your textfield and menuTrigger = focus', async function () {
+ let {getByRole} = renderSearchAutocomplete({menuTrigger: 'focus'});
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+
+ let items = within(listbox).getAllByRole('option');
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.clear(searchAutocomplete);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ listbox = getByRole('listbox');
+ items = within(listbox).getAllByRole('option');
+ expect(listbox).toBeVisible();
+ expect(items).toHaveLength(3);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('doesn\'t closes the menu if you completely clear your textfield and menuTrigger != focus', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+
+ fireEvent.change(searchAutocomplete, {target: {value: ''}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ });
+
+ it('clears prior item focus when input no longer matches existing value if allowsCustomValue is true', function () {
+ let {getByRole} = renderSearchAutocomplete({allowsCustomValue: true});
+ let searchAutocomplete = getByRole('combobox');
+ // Change input value to something matching a searchAutocomplete value
+ act(() => searchAutocomplete.focus());
+ fireEvent.change(searchAutocomplete, {target: {value: 'Two'}});
+ act(() => jest.runAllTimers());
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ expect(listbox).toBeVisible();
+ expect(items).toHaveLength(1);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ expect(items[0].textContent).toBe('Two');
+
+ // Change input text to something that doesn't match any searchAutocomplete items but still shows the menu
+ act(() => searchAutocomplete.focus());
+ fireEvent.change(searchAutocomplete, {target: {value: 'Tw'}});
+ act(() => jest.runAllTimers());
+
+ // check that no item is focused in the menu
+ listbox = getByRole('listbox');
+ items = within(listbox).getAllByRole('option');
+ expect(listbox).toBeVisible();
+ expect(items).toHaveLength(1);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ expect(items[0].textContent).toBe('Two');
+ });
+
+ it('should close the menu when no items match', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('O');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(getByRole('listbox')).toBeVisible();
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'input');
+
+ await user.keyboard('x');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ fireEvent.change(searchAutocomplete, {target: {value: 'x'}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onOpenChange).toHaveBeenCalledTimes(2);
+ expect(onOpenChange).toHaveBeenLastCalledWith(false, undefined);
+ });
+
+ it('should clear the focused item when typing', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('w');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+
+ await user.keyboard('o');
+
+ items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('input events are only fired once', async function () {
+ let onKeyDown = jest.fn();
+ let onKeyUp = jest.fn();
+ let onFocus = jest.fn();
+ let onInputChange = jest.fn();
+ let onFocusChange = jest.fn();
+ let onBlur = jest.fn();
+ let {getByRole} = renderSearchAutocomplete({onKeyDown, onKeyUp, onFocus, onInputChange, onBlur, onFocusChange});
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('w');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onKeyDown).toHaveBeenCalledTimes(1);
+ expect(onKeyUp).toHaveBeenCalledTimes(1);
+ expect(onFocus).toHaveBeenCalledTimes(1);
+ expect(onInputChange).toHaveBeenCalledTimes(1);
+ expect(onFocusChange).toHaveBeenCalledTimes(1);
+ expect(onBlur).toHaveBeenCalledTimes(0);
+
+ await user.tab();
+
+ expect(onBlur).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('blur', function () {
+ it('closes and commits selection on blur (clicking to blur)', async function () {
+ let {queryByRole, getByRole} = render(
+
+
+ - Bulbasaur
+ - Squirtle
+ - Charmander
+
+ Focus move
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('b');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+
+ fireEvent.change(searchAutocomplete, {target: {value: 'Bulba'}});
+ act(() => {
+ jest.runAllTimers();
+ });
+ act(() => {
+ searchAutocomplete.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ // SearchAutocomplete value should reset to the selected key value and menu should be closed
+ expect(onOpenChange).toHaveBeenLastCalledWith(false, undefined);
+ expect(onInputChange).toHaveBeenLastCalledWith('Bulba');
+ expect(searchAutocomplete.value).toBe('Bulba');
+ expect(queryByRole('listbox')).toBeFalsy();
+ });
+
+ it('closes and commits custom value', async function () {
+ let {getByRole, queryByRole} = render(
+
+
+ - Bulbasaur
+ - Squirtle
+ - Charmander
+
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+ await user.click(searchAutocomplete);
+ act(() => {
+ jest.runAllTimers();
+ });
+ fireEvent.change(searchAutocomplete, {target: {value: 'Bulba'}});
+ act(() => {
+ jest.runAllTimers();
+ });
+ expect(onOpenChange).toHaveBeenLastCalledWith(true, 'input');
+
+ act(() => {
+ searchAutocomplete.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onOpenChange).toHaveBeenLastCalledWith(false, undefined);
+
+ expect(queryByRole('listbox')).toBeNull();
+ });
+
+ it('retains selected key on blur if input value matches', async function () {
+ let {getByRole} = render(
+
+
+ - Bulbasaur
+ - Squirtle
+ - Charmander
+
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+
+ await user.click(searchAutocomplete);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(document.activeElement).toBe(searchAutocomplete);
+
+ act(() => {
+ searchAutocomplete.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ });
+
+ it('propagates blur event outside of the component', async function () {
+ let {getByRole} = render(
+
+
+
+ - Bulbasaur
+ - Squirtle
+ - Charmander
+
+ Second focus
+
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+ expect(document.activeElement).toBe(searchAutocomplete);
+
+ expect(onBlur).toHaveBeenCalledTimes(0);
+ expect(outerBlur).toHaveBeenCalledTimes(0);
+
+ await user.tab();
+
+ expect(onBlur).toHaveBeenCalledTimes(1);
+ expect(outerBlur).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('controlled searchAutocomplete', function () {
+ describe('controlled by inputValue', function () {
+ it('updates inputValue changes', function () {
+ let {getByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete.value).toBe('Two');
+
+ rerender( );
+ expect(searchAutocomplete.value).toBe('One');
+
+ rerender( );
+ expect(searchAutocomplete.value).toBe('');
+ });
+ });
+
+ describe('controlled by inputValue', function () {
+ it('updates the input field when inputValue prop changes', function () {
+ let {getByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete.value).toBe('T');
+
+ rerender( );
+ expect(searchAutocomplete.value).toBe('Tw');
+ });
+ });
+
+ describe('custom filter', function () {
+ it('updates items with custom filter onInputChange', async () => {
+ let customFilterItems = [
+ {name: 'The first item', id: '1'},
+ {name: 'The second item', id: '2'},
+ {name: 'The third item', id: '3'}
+ ];
+
+ let CustomFilterSearchAutocomplete = () => {
+ let [list, setList] = React.useState(customFilterItems);
+ let onInputChange = (value) => {
+ setList(customFilterItems.filter(item => item.name.includes(value)));
+ };
+
+ return (
+
+ {(item) => - {item.name}
}
+
+ );
+ };
+ let {getByRole} = render(
+
+
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('second');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ });
+ });
+
+ it('updates the list of items when items update', async function () {
+ let {getByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ let items = within(listbox).getAllByRole('option');
+ expect(items.length).toBe(3);
+
+ expect(items[0].textContent).toBe('Aardvark');
+ expect(items[1].textContent).toBe('Kangaroo');
+ expect(items[2].textContent).toBe('Snake');
+
+ let newItems = [
+ {name: 'New Text', id: '1'},
+ {name: 'Item 2', id: '2'},
+ {name: 'Item 3', id: '3'}
+ ];
+
+ rerender( );
+
+ expect(listbox).toBeVisible();
+ items = within(listbox).getAllByRole('option');
+ expect(items.length).toBe(3);
+
+ expect(items[0].textContent).toBe('New Text');
+ expect(items[1].textContent).toBe('Item 2');
+ expect(items[2].textContent).toBe('Item 3');
+ });
+
+ it('updates the list of items when items update (items provided by map)', async function () {
+ function SearchAutocompleteWithMap(props) {
+ let defaultItems = initialFilterItems;
+ let {
+ listItems = defaultItems
+ } = props;
+ return (
+
+
+ {listItems.map((item) => (
+ -
+ {item.name}
+
+ ))}
+
+
+ );
+ }
+
+ let {getByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('a');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ let items = within(listbox).getAllByRole('option');
+ expect(items.length).toBe(3);
+
+ expect(items[0].textContent).toBe('Aardvark');
+ expect(items[1].textContent).toBe('Kangaroo');
+ expect(items[2].textContent).toBe('Snake');
+
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete.value).toBe('Aardvark');
+
+ act(() => {
+ searchAutocomplete.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+ expect(document.activeElement).not.toBe(searchAutocomplete);
+
+ let newItems = [
+ {name: 'New Text', id: '1'},
+ {name: 'Item 2', id: '2'},
+ {name: 'Item 3', id: '3'}
+ ];
+
+ rerender( );
+ expect(searchAutocomplete.value).toBe('New Text');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ fireEvent.change(searchAutocomplete, {target: {value: ''}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ items = within(listbox).getAllByRole('option');
+ expect(items.length).toBe(3);
+
+ expect(items[0].textContent).toBe('New Text');
+ expect(items[1].textContent).toBe('Item 2');
+ expect(items[2].textContent).toBe('Item 3');
+ });
+ });
+
+ describe('uncontrolled searchAutocomplete', function () {
+ it('should update both input value and selected item freely', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete();
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete.value).toBe('');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('T');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(2);
+ await user.keyboard('wo');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete.value).toBe('Two');
+ expect(onInputChange).toHaveBeenCalledTimes(3);
+ expect(onInputChange).toHaveBeenCalledWith('Two');
+
+ fireEvent.change(searchAutocomplete, {target: {value: ''}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete.value).toBe('');
+ expect(onInputChange).toHaveBeenCalledTimes(4);
+ expect(onInputChange).toHaveBeenCalledWith('');
+
+ listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ items = within(listbox).getAllByRole('option');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[1]).not.toHaveAttribute('aria-selected', 'true');
+
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete.value).toBe('One');
+ expect(queryByRole('listbox')).toBeNull();
+ expect(onInputChange).toHaveBeenCalledTimes(5);
+ expect(onInputChange).toHaveBeenCalledWith('One');
+
+ fireEvent.change(searchAutocomplete, {target: {value: 'o'}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ items = within(listbox).getAllByRole('option');
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[0]).toHaveAttribute('aria-selected', 'true');
+
+ // Reset selection
+ fireEvent.change(searchAutocomplete, {target: {value: ''}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete.value).toBe('');
+ expect(onInputChange).toHaveBeenCalledTimes(7);
+ expect(onInputChange).toHaveBeenCalledWith('');
+ });
+
+ it('defaultInputValue should not set selected item', async function () {
+ let {getByRole} = renderSearchAutocomplete({defaultInputValue: 'Tw'});
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete.value).toBe('Tw');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ expect(items[0]).toHaveTextContent('Two');
+ expect(items[0]).toHaveAttribute('aria-selected', 'false');
+ });
+ });
+
+ it('should have aria-invalid when validationState="invalid"', function () {
+ let {getByRole} = renderSearchAutocomplete({validationState: 'invalid'});
+ let searchAutocomplete = getByRole('combobox');
+ expect(searchAutocomplete).toHaveAttribute('aria-invalid', 'true');
+ });
+
+ describe('loadingState', function () {
+ it('searchAutocomplete should not render a loading circle if menu is not open', function () {
+ let {getByRole, queryByRole, rerender} = render( );
+ act(() => {jest.advanceTimersByTime(500);});
+ // First time load will show progress bar so user can know that items are being fetched
+ expect(getByRole('progressbar')).toBeTruthy();
+
+ rerender( );
+
+ expect(queryByRole('progressbar')).toBeNull();
+ });
+
+ it('searchAutocomplete should render a loading circle if menu is not open but menuTrigger is "manual"', function () {
+ let {getByRole, queryByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+ expect(queryByRole('progressbar')).toBeNull();
+
+ act(() => {jest.advanceTimersByTime(500);});
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+
+ rerender( );
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+
+ rerender( );
+ expect(queryByRole('progressbar')).toBeNull();
+ });
+
+ it('searchAutocomplete should not render a loading circle until a delay of 500ms passes (loadingState: loading)', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete({loadingState: 'loading'});
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+ });
+
+ it('searchAutocomplete should not render a loading circle until a delay of 500ms passes and the menu is open (loadingState: filtering)', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete({loadingState: 'filtering'});
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ act(() => {jest.advanceTimersByTime(500);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+ });
+
+ it('searchAutocomplete should hide the loading circle when loadingState changes to a non-loading state', async function () {
+ let {getByRole, queryByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+ act(() => {jest.advanceTimersByTime(500);});
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+
+ rerender( );
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(queryByRole('progressbar')).toBeNull();
+ });
+
+ it('searchAutocomplete should hide the loading circle when if the menu closes', async function () {
+ let {getByRole, queryByRole} = render( );
+ let searchAutocomplete = getByRole('combobox');
+
+ expect(queryByRole('progressbar')).toBeNull();
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+ act(() => {jest.advanceTimersByTime(500);});
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+
+ act(() => {
+ searchAutocomplete.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+ expect(queryByRole('progressbar')).toBeNull();
+ expect(queryByRole('listbox')).toBeNull();
+ });
+
+ it('searchAutocomplete cancels the 500ms progress circle delay timer if the loading finishes first', function () {
+ let {queryByRole, rerender} = render( );
+ expect(queryByRole('progressbar')).toBeNull();
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ rerender( );
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(queryByRole('progressbar')).toBeNull();
+ });
+
+ it('searchAutocomplete should not reset the 500ms progress circle delay timer when loadingState changes from loading to filtering', function () {
+ let {getByRole, queryByRole, rerender} = render( );
+ let searchAutocomplete = getByRole('combobox');
+
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ rerender( );
+ expect(queryByRole('progressbar')).toBeNull();
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+ });
+
+ it('searchAutocomplete should reset the 500ms progress circle delay timer when input text changes', async function () {
+ let {getByRole, queryByRole} = render( );
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.keyboard('O');
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(() => within(searchAutocomplete).getByRole('progressbar')).toBeTruthy();
+ });
+
+ it.each`
+ LoadingState | ValidationState
+ ${'loading'} | ${null}
+ ${'filtering'} | ${null}
+ ${'loading'} | ${'invalid'}
+ ${'filtering'} | ${'invalid'}
+ `('should render the loading swirl in the input field when loadingState="$LoadingState" and validationState="$ValidationState"', async ({LoadingState, ValidationState}) => {
+ let {getByRole} = renderSearchAutocomplete({loadingState: LoadingState, validationState: ValidationState});
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ act(() => {jest.advanceTimersByTime(500);});
+
+ if (ValidationState) {
+ expect(searchAutocomplete).toHaveAttribute('aria-invalid', 'true');
+ }
+
+ // validation icon should not be present
+ expect(within(searchAutocomplete).queryByRole('img', {hidden: true})).toBeNull();
+
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let progressSpinner = getByRole('progressbar', {hidden: true});
+ expect(progressSpinner).toBeTruthy();
+ expect(progressSpinner).toHaveAttribute('aria-label', 'Loading...');
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(within(listbox).queryByRole('progressbar')).toBeNull();
+ });
+
+ it('should render the loading swirl in the listbox when loadingState="loadingMore"', async function () {
+ let {getByRole, queryByRole} = renderSearchAutocomplete({loadingState: 'loadingMore'});
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.keyboard('o');
+ act(() => jest.runAllTimers());
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+
+ let progressSpinner = within(listbox).getByRole('progressbar');
+ expect(progressSpinner).toBeTruthy();
+ expect(progressSpinner).toHaveAttribute('aria-label', 'Loading more…');
+ });
+ });
+
+ describe('mobile searchAutocomplete', function () {
+ beforeEach(() => {
+ simulateMobile();
+ });
+
+ afterEach(() => {
+ act(() => jest.runAllTimers());
+ jest.clearAllMocks();
+ });
+
+ async function testSearchAutocompleteTrayOpen(input, tray, listbox, focusedItemIndex) {
+ expect(tray).toBeVisible();
+
+ let dialog = within(tray).getByRole('dialog');
+ expect(input).toHaveAttribute('aria-labelledby');
+ expect(dialog).toHaveAttribute('aria-labelledby', input.getAttribute('aria-labelledby'));
+
+ expect(input).toHaveAttribute('role', 'searchbox');
+ expect(input).toHaveAttribute('aria-expanded', 'true');
+ expect(input).toHaveAttribute('aria-controls', listbox.id);
+ expect(input).toHaveAttribute('aria-haspopup', 'listbox');
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(3);
+ expect(items[0]).toHaveTextContent('One');
+ expect(items[1]).toHaveTextContent('Two');
+ expect(items[2]).toHaveTextContent('Three');
+
+ expect(document.activeElement).toBe(input);
+
+ if (typeof focusedItemIndex === 'undefined') {
+ expect(input).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).toHaveAttribute('aria-activedescendant', items[0].id);
+ } else {
+ expect(input).toHaveAttribute('aria-activedescendant', items[focusedItemIndex].id);
+ }
+ }
+
+ it('should render a button to open the tray', function () {
+ let {getByRole, getByText} = renderSearchAutocomplete({});
+ let button = getByRole('button');
+
+ expect(button).toHaveAttribute('aria-haspopup', 'dialog');
+ expect(button).toHaveAttribute('aria-expanded', 'false');
+ expect(button).toHaveAttribute('aria-labelledby', `${getByText('Test').id} ${button.getElementsByTagName('span')[0].id}`);
+ });
+
+ it('button should be labelled by external label', function () {
+ let {getByRole} = renderSearchAutocomplete({label: null, 'aria-labelledby': 'label-id'});
+ let button = getByRole('button');
+
+ expect(button).toHaveAttribute('aria-labelledby', `label-id ${button.getElementsByTagName('span')[0].id}`);
+ });
+
+ it('button should be labelled by aria-label', function () {
+ let {getByRole} = renderSearchAutocomplete({label: null, 'aria-label': 'Label'});
+ let button = getByRole('button');
+
+ expect(button).toHaveAttribute('aria-label', 'Label');
+ expect(button).toHaveAttribute('aria-labelledby', `${button.id} ${button.getElementsByTagName('span')[0].id}`);
+ });
+
+ it('button should be labelled by external label and builtin label', function () {
+ let {getByRole, getByText} = renderSearchAutocomplete({'aria-labelledby': 'label-id'});
+ let button = getByRole('button');
+
+ expect(button).toHaveAttribute('aria-labelledby', `${getByText('Test').id} label-id ${button.getElementsByTagName('span')[0].id}`);
+ });
+
+ it('readonly searchAutocomplete should not open on press', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete({isReadOnly: true});
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(button).toHaveAttribute('aria-expanded', 'false');
+ expect(() => getByTestId('tray')).toThrow();
+ });
+
+ it('opening the tray autofocuses the tray input', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(button).toHaveAttribute('aria-expanded', 'true');
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+
+ let trayInput = within(tray).getByRole('searchbox');
+ await testSearchAutocompleteTrayOpen(trayInput, tray, listbox);
+ });
+
+ it('closing the tray autofocuses the button', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+
+ await user.keyboard('{Escape}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(() => getByTestId('tray')).toThrow();
+ // run restore focus rAF
+ act(() => jest.runAllTimers());
+ expect(document.activeElement).toBe(button);
+ });
+
+ it('height of the tray remains fixed even if the number of items changes', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+
+ let items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(3);
+
+ let trayInput = within(tray).getByRole('searchbox');
+ // Save the height style for comparison later
+ let style = tray.getAttribute('style');
+ act(() => {
+ trayInput.focus();
+ });
+ await user.keyboard('One');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(1);
+ tray = getByTestId('tray');
+ expect(tray.getAttribute('style')).toBe(style);
+ });
+
+ it('up/down arrows still traverse the items in the tray', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+
+ let button = getByRole('button');
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+
+ let input = within(tray).getByRole('searchbox');
+ expect(document.activeElement).toBe(input);
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ await testSearchAutocompleteTrayOpen(input, tray, listbox, 0);
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let items = within(tray).getAllByRole('option');
+
+ expect(input).toHaveAttribute('aria-activedescendant', items[1].id);
+
+ await user.keyboard('{ArrowUp}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).toHaveAttribute('aria-activedescendant', items[0].id);
+ });
+
+ it('user can filter the menu options by typing in the tray input', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+ let trayInput = within(tray).getByRole('searchbox');
+
+ await testSearchAutocompleteTrayOpen(trayInput, tray, listbox);
+ act(() => {
+ trayInput.focus();
+ });
+ await user.keyboard('r');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(1);
+ expect(items[0].textContent).toBe('Three');
+
+ act(() => {
+ fireEvent.change(trayInput, {target: {value: ''}});
+ jest.runAllTimers();
+ });
+
+ items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(3);
+ expect(items[0].textContent).toBe('One');
+ expect(items[1].textContent).toBe('Two');
+ expect(items[2].textContent).toBe('Three');
+ });
+
+ it('tray input can be cleared using a clear button', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+ let trayInput = within(tray).getByRole('searchbox');
+
+ expect(() => within(tray).getByLabelText('Clear')).toThrow();
+
+ await testSearchAutocompleteTrayOpen(trayInput, tray, listbox);
+ act(() => {
+ trayInput.focus();
+ });
+ await user.keyboard('r');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(document.activeElement).toBe(trayInput);
+ expect(trayInput.value).toBe('r');
+
+ let clearButton = within(tray).getByLabelText('Clear');
+ expect(clearButton.tagName).toBe('DIV');
+ expect(clearButton).not.toHaveAttribute('tabIndex');
+ await user.click(clearButton);
+ expect(onClear).toHaveBeenCalledTimes(1);
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(document.activeElement).toBe(trayInput);
+ expect(trayInput.value).toBe('');
+ });
+
+ it('"No results" placeholder is shown if user types something that doesnt match any of the available options', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+
+ let trayInput = within(tray).getByRole('searchbox');
+ await testSearchAutocompleteTrayOpen(trayInput, tray, listbox);
+ act(() => {
+ trayInput.focus();
+ });
+ await user.keyboard('blah');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ // check that tray is still visible and placeholder text exists
+ expect(tray).toBeVisible();
+ let items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(1);
+
+ let placeholderText = within(items[0]).getByText('No results');
+ expect(placeholderText).toBeVisible();
+
+
+ fireEvent.change(trayInput, {target: {value: ''}});
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(3);
+ expect(() => within(tray).getByText('No results')).toThrow();
+ });
+
+ it('user can select options by pressing them', async function () {
+ let {getByRole, getByText, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'manual');
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+ let trayInput = within(tray).getByRole('searchbox');
+ await testSearchAutocompleteTrayOpen(trayInput, tray, listbox);
+
+ let items = within(tray).getAllByRole('option');
+
+ await user.click(items[1]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onInputChange).toHaveBeenCalledWith('Two');
+ expect(onInputChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(false, undefined);
+ expect(onOpenChange).toHaveBeenCalledTimes(2);
+ expect(() => getByTestId('tray')).toThrow();
+ expect(button).toHaveAttribute('aria-labelledby', `${getByText('Test').id} ${getByText('Two').id}`);
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ trayInput = within(tray).getByRole('searchbox');
+ items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(3);
+ expect(items[1].textContent).toBe('Two');
+ expect(trayInput).not.toHaveAttribute('aria-activedescendant');
+ expect(trayInput.value).toBe('Two');
+ expect(items[1]).toHaveAttribute('aria-selected', 'true');
+ });
+
+ it('user can select options by focusing them and hitting enter', async function () {
+ let {getByRole, getByText, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+
+ let trayInput = within(tray).getByRole('searchbox');
+
+ await user.keyboard('{ArrowUp}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'manual');
+ expect(onOpenChange).toHaveBeenCalledTimes(1);
+
+ await testSearchAutocompleteTrayOpen(trayInput, tray, listbox, 2);
+
+ await user.keyboard('{Enter}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(onInputChange).toHaveBeenCalledWith('Three');
+ expect(onInputChange).toHaveBeenCalledTimes(1);
+ expect(onOpenChange).toHaveBeenCalledWith(false, undefined);
+ expect(onOpenChange).toHaveBeenCalledTimes(2);
+ expect(() => getByTestId('tray')).toThrow();
+ expect(button).toHaveAttribute('aria-labelledby', `${getByText('Test').id} ${getByText('Three').id}`);
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ trayInput = within(tray).getByRole('searchbox');
+ let items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(3);
+ expect(items[2].textContent).toBe('Three');
+ expect(trayInput).not.toHaveAttribute('aria-activedescendant');
+ expect(trayInput.value).toBe('Three');
+ expect(items[2]).toHaveAttribute('aria-selected', 'true');
+ });
+
+ it('input is blurred when the user scrolls the listbox with touch', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+
+ let trayInput = within(tray).getByRole('searchbox');
+
+ act(() => {
+ trayInput.focus();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(document.activeElement).toBe(trayInput);
+
+ fireEvent.touchStart(listbox);
+ fireEvent.scroll(listbox);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(document.activeElement).not.toBe(trayInput);
+ });
+
+ it('label of the tray input should match label of button', async function () {
+ let {getByRole, getByTestId, getByText} = renderSearchAutocomplete();
+ let button = getByRole('button');
+ let label = getByText(defaultProps.label);
+
+ expect(button).toHaveAttribute('aria-labelledby', `${label.id} ${button.getElementsByTagName('span')[0].id}`);
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let trayInput = within(tray).getByRole('searchbox');
+ let trayInputLabel = within(tray).getByText(defaultProps.label);
+ expect(trayInput).toHaveAttribute('aria-labelledby', trayInputLabel.id);
+ });
+
+ it('tray input should recieve the same aria-labelledby as the button if an external label is provided', async function () {
+ let {getByRole, getByTestId, getByText} = render(
+
+ SearchAutocomplete
+
+ - Item One
+
+
+ );
+
+ let button = getByRole('button');
+ let label = getByText('SearchAutocomplete');
+
+ expect(button).toHaveAttribute('aria-labelledby', `${label.id} ${button.getElementsByClassName('mobile-value')[0].id}`);
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+ expect(listbox).toHaveAttribute('aria-label', 'Suggestions');
+ expect(listbox).toHaveAttribute('aria-labelledby', `${listbox.id} ${label.id}`);
+ let trayInput = within(tray).getByRole('searchbox');
+ expect(trayInput).toHaveAttribute('aria-labelledby', label.id);
+ });
+
+ it('user can open the tray even if there aren\'t any items to show', async function () {
+ let {getAllByRole, getByTestId} = render(
+
+
+ {(item) => - {item.name}
}
+
+
+ );
+ let button = getAllByRole('button')[0];
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+
+ let items = within(tray).getAllByRole('option');
+ expect(items.length).toBe(1);
+
+ let placeholderText = within(items[0]).getByText('No results');
+ expect(placeholderText).toBeVisible();
+ });
+
+ it('searchAutocomplete tray remains open on blur', async function () {
+ let {getAllByRole, getByTestId} = renderSearchAutocomplete({defaultInputValue: 'Blah'});
+ let button = getAllByRole('button')[0];
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let trayInput = within(tray).getByRole('searchbox');
+ expect(trayInput.value).toBe('Blah');
+
+ act(() => {
+ trayInput.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ expect(trayInput.value).toBe('Blah'); // does not reset on blur
+ });
+
+ it('searchAutocomplete tray can be closed using the dismiss buttons', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let dismissButtons = within(tray).getAllByRole('button');
+ expect(dismissButtons.length).toBe(2);
+ expect(dismissButtons[0]).toHaveAttribute('aria-label', 'Dismiss');
+ expect(dismissButtons[1]).toHaveAttribute('aria-label', 'Dismiss');
+
+ await user.click(dismissButtons[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(() => getByTestId('tray')).toThrow();
+ });
+
+ it('searchAutocomplete tray doesn\'t close when tray input is virtually clicked', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete();
+ let button = getByRole('button');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let trayInput = within(tray).getByRole('searchbox');
+
+ jest.spyOn(trayInput, 'getBoundingClientRect').mockImplementation(() => ({
+ left: 100,
+ top: 100,
+ width: 100,
+ height: 50
+ }));
+
+ // virtual click on the exact center
+ fireEvent.touchEnd(trayInput, {
+ changedTouches: [{
+ clientX: 150,
+ clientY: 125
+ }]
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(() => getByTestId('tray')).not.toThrow();
+ });
+
+ it('should focus the button when clicking on the label', async function () {
+ let {getByRole, getByText} = renderSearchAutocomplete();
+ let label = getByText('Test');
+ let button = getByRole('button');
+
+ await user.click(label);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(document.activeElement).toBe(button);
+ });
+
+ it('should include invalid in label when validationState="invalid"', function () {
+ let {getAllByRole, getByText, getByLabelText} = renderSearchAutocomplete({validationState: 'invalid'});
+ let button = getAllByRole('button')[0];
+ expect(button).toHaveAttribute('aria-labelledby', `${getByText('Test').id} ${button.getElementsByTagName('span')[0].id} ${getByLabelText('(invalid)').id}`);
+ });
+
+ it('menutrigger=focus doesn\'t reopen the tray on close', async function () {
+ let {getByRole, getByTestId} = renderSearchAutocomplete({menuTrigger: 'focus'});
+ let button = getByRole('button');
+
+ act(() => {
+ button.focus();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ // menutrigger = focus is inapplicable for mobile SearchAutocomplete
+ expect(() => getByTestId('tray')).toThrow();
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let trayInput = within(tray).getByRole('searchbox');
+
+ act(() => {
+ trayInput.blur();
+ });
+ await user.click(document.body);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(() => getByTestId('tray')).toThrow();
+ });
+
+ it('searchAutocomplete button is focused when autoFocus is true', function () {
+ let {getByRole} = renderSearchAutocomplete({autoFocus: true});
+ let button = getByRole('button');
+ expect(document.activeElement).toBe(button);
+ });
+
+ it('searchAutocomplete tray doesn\'t open when controlled input value is updated', async function () {
+ let {getAllByRole, rerender, getByTestId} = render( );
+ let button = getAllByRole('button')[0];
+
+ act(() => {
+ button.focus();
+ });
+ await user.click(button);
+ act(() => jest.runAllTimers());
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let trayInput = within(tray).getByRole('searchbox');
+
+ act(() => {
+ trayInput.blur();
+ });
+ await user.click(document.body);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(() => getByTestId('tray')).toThrow();
+
+ act(() => {
+ button.blur();
+ });
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ rerender( );
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(() => getByTestId('tray')).toThrow();
+ });
+
+ describe('refs', function () {
+ it('attaches a ref to the label wrapper', function () {
+ let ref = React.createRef();
+ let {getByText} = renderSearchAutocomplete({ref});
+
+ expect(ref.current.UNSAFE_getDOMNode()).toBe(getByText('Test').parentElement);
+ });
+
+ it('attaches a ref to wrapper if no label', function () {
+ let ref = React.createRef();
+ let {getByRole} = renderSearchAutocomplete({ref, label: null, 'aria-label': 'test'});
+
+ expect(ref.current.UNSAFE_getDOMNode()).toBe(getByRole('button').parentElement);
+ });
+
+ it('calling focus() on the ref focuses the button', function () {
+ let ref = React.createRef();
+ let {getByRole} = renderSearchAutocomplete({ref});
+
+ act(() => {ref.current.focus();});
+ expect(document.activeElement).toBe(getByRole('button'));
+ });
+ });
+
+ describe('isLoading', function () {
+ it('tray input should render a loading circle after a delay of 500ms if loadingState="filtering"', async function () {
+ let {getByRole, queryByRole, getByTestId, rerender} = render( );
+ let button = getByRole('button');
+ act(() => {jest.advanceTimersByTime(500);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+ expect(within(listbox).getByRole('progressbar')).toBeTruthy();
+ expect(within(tray).getAllByRole('progressbar').length).toBe(1);
+
+ rerender( );
+ act(() => {jest.advanceTimersByTime(500);});
+
+ expect(within(tray).getByRole('progressbar')).toBeTruthy();
+ expect(within(listbox).queryByRole('progressbar')).toBeNull();
+ });
+
+ it('tray input should hide the loading circle if loadingState is no longer "filtering"', async function () {
+ let {getByRole, queryByRole, getByTestId, rerender} = render( );
+ let button = getByRole('button');
+ act(() => {jest.advanceTimersByTime(500);});
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let listbox = getByRole('listbox');
+ expect(within(tray).getByRole('progressbar')).toBeTruthy();
+ expect(within(listbox).queryByRole('progressbar')).toBeNull();
+
+ rerender( );
+ expect(within(tray).queryByRole('progressbar')).toBeNull();
+ });
+
+ it('tray input loading circle timer should reset on input value change', async function () {
+ let {getByRole, getByTestId, rerender} = render( );
+ let button = getByRole('button');
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ rerender( );
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ expect(within(tray).queryByRole('progressbar')).toBeNull();
+ act(() => {jest.advanceTimersByTime(250);});
+
+ let trayInput = within(tray).getByRole('searchbox');
+ act(() => {
+ trayInput.focus();
+ });
+ await user.keyboard('One');
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(within(tray).queryByRole('progressbar')).toBeNull();
+
+ act(() => {jest.advanceTimersByTime(250);});
+ expect(within(tray).getByRole('progressbar')).toBeTruthy();
+ });
+
+ it.each`
+ LoadingState | ValidationState
+ ${'loading'} | ${null}
+ ${'filtering'} | ${null}
+ ${'loading'} | ${'invalid'}
+ ${'filtering'} | ${'invalid'}
+ `('should render the loading swirl in the tray input field when loadingState="$LoadingState" and validationState="$ValidationState"', async ({LoadingState, ValidationState}) => {
+ let {getAllByRole, getByRole, getByTestId} = renderSearchAutocomplete({loadingState: LoadingState, validationState: ValidationState, defaultInputValue: 'O'});
+ let button = getAllByRole('button')[0];
+ act(() => {jest.advanceTimersByTime(500);});
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+
+ let trayProgressSpinner = within(tray).getByRole('progressbar');
+ expect(trayProgressSpinner).toBeTruthy();
+
+ if (LoadingState === 'loading') {
+ expect(trayProgressSpinner).toHaveAttribute('aria-label', 'Loading more…');
+ } else {
+ expect(trayProgressSpinner).toHaveAttribute('aria-label', 'Loading...');
+ }
+
+ let clearButton = within(tray).getByLabelText('Clear');
+ expect(clearButton).toBeTruthy();
+
+ let listbox = getByRole('listbox');
+
+ if (LoadingState === 'loading') {
+ expect(within(listbox).getByRole('progressbar')).toBeTruthy();
+ } else {
+ expect(within(listbox).queryByRole('progressbar')).toBeNull();
+ }
+
+ if (ValidationState) {
+ let trayInput = within(tray).getByRole('searchbox');
+ expect(trayInput).toHaveAttribute('aria-invalid', 'true');
+ }
+
+ if (ValidationState && LoadingState === 'loading') {
+ // validation icon should be present along with the clear button and search icon
+ expect(within(tray).getAllByRole('img', {hidden: true})).toHaveLength(3);
+ } else {
+ // validation icon should not be present, only imgs are the clear button and search icon
+ expect(within(tray).getAllByRole('img', {hidden: true})).toHaveLength(2);
+ }
+ });
+
+ it('should render the loading swirl in the listbox when loadingState="loadingMore"', async function () {
+ let {getAllByRole, getByRole, queryByRole, getByTestId} = renderSearchAutocomplete({loadingState: 'loadingMore', validationState: 'invalid'});
+ let button = getAllByRole('button')[0];
+
+ expect(queryByRole('progressbar')).toBeNull();
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+
+ let allProgressSpinners = within(tray).getAllByRole('progressbar');
+ expect(allProgressSpinners.length).toBe(1);
+
+ let icons = within(tray).getAllByRole('img', {hidden: true});
+ expect(icons.length).toBe(3);
+
+ let clearButton = within(tray).getByLabelText('Clear');
+ expect(clearButton).toBeTruthy();
+
+ expect(within(clearButton).getByRole('img', {hidden: true})).toBe(icons[2]);
+
+ let trayInput = within(tray).getByRole('searchbox');
+ expect(trayInput).toHaveAttribute('aria-invalid', 'true');
+
+ let listbox = getByRole('listbox');
+ let progressSpinner = within(listbox).getByRole('progressbar');
+ expect(progressSpinner).toBeTruthy();
+ expect(progressSpinner).toHaveAttribute('aria-label', 'Loading more…');
+ });
+ });
+ });
+
+ describe('forms', () => {
+ describe('desktop', () => {
+ beforeAll(function () {
+ simulateDesktop();
+ });
+
+ afterAll(function () {
+ jest.clearAllMocks();
+ });
+
+ it('should support form reset', async () => {
+ let {getByRole, getByTestId} = render(
+
+ );
+
+ let combobox = getByRole('combobox');
+ expect(combobox).toHaveAttribute('name', 'test');
+ await user.tab();
+ await user.keyboard('Tw');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(combobox).toHaveValue('Two');
+
+ let button = getByTestId('reset');
+ await user.click(button);
+ expect(combobox).toHaveValue('');
+ });
+
+ describe('validation', () => {
+ describe('validationBehavior=native', () => {
+ it('supports isRequired', async () => {
+ let {getByTestId, getByRole} = render(
+
+
+
+ );
+
+ let input = getByTestId('input');
+ expect(input).toHaveAttribute('required');
+ expect(input).not.toHaveAttribute('aria-required');
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(false);
+
+ act(() => {getByTestId('form').checkValidity();});
+
+ expect(document.activeElement).toBe(input);
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Constraints not satisfied');
+
+ await user.keyboard('Tw');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).toHaveAttribute('aria-describedby');
+
+ await user.tab();
+ expect(input).not.toHaveAttribute('aria-describedby');
+ });
+
+ it('supports validate function', async () => {
+ let {getByTestId, getByRole} = render(
+
+
+
+ );
+
+ let input = getByTestId('input');
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(false);
+
+ act(() => {getByTestId('form').checkValidity();});
+
+ expect(document.activeElement).toBe(input);
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value');
+
+ await user.clear(input);
+ await user.keyboard('On');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).toHaveAttribute('aria-describedby');
+
+ await user.tab();
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(true);
+ });
+
+ it('supports server validation', async () => {
+ function Test() {
+ let [serverErrors, setServerErrors] = React.useState({});
+ let onSubmit = e => {
+ e.preventDefault();
+ setServerErrors({
+ value: 'Invalid value.'
+ });
+ };
+
+ return (
+
+
+
+ );
+ }
+
+ let {getByTestId, getByRole} = render( );
+
+ let input = getByTestId('input');
+ expect(input).not.toHaveAttribute('aria-describedby');
+
+ await user.click(getByTestId('submit'));
+
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value.');
+ expect(input.validity.valid).toBe(false);
+
+ await user.tab({shift: true});
+ await user.keyboard('Tw');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).toHaveAttribute('aria-describedby');
+ await user.tab();
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(true);
+ });
+
+ it('supports customizing native error messages', async () => {
+ let {getByTestId} = render(
+
+
+
+ );
+
+ let input = getByTestId('input');
+ expect(input).not.toHaveAttribute('aria-describedby');
+
+ act(() => {getByTestId('form').checkValidity();});
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Please enter a value');
+ });
+ });
+
+ describe('validationBehavior=aria', () => {
+ it('supports validate function', async () => {
+ let {getByTestId, getByRole} = render(
+
+
+
+ );
+
+ let input = getByTestId('input');
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(input).toHaveAttribute('aria-invalid', 'true');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value');
+ expect(input.validity.valid).toBe(true);
+
+ await user.tab();
+ await user.keyboard('On');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input).not.toHaveAttribute('aria-invalid');
+ });
+
+ it('supports server validation', async () => {
+ let {getByTestId, getByRole} = render(
+
+
+
+ );
+
+ let input = getByTestId('input');
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(input).toHaveAttribute('aria-invalid', 'true');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value');
+
+ await user.tab();
+ await user.keyboard('Tw');
+
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ await user.tab();
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input).not.toHaveAttribute('aria-invalid');
+ });
+
+ it('only commits on blur if the value changed', async () => {
+ let {getByTestId} = render(
+
+
+
+ );
+
+ let input = getByTestId('input');
+ expect(input).toHaveAttribute('required');
+ expect(input).not.toHaveAttribute('aria-required');
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(false);
+
+ await user.tab();
+ await user.tab({shift: true});
+ expect(input).not.toHaveAttribute('aria-describedby');
+
+ act(() => {getByTestId('form').checkValidity();});
+
+ expect(input).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(input.getAttribute('aria-describedby'))).toHaveTextContent('Constraints not satisfied');
+ });
+ });
+ });
+ });
+
+ describe('mobile', () => {
+ beforeEach(() => {
+ simulateMobile();
+ });
+
+ afterEach(() => {
+ act(() => jest.runAllTimers());
+ jest.clearAllMocks();
+ });
+
+ it('should support form reset', async () => {
+ let {getByRole, getAllByRole, getByTestId} = render(
+
+ );
+
+ let button = getAllByRole('button')[0];
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let tray = getByTestId('tray');
+ expect(tray).toBeVisible();
+ let combobox = getByRole('searchbox');
+ expect(combobox).not.toHaveAttribute('name');
+ let listbox = getByRole('listbox');
+
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let input = document.querySelector('input[name=test]');
+ expect(input).toHaveValue('One');
+
+ let reset = getByTestId('reset');
+ await user.click(reset);
+ expect(input).toHaveValue('');
+ });
+
+ describe('validation', () => {
+ describe('validationBehavior=native', () => {
+ it('supports isRequired', async () => {
+ let {getByTestId, getByRole, getAllByRole} = render(
+
+
+
+ );
+
+ let input = document.querySelector('input[name=test]');
+ expect(input).toHaveAttribute('required');
+ expect(input).not.toHaveAttribute('aria-required');
+ expect(input.validity.valid).toBe(false);
+
+ let button = getAllByRole('button')[0];
+ expect(button).not.toHaveAttribute('aria-describedby');
+
+ act(() => {getByTestId('form').checkValidity();});
+
+ expect(button).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(button.getAttribute('aria-describedby'))).toHaveTextContent('Constraints not satisfied');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ });
+
+ it('supports validate function', async () => {
+ let {getByTestId, getByRole, getAllByRole} = render(
+
+
+
+ );
+
+ let input = document.querySelector('input[name=test]');
+ expect(input.validity.valid).toBe(false);
+
+ let button = getAllByRole('button')[0];
+ expect(button).not.toHaveAttribute('aria-describedby');
+
+ act(() => {getByTestId('form').checkValidity();});
+
+ expect(button).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(button.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(true);
+ });
+
+ it('supports server validation', async () => {
+ function Test() {
+ let [serverErrors, setServerErrors] = React.useState({});
+ let onSubmit = e => {
+ e.preventDefault();
+ setServerErrors({
+ value: 'Invalid value.'
+ });
+ };
+
+ return (
+
+
+
+ );
+ }
+
+ let {getByTestId, getByRole, getAllByRole} = render( );
+
+ let input = document.querySelector('input[name=value]');
+ let button = getAllByRole('button')[0];
+ expect(button).not.toHaveAttribute('aria-describedby');
+
+ await user.click(getByTestId('submit'));
+
+ expect(button).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(button.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value.');
+ expect(input.validity.valid).toBe(false);
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(true);
+ });
+
+ it('supports customizing native error messages', async () => {
+ let {getByTestId, getAllByRole} = render(
+
+
+
+ );
+
+ let button = getAllByRole('button')[0];
+ expect(button).not.toHaveAttribute('aria-describedby');
+
+ act(() => {getByTestId('form').checkValidity();});
+ expect(button).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(button.getAttribute('aria-describedby'))).toHaveTextContent('Please enter a value');
+ });
+ });
+
+ describe('validationBehavior=aria', () => {
+ it('supports validate function', async () => {
+ let {getAllByRole, getByRole} = render(
+
+
+
+ );
+
+ let input = document.querySelector('input[name=test]');
+ expect(input.validity.valid).toBe(true);
+
+ let button = getAllByRole('button')[0];
+ expect(button).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(button.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(true);
+ });
+
+ it('supports server validation', async () => {
+ let {getByRole, getAllByRole} = render(
+
+
+
+ );
+
+ let input = document.querySelector('input[name=value]');
+ let button = getAllByRole('button')[0];
+ expect(button).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(button.getAttribute('aria-describedby'))).toHaveTextContent('Invalid value');
+
+ await user.click(button);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let items = within(listbox).getAllByRole('option');
+ await user.click(items[0]);
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(input).not.toHaveAttribute('aria-describedby');
+ expect(input.validity.valid).toBe(true);
+ });
+ });
+ });
+ });
+ });
+
+ describe('accessibility', function () {
+ beforeAll(function () {
+ simulateDesktop();
+ });
+
+ afterAll(function () {
+ jest.restoreAllMocks();
+ });
+ // NVDA workaround so that letters are read out when user presses left/right arrow to navigate through what they typed
+ it('clears aria-activedescendant when user presses left/right arrow (NVDA fix)', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('One');
+ act(() => {
+ jest.runAllTimers();
+ });
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(searchAutocomplete).toHaveAttribute('aria-controls', listbox.id);
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let items = within(listbox).getAllByRole('option');
+ expect(items).toHaveLength(1);
+ expect(items[0]).toHaveTextContent('One');
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+
+ await user.keyboard('{ArrowLeft}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete).toHaveAttribute('aria-activedescendant', items[0].id);
+
+ await user.keyboard('{ArrowRight}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(searchAutocomplete).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ describe('announcements', function () {
+ // Live announcer is (mostly) only used on apple devices for VoiceOver.
+ // Mock navigator.platform so we take that codepath.
+ let platformMock;
+ beforeEach(() => {
+ platformMock = jest.spyOn(navigator, 'platform', 'get').mockImplementation(() => 'MacIntel');
+ });
+
+ afterEach(() => {
+ platformMock.mockRestore();
+ });
+
+ describe('keyboard navigating', function () {
+ it('should announce items when navigating with the arrow keys', async function () {
+ renderSearchAutocomplete();
+ await user.tab();
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('One');
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('Two');
+ });
+
+ it('should announce when navigating into a section with multiple items', async function () {
+ let {getByRole} = renderSectionSearchAutocomplete();
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('Entered group Section One, with 3 options. One');
+
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('Two');
+ });
+
+ it('should announce when navigating into a section with a single item', async function () {
+ let {getByRole} = renderSectionSearchAutocomplete({defaultInputValue: 'Tw'});
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('Entered group Section One, with 1 option. Two');
+ });
+ });
+
+ describe('filtering', function () {
+ it('should announce the number of options available when filtering', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('2 options available.');
+
+ await user.keyboard('n');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('1 option available.');
+ });
+
+ it('should announce the number of options available when opening the menu', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ await user.keyboard('o');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenCalledWith('2 options available.');
+ });
+ });
+
+ describe('selection', function () {
+ it('should announce when a selection occurs', async function () {
+ let {getByRole} = renderSearchAutocomplete();
+ let searchAutocomplete = getByRole('combobox');
+ act(() => {
+ searchAutocomplete.focus();
+ });
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('One');
+
+ await user.keyboard('{Enter}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ expect(announce).toHaveBeenLastCalledWith('One, selected');
+ });
+ });
+ });
+
+ describe('hiding surrounding content', function () {
+ it('should hide elements outside the searchAutocomplete with aria-hidden', async function () {
+ let {getByRole, queryAllByRole, getAllByRole} = render(
+ <>
+
+
+
+ >
+ );
+
+ let outside = getAllByRole('checkbox');
+ let searchAutocomplete = getByRole('combobox');
+
+ expect(outside).toHaveLength(2);
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(outside[0]).toHaveAttribute('aria-hidden', 'true');
+ expect(outside[1]).toHaveAttribute('aria-hidden', 'true');
+
+ expect(queryAllByRole('checkbox')).toEqual([]);
+ expect(getByRole('combobox')).toBeVisible();
+ });
+
+ it('should not traverse into a hidden container', async function () {
+ let {getByRole, queryAllByRole, getAllByRole} = render(
+ <>
+
+
+
+
+
+ >
+ );
+
+ let outside = getAllByRole('checkbox');
+ let searchAutocomplete = getByRole('combobox');
+
+ expect(outside).toHaveLength(2);
+
+ act(() => searchAutocomplete.focus());
+ await user.keyboard('{ArrowDown}');
+ act(() => jest.runAllTimers());
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(outside[0].parentElement).toHaveAttribute('aria-hidden', 'true');
+ expect(outside[0]).not.toHaveAttribute('aria-hidden', 'true');
+ expect(outside[1]).toHaveAttribute('aria-hidden', 'true');
+
+ expect(queryAllByRole('checkbox')).toEqual([]);
+ expect(getByRole('combobox')).toBeVisible();
+ });
+
+ it('should not hide the live announcer element', async function () {
+ let platformMock = jest.spyOn(navigator, 'platform', 'get').mockImplementation(() => 'MacIntel');
+ let {getByRole} = render( );
+
+ // Use the real live announcer implementation just for this one test
+ let {announce: realAnnounce} = jest.requireActual('@react-aria/live-announcer');
+ announce.mockImplementationOnce(realAnnounce);
+
+ let searchAutocomplete = getByRole('combobox');
+
+ act(() => searchAutocomplete.focus());
+ await user.keyboard('{ArrowDown}');
+ act(() => jest.runAllTimers());
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+ expect(announce).toHaveBeenCalledTimes(2);
+ expect(announce).toHaveBeenNthCalledWith(1, '3 options available.');
+ expect(announce).toHaveBeenNthCalledWith(2, 'One');
+ platformMock.mockRestore();
+ });
+
+ it('should handle when a new element is added outside while open', async function () {
+ let Test = (props) => (
+
+ {props.show && }
+
+ {props.show && }
+
+ );
+
+ let {getByRole, getAllByRole, queryAllByRole, rerender} = render( );
+
+ let searchAutocomplete = getByRole('combobox');
+
+ act(() => searchAutocomplete.focus());
+ await user.keyboard('{ArrowDown}');
+ act(() => jest.runAllTimers());
+
+ let listbox = getByRole('listbox');
+ expect(listbox).toBeVisible();
+
+ rerender( );
+
+ await waitFor(() => expect(queryAllByRole('checkbox')).toEqual([]));
+ expect(getByRole('combobox')).toBeVisible();
+ expect(getByRole('listbox')).toBeVisible();
+
+ let outside = getAllByRole('checkbox', {hidden: true});
+ expect(outside[0]).toHaveAttribute('aria-hidden', 'true');
+ expect(outside[1]).toHaveAttribute('aria-hidden', 'true');
+ });
+
+ it('should handle when a new element is added to an already hidden container', async function () {
+ let Test = (props) => (
+
+ );
+
+ let {getByRole, getAllByRole, queryAllByRole, getByTestId, rerender} = render( );
+
+ let searchAutocomplete = getByRole('combobox');
+ let outer = getByTestId('test');
+
+ act(() => searchAutocomplete.focus());
+ await user.keyboard('{ArrowDown}');
+ act(() => jest.runAllTimers());
+
+ let listbox = getByRole('listbox');
+
+ expect(listbox).toBeVisible();
+ expect(outer).toHaveAttribute('aria-hidden', 'true');
+
+ rerender( );
+
+ await waitFor(() => expect(queryAllByRole('checkbox')).toEqual([]));
+ expect(getByRole('combobox')).toBeVisible();
+ expect(getByRole('listbox')).toBeVisible();
+
+ let outside = getAllByRole('checkbox', {hidden: true});
+ expect(outer).toHaveAttribute('aria-hidden', 'true');
+ expect(outside[0]).not.toHaveAttribute('aria-hidden');
+ expect(outside[1]).toHaveAttribute('aria-hidden', 'true');
+ });
+
+ it('should handle when a new element is added inside the listbox', async function () {
+ let Test = (props) => (
+
+ );
+
+ let {getByRole, queryAllByRole, rerender} = render(
+
+ );
+
+ let searchAutocomplete = getByRole('combobox');
+
+ act(() => {
+ searchAutocomplete.focus();
+ });
+ await user.keyboard('{ArrowDown}');
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ let listbox = getByRole('listbox');
+ let options = within(listbox).getAllByRole('option');
+ expect(options).toHaveLength(1);
+ expect(queryAllByRole('checkbox')).toEqual([]);
+
+ rerender( );
+
+ // Wait for mutation observer tick
+ await Promise.resolve();
+
+ options = within(listbox).getAllByRole('option');
+ expect(options).toHaveLength(2);
+
+ expect(queryAllByRole('checkbox')).toEqual([]);
+ expect(getByRole('combobox')).toBeVisible();
+ expect(getByRole('listbox')).toBeVisible();
+ });
+ });
+ });
+});
diff --git a/packages/@fds-design/avatar/README.md b/packages/@fds-design/avatar/README.md
new file mode 100644
index 0000000..3815de7
--- /dev/null
+++ b/packages/@fds-design/avatar/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/avatar
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/avatar/chromatic-fc/Avatar.stories.tsx b/packages/@fds-design/avatar/chromatic-fc/Avatar.stories.tsx
new file mode 100644
index 0000000..858ef30
--- /dev/null
+++ b/packages/@fds-design/avatar/chromatic-fc/Avatar.stories.tsx
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Avatar} from '..';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+const SRC_URL_1 =
+ 'https://mir-s3-cdn-cf.behance.net/project_modules/disp/690bc6105945313.5f84bfc9de488.png';
+const SRC_URL_2 = 'https://i.imgur.com/xIe7Wlb.png';
+
+export default {
+ title: 'Avatar'
+};
+
+export const all = () => (
+
+ Default
+
+ Disabled
+
+ Custom size
+
+
+);
+
diff --git a/packages/@fds-design/avatar/chromatic/Avatar.stories.tsx b/packages/@fds-design/avatar/chromatic/Avatar.stories.tsx
new file mode 100644
index 0000000..91f788d
--- /dev/null
+++ b/packages/@fds-design/avatar/chromatic/Avatar.stories.tsx
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Avatar} from '../';
+import {Meta} from '@storybook/react';
+import {SpectrumAvatarProps} from '@react-types/avatar';
+
+const SRC_URL_1 =
+ 'https://mir-s3-cdn-cf.behance.net/project_modules/disp/690bc6105945313.5f84bfc9de488.png';
+const SRC_URL_2 = 'https://i.imgur.com/xIe7Wlb.png';
+
+const meta: Meta = {
+ title: 'Avatar',
+ component: Avatar
+};
+
+export default meta;
+
+export const Default = {
+ args: {src: SRC_URL_1},
+ name: 'default'
+};
+
+export const Disabled = {
+ args: {isDisabled: true, src: SRC_URL_1},
+ name: 'isDisabled'
+};
+
+export const CustomSize = {
+ args: {size: 'avatar-size-700', src: SRC_URL_2},
+ name: 'with custom size'
+};
diff --git a/packages/@fds-design/avatar/docs/Avatar.mdx b/packages/@fds-design/avatar/docs/Avatar.mdx
new file mode 100644
index 0000000..a0b3202
--- /dev/null
+++ b/packages/@fds-design/avatar/docs/Avatar.mdx
@@ -0,0 +1,79 @@
+{/* Copyright 2022 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/avatar';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/avatar/package.json';
+
+```jsx import
+import {Avatar} from '@react-spectrum/avatar';
+import {Flex} from '@react-spectrum/layout';
+```
+
+---
+category: Content
+keywords: [avatar]
+---
+
+# Avatar
+
+{docs.exports.Avatar.description}
+
+
+
+## Example
+
+```tsx example
+
+```
+
+## Content
+
+The Avatar component is a thumbnail representation of an entity, such as a user or an organization. They accept a `src` attribute defining the image URL, and an `alt` attribute for an accessible description.
+
+### Accessibility
+
+By default, avatars are decorative and have an empty `alt` attribute. Standalone avatars with no surrounding context must have a custom `alt` prop defined for accessibility.
+
+### Internationalization
+
+To internationalize an Avatar, a localized string should be passed to the `alt` prop.
+
+## Props
+
+
+
+## Visual options
+
+### Disabled
+[View guidelines](https://spectrum.adobe.com/page/avatar/#Disabled)
+```tsx example
+
+```
+
+### Size
+[View guidelines](https://spectrum.adobe.com/page/avatar/#Size)
+
+Sizes can either be one of the predefined avatar size variables, or a custom size in pixels.
+
+```tsx example
+
+ {[50, 75, 100, 200, 300, 400, 500, 600, 700].map(size => (
+
+ ))}
+
+
+```
diff --git a/packages/@fds-design/avatar/index.ts b/packages/@fds-design/avatar/index.ts
new file mode 100644
index 0000000..b1a5da0
--- /dev/null
+++ b/packages/@fds-design/avatar/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2021 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/avatar/package.json b/packages/@fds-design/avatar/package.json
new file mode 100644
index 0000000..03f9374
--- /dev/null
+++ b/packages/@fds-design/avatar/package.json
@@ -0,0 +1,57 @@
+{
+ "name": "@fds-design/avatar",
+ "version": "3.0.17",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-types/avatar": "^3.0.11",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/avatar/src/Avatar.tsx b/packages/@fds-design/avatar/src/Avatar.tsx
new file mode 100644
index 0000000..04815a4
--- /dev/null
+++ b/packages/@fds-design/avatar/src/Avatar.tsx
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames, dimensionValue, useDOMRef, useSlotProps, useStyleProps} from '../../utils';
+import {DOMRef} from '@react-types/shared';
+import {filterDOMProps} from '@react-aria/utils';
+import React, {forwardRef} from 'react';
+import {SpectrumAvatarProps} from '@react-types/avatar';
+import styles from '@adobe/spectrum-css-temp/components/avatar/vars.css';
+import {useProviderProps} from '../../provider';
+
+const DEFAULT_SIZE = 'avatar-size-100';
+const SIZE_RE = /^size-\d+/;
+
+/**
+ * An avatar is a thumbnail representation of an entity, such as a user or an organization.
+ */
+export const Avatar = forwardRef(function Avatar(props: SpectrumAvatarProps, ref: DOMRef) {
+ props = useSlotProps(props, 'avatar');
+ const {
+ alt = '',
+ isDisabled,
+ size = DEFAULT_SIZE,
+ src,
+ ...otherProps
+ } = useProviderProps(props);
+
+ const {styleProps} = useStyleProps(otherProps);
+ const domRef = useDOMRef(ref);
+
+ const domProps = filterDOMProps(otherProps);
+
+ // Casting `size` as `any` since `isNaN` expects a `number`, but we want it
+ // to handle `string` numbers; e.g. '300' as opposed to 300
+ const sizeValue = typeof size !== 'number' && (SIZE_RE.test(size) || !isNaN(size as any))
+ ? dimensionValue(DEFAULT_SIZE) // override disallowed size values
+ : dimensionValue(size || DEFAULT_SIZE);
+
+ return (
+
+ );
+});
diff --git a/packages/@fds-design/avatar/src/index.ts b/packages/@fds-design/avatar/src/index.ts
new file mode 100644
index 0000000..c340ea0
--- /dev/null
+++ b/packages/@fds-design/avatar/src/index.ts
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2021 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.
+ */
+///
+export {Avatar} from './Avatar';
+export type {SpectrumAvatarProps} from '@react-types/avatar';
diff --git a/packages/@fds-design/avatar/stories/Avatar.stories.tsx b/packages/@fds-design/avatar/stories/Avatar.stories.tsx
new file mode 100644
index 0000000..ec25e54
--- /dev/null
+++ b/packages/@fds-design/avatar/stories/Avatar.stories.tsx
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Avatar} from '../';
+import {Meta} from '@storybook/react';
+import {SpectrumAvatarProps} from '@react-types/avatar';
+
+const SRC_URL_1 =
+ 'https://mir-s3-cdn-cf.behance.net/project_modules/disp/690bc6105945313.5f84bfc9de488.png';
+const SRC_URL_2 = 'https://i.imgur.com/xIe7Wlb.png';
+
+const meta: Meta = {
+ title: 'Avatar',
+ component: Avatar
+};
+
+export default meta;
+
+export const Default = {
+ args: {src: SRC_URL_1},
+ name: 'default'
+};
+
+export const Disabled = {
+ args: {isDisabled: true, src: SRC_URL_1},
+ name: 'isDisabled'
+};
+
+export const WithAltText = {
+ args: {alt: 'Pensive', src: SRC_URL_2},
+ name: 'with alt text'
+};
+
+export const CustomSize = {
+ args: {...WithAltText.args, size: 'avatar-size-700'},
+ name: 'with custom size'
+};
diff --git a/packages/@fds-design/avatar/test/Avatar.test.js b/packages/@fds-design/avatar/test/Avatar.test.js
new file mode 100644
index 0000000..f42e4a7
--- /dev/null
+++ b/packages/@fds-design/avatar/test/Avatar.test.js
@@ -0,0 +1,58 @@
+import {Avatar} from '../';
+import React from 'react';
+import {render, screen} from '@react-spectrum/test-utils-internal';
+
+let isOldReact = parseInt(React.version, 10) < 18;
+
+describe('Avatar', () => {
+ it('renders an avatar image', () => {
+ render( );
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation')).toBeInTheDocument();
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation')).toHaveAttribute('src', 'http://localhost/some_image.png');
+ });
+
+ it('can render an avatar image with an alt', () => {
+ render( );
+ expect(screen.getByAltText(/test avatar/i)).toBeInTheDocument();
+ });
+
+ describe('when given a custom size', () => {
+ it('supports custom sizes in units, such as pixels', () => {
+ render( );
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation')).toHaveStyle({
+ height: '80px',
+ width: '80px'
+ });
+ });
+
+ it('supports custom sizes in numbers', () => {
+ render( );
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation')).toHaveStyle({
+ height: '80px',
+ width: '80px'
+ });
+ });
+ });
+
+ it('supports custom class names', () => {
+ render( );
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation')).toHaveAttribute('class', expect.stringContaining('my-class'));
+ });
+
+ it('supports style props', () => {
+ render( );
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation', {hidden: true})).toBeInTheDocument();
+ });
+
+ it('supports custom DOM props', () => {
+ render( );
+ expect(screen.getByTestId(/test avatar/i)).toBeInTheDocument();
+ });
+
+ describe('when isDisabled = true', () => {
+ it('renders a disabled avatar image', () => {
+ render( );
+ expect(screen.getByRole(isOldReact ? 'img' : 'presentation')).toHaveAttribute('class', expect.stringMatching(/disabled/i));
+ });
+ });
+});
diff --git a/packages/@fds-design/badge/README.md b/packages/@fds-design/badge/README.md
new file mode 100644
index 0000000..723f73b
--- /dev/null
+++ b/packages/@fds-design/badge/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/badge
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/badge/chromatic-fc/Badge.stories.tsx b/packages/@fds-design/badge/chromatic-fc/Badge.stories.tsx
new file mode 100644
index 0000000..cc06ea5
--- /dev/null
+++ b/packages/@fds-design/badge/chromatic-fc/Badge.stories.tsx
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2022 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Badge} from '..';
+import {BadgeStory, renderVariants} from '../chromatic/Badge.stories';
+import CheckmarkCircle from '@spectrum-icons/workflow/src/CheckmarkCircle';
+import {ComponentMeta} from '@storybook/react';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+
+export default {
+ title: 'Badge',
+ component: Badge
+} as ComponentMeta;
+
+export const TextIcon: BadgeStory = {
+ name: 'Text & icon',
+ args: {children: <>Badge text >},
+ render: renderVariants
+};
diff --git a/packages/@fds-design/badge/chromatic/Badge.stories.tsx b/packages/@fds-design/badge/chromatic/Badge.stories.tsx
new file mode 100644
index 0000000..12702fb
--- /dev/null
+++ b/packages/@fds-design/badge/chromatic/Badge.stories.tsx
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2022 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Badge} from '../';
+import CheckmarkCircle from '@spectrum-icons/workflow/src/CheckmarkCircle';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+import {SpectrumBadgeProps} from '@react-types/badge';
+import {Text} from '@react-spectrum/text';
+
+let variants: SpectrumBadgeProps['variant'][] =
+ ['positive', 'info', 'negative', 'neutral', 'yellow', 'fuchsia', 'indigo', 'seafoam', 'magenta', 'purple'];
+
+export type BadgeStory = ComponentStoryObj;
+
+export default {
+ title: 'Badge',
+ component: Badge,
+ excludeStories: ['renderVariants']
+} as ComponentMeta;
+
+export const renderVariants = (args) => (
+
+ {variants.map((variant) => )}
+
+);
+
+export const TextOnly: BadgeStory = {
+ args: {children: 'Badge text'},
+ render: renderVariants
+};
+
+export const IconOnly: BadgeStory = {
+ args: {children: },
+ render: renderVariants
+};
+
+export const IconText: BadgeStory = {
+ name: 'Icon & text',
+ args: {children: <>Badge text >},
+ render: renderVariants
+};
+
+export const TextIcon: BadgeStory = {
+ name: 'Text & icon',
+ args: {children: <>Badge text >},
+ render: renderVariants
+};
+
+export const Overflow: BadgeStory = {
+ args: {children: '24 days left in trial', variant: 'positive', UNSAFE_style: {width: '74px'}}
+};
+
+export const OverflowWithIcon: BadgeStory = {
+ args: {children: <>24 days left in trial >, variant: 'positive', UNSAFE_style: {width: '74px'}}
+};
diff --git a/packages/@fds-design/badge/docs/Badge.mdx b/packages/@fds-design/badge/docs/Badge.mdx
new file mode 100644
index 0000000..91af460
--- /dev/null
+++ b/packages/@fds-design/badge/docs/Badge.mdx
@@ -0,0 +1,105 @@
+{/* Copyright 2022 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/badge';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/badge/package.json';
+
+```jsx import
+import {Badge} from '@react-spectrum/badge';
+```
+
+---
+category: Status
+keywords: [badge]
+---
+
+# Badge
+
+{docs.exports.Badge.description}
+
+
+
+## Example
+
+```tsx example
+Licensed
+```
+
+## Content
+
+Badges can have a label, an icon, or both. An icon is provided by passing an icon component as a child to the Badge.
+A visible label can be provided by passing a string or a Text component as a child, depending on whether the Badge has an accompanying icon.
+
+```tsx example
+import {Text} from '@react-spectrum/text';
+import CheckmarkCircle from '@spectrum-icons/workflow/CheckmarkCircle';
+
+
+
+ Icon + Label
+
+```
+
+### Accessibility
+If a visible label isn't specified, an `aria-label` must be provided to the icon for accessibility.
+
+
+### Internationalization
+
+To internationalize a Badge, a localized string should be set as the child content of the Badge.
+For languages that are read right-to-left (e.g. Hebrew and Arabic), the Badge is automatically flipped.
+
+## Props
+
+
+
+## Visual options
+
+### Variant
+[View guidelines](https://spectrum.adobe.com/page/badge/#Semantic-variants)
+
+When badges have a semantic meaning, they should use semantic colors.
+Use the appropriate color to indicate status as follows.
+
+```tsx example
+import {Flex} from '@react-spectrum/layout';
+
+
+ Green: Approved, Complete, Success, New, Purchased, Licensed
+ Blue: Active, In Use, Live, Published
+ Red: Error, Alert, Rejected, Failed
+ Gray: Archived, Deleted, Paused, Draft, Not Started, Ended
+
+```
+
+When badges are used to color code categories, they use label colors. The ideal usage for these is when there
+are 8 or fewer categories being color coded.
+
+```tsx example
+import {Flex} from '@react-spectrum/layout';
+
+
+ Seafoam
+ Indigo
+ Purple
+ Fuchsia
+ Magenta
+ Yellow
+
+```
diff --git a/packages/@fds-design/badge/index.ts b/packages/@fds-design/badge/index.ts
new file mode 100644
index 0000000..4e99315
--- /dev/null
+++ b/packages/@fds-design/badge/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2022 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/badge/package.json b/packages/@fds-design/badge/package.json
new file mode 100644
index 0000000..01a62db
--- /dev/null
+++ b/packages/@fds-design/badge/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "@fds-design/badge",
+ "version": "3.1.18",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/text": "file:../../text",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-types/badge": "^3.1.13",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/badge/src/Badge.tsx b/packages/@fds-design/badge/src/Badge.tsx
new file mode 100644
index 0000000..768d823
--- /dev/null
+++ b/packages/@fds-design/badge/src/Badge.tsx
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2022 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames, SlotProvider, useDOMRef, useStyleProps} from '../../utils';
+import {DOMRef} from '@react-types/shared';
+import {filterDOMProps} from '@react-aria/utils';
+import React, {forwardRef} from 'react';
+import {SpectrumBadgeProps} from '@react-types/badge';
+import styles from '@adobe/spectrum-css-temp/components/badge/vars.css';
+import {Text} from '../../text';
+import {useProviderProps} from '../../provider';
+
+
+/**
+ * Badges are used for showing a small amount of color-categorized metadata, ideal for getting a user's attention.
+ */
+export const Badge = forwardRef(function Badge(props: SpectrumBadgeProps, ref: DOMRef) {
+ let {
+ children,
+ variant,
+ ...otherProps
+ } = useProviderProps(props);
+ let domRef = useDOMRef(ref);
+ let {styleProps} = useStyleProps(otherProps);
+ let isTextOnly = React.Children.toArray(props.children).every(c => !React.isValidElement(c));
+
+ return (
+
+
+
+ {
+ typeof children === 'string' || isTextOnly
+ ? {children}
+ : children
+ }
+
+
+ );
+});
diff --git a/packages/@fds-design/badge/src/index.ts b/packages/@fds-design/badge/src/index.ts
new file mode 100644
index 0000000..5e5a050
--- /dev/null
+++ b/packages/@fds-design/badge/src/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2022 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.
+ */
+
+///
+
+export {Badge} from './Badge';
+export type {SpectrumBadgeProps} from '@react-types/badge';
diff --git a/packages/@fds-design/badge/stories/Badge.stories.tsx b/packages/@fds-design/badge/stories/Badge.stories.tsx
new file mode 100644
index 0000000..d1934b0
--- /dev/null
+++ b/packages/@fds-design/badge/stories/Badge.stories.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2022 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Badge} from '../';
+import CheckmarkCircle from '@spectrum-icons/workflow/CheckmarkCircle';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+
+type BadgeStory = ComponentStoryObj;
+
+export default {
+ title: 'Badge',
+ component: Badge,
+ argTypes: {
+ variant: {
+ control: {
+ type: 'select',
+ options: ['positive', 'negative', 'neutral', 'info', 'indigo', 'yellow', 'magenta', 'fuchsia', 'purple', 'seafoam']
+ }
+ }
+ }
+} as ComponentMeta;
+
+export const Default: BadgeStory = {
+ args: {children: 'Licensed', variant: 'positive'},
+ name: 'Default'
+};
+
+export const WithIcon: BadgeStory = {
+ args: {children: <>Licensed >, variant: 'positive'},
+ name: 'With icon'
+};
+
+export const WithIconReverseOrder: BadgeStory = {
+ args: {children: <>Licensed >, variant: 'positive'},
+ name: 'With icon, order reversed'
+};
+
+export const IconOnly: BadgeStory = {
+ args: {children: , variant: 'positive'},
+ name: 'Icon only'
+};
+
+export const Overflow: BadgeStory = {
+ args: {children: '24 days left in trial', variant: 'positive', UNSAFE_style: {width: '74px'}}
+};
diff --git a/packages/@fds-design/badge/test/Badge.ssr.test.js b/packages/@fds-design/badge/test/Badge.ssr.test.js
new file mode 100644
index 0000000..6fd2d31
--- /dev/null
+++ b/packages/@fds-design/badge/test/Badge.ssr.test.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('Badge SSR', function () {
+ it('should render without errors', async function () {
+ await testSSR(__filename, `
+ import {Badge} from '../';
+
+ Badge text
+ `);
+ });
+});
diff --git a/packages/@fds-design/badge/test/Badge.test.js b/packages/@fds-design/badge/test/Badge.test.js
new file mode 100644
index 0000000..3593098
--- /dev/null
+++ b/packages/@fds-design/badge/test/Badge.test.js
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Badge} from '../';
+import CheckmarkCircle from '@spectrum-icons/workflow/CheckmarkCircle';
+import React from 'react';
+import {render} from '@react-spectrum/test-utils-internal';
+import {Text} from '@react-spectrum/text';
+import {within} from '@testing-library/dom';
+
+
+describe('Badge', function () {
+ it.each`
+ Name | Component | props
+ ${'Badge'} | ${Badge} | ${{}}
+ `('$Name text-only', function ({Component, props}) {
+ let {getByTestId} = render(Badge of honor );
+
+ let badge = getByTestId('badge');
+ expect(within(badge).getByText('Badge of honor')).toBeInTheDocument();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'Badge'} | ${Badge} | ${{}}
+ `('$Name icon-only', function ({Component, props}) {
+ let {getByTestId} = render( );
+
+ let badge = getByTestId('badge');
+ expect(within(badge).getByRole('img', {hidden: true})).toBeInTheDocument();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'Badge'} | ${Badge} | ${{}}
+ `('$Name icon-text pair', function ({Component, props}) {
+ let {getByTestId} = render(Badge of honor );
+
+ let badge = getByTestId('badge');
+ expect(within(badge).getByRole('img', {hidden: true})).toBeInTheDocument();
+ expect(within(badge).getByText('Badge of honor')).toBeInTheDocument();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'Badge'} | ${Badge} | ${{}}
+ `('$Name forwards ref', function ({Component, props}) {
+ let ref = React.createRef();
+ let {getByTestId} = render(Badge of honor );
+
+ let badge = getByTestId('badge');
+ expect(badge).toBe(ref.current.UNSAFE_getDOMNode());
+ });
+});
diff --git a/packages/@fds-design/breadcrumbs/README.md b/packages/@fds-design/breadcrumbs/README.md
new file mode 100644
index 0000000..b48f681
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/breadcrumbs
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/breadcrumbs/chromatic-fc/Breadcrumbs.stories.tsx b/packages/@fds-design/breadcrumbs/chromatic-fc/Breadcrumbs.stories.tsx
new file mode 100644
index 0000000..1494697
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/chromatic-fc/Breadcrumbs.stories.tsx
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Breadcrumbs} from '../';
+import {Default as ChromaticDefault} from '../chromatic/Breadcrumbs.stories';
+
+export default {
+ title: 'Breadcrumbs',
+ component: Breadcrumbs
+};
+
+export const Default = {
+ ...ChromaticDefault
+};
diff --git a/packages/@fds-design/breadcrumbs/chromatic/Breadcrumbs.stories.tsx b/packages/@fds-design/breadcrumbs/chromatic/Breadcrumbs.stories.tsx
new file mode 100644
index 0000000..6b02aaf
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/chromatic/Breadcrumbs.stories.tsx
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Breadcrumbs, Item} from '../';
+import {Meta} from '@storybook/react';
+import React from 'react';
+
+const meta: Meta = {
+ title: 'Breadcrumbs',
+ component: Breadcrumbs
+};
+
+export default meta;
+
+
+export const Default = {
+ args: {
+ children: [
+ - The quick brown fox jumps over
,
+ - My Documents
,
+ - Kangaroos jump high
,
+ - Koalas are very cute
,
+ - Wombat's noses
,
+ - Wattle trees
,
+ - April 7
+ ]
+ }
+};
+
+export const IsMultiline = {
+ args: {...Default.args, isMultiline: true}
+};
+
+export const SizeS = {
+ args: {...Default.args, size: 'S'}
+};
+
+export const SizeM = {
+ args: {...Default.args, size: 'M'}
+};
+
+export const Truncated = {
+ decorators: [
+ (Story) => (
+
+
+
+ )
+ ],
+ args: {...Default.args}
+};
+
+export const ShowRoot = {
+ args: {...Default.args, showRoot: true}
+};
diff --git a/packages/@fds-design/breadcrumbs/docs/Breadcrumbs.mdx b/packages/@fds-design/breadcrumbs/docs/Breadcrumbs.mdx
new file mode 100644
index 0000000..6051326
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/docs/Breadcrumbs.mdx
@@ -0,0 +1,201 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/breadcrumbs';
+import {HeaderInfo, PropTable, TypeLink, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/breadcrumbs/package.json';
+
+```jsx import
+import {Breadcrumbs, Item} from '@react-spectrum/breadcrumbs';
+import {View} from '@react-spectrum/view';
+```
+
+---
+category: Navigation
+keywords: [collections, dropdown]
+---
+
+# Breadcrumbs
+
+{docs.exports.Breadcrumbs.description}
+
+
+
+## Example
+
+```tsx example
+
+ - Home
+ - Trendy
+ - March 2020 Assets
+
+```
+
+## Content
+Breadcrumbs follow the [Collection Components](../react-stately/collections.html) API, accepting only static children.
+Similar to [Menu](Menu.html), Breadcrumbs accepts < > elements as children,
+each with a `key` prop, which is passed to the `onAction` handler to identify the selected item.
+Basic usage of Breadcrumbs, as seen in the example above, shows a list of elements,
+populated with a string. See [Events](#events) for more information.
+
+### Internationalization
+In order to internationalize Breadcrumbs, the content of all child items should be localized.
+
+## Events
+Use the `onAction` prop as a callback to handle press events on items.
+
+```tsx example
+function Example() {
+ let folders = [
+ {id: 1, label: 'Home'},
+ {id: 2, label: 'Trendy'},
+ {id: 3, label: 'March 2020 Assets'}
+ ];
+ let [folderId, setFolderId] = React.useState(null);
+ return (
+
+
setFolderId(a)}>
+ {folders.map(f => - {f.label}
)}
+
+
You pressed folder ID: {folderId}
+
+ );
+}
+```
+
+## Links
+
+By default, interacting with an item in Breadcrumbs triggers `onAction`. Items may also be links to another page or website. This can be achieved by passing the `href` prop to the `- ` component.
+
+```tsx example
+
+ - Home
+ - React Spectrum
+ - Breadcrumbs
+
+```
+
+### Client side routing
+
+The `- ` component works with frameworks and client side routers like [Next.js](https://nextjs.org/) and [React Router](https://reactrouter.com/en/main). As with other React Spectrum components that support links, this works via the [Provider](Provider.html) component at the root of your app. See the [client side routing guide](routing.html) to learn how to set this up.
+
+## Props
+
+
+
+## Visual options
+
+### Size
+[View guidelines](https://spectrum.adobe.com/page/breadcrumbs/#Options)
+
+Small
+```tsx example
+
+ - Home
+ - Trendy
+
+```
+
+Medium
+```tsx example
+
+ - Home
+ - Trendy
+
+```
+
+Large (default)
+```tsx example
+
+ - Home
+ - Trendy
+
+```
+
+### Multiline
+
+Use the `isMultiline` prop to place the last item below the other items.
+This adds emphasis to the current location as a page title or heading.
+
+```tsx example
+
+ - Home
+ - Trendy
+ - March 2020 Assets
+
+```
+
+### Root context
+[View guidelines](https://spectrum.adobe.com/page/breadcrumbs/#With-root-context)
+
+Some applications find that always displaying the root item is useful to orient users.
+This variation keeps the root visible when other items are truncated into the menu.
+
+```tsx example
+
+
+ - Home
+ - Trendy
+ - March 2020 Assets
+ - Winter
+ - Holiday
+
+
+```
+
+### Disabled
+
+Breadcrumbs in a disabled state shows items, but indicates that navigation is not available.
+This can be used to maintain layout continuity.
+
+```tsx example
+
+ - Home
+ - Trendy
+ - March 2020 Assets
+
+```
+
+### Visible items (overflow behavior)
+[View guidelines](https://spectrum.adobe.com/page/breadcrumbs/#Truncation-and-overflow)
+
+Breadcrumbs collapses items into a menu when space is limited. It will only show a maximum of 4 visible items including the root and menu button, if either are visible. If the root item cannot be rendered in the available horizontal
+space, it will be collapsed into the menu regardless of `showRoot`. Note that the last breadcrumb item will automatically
+truncate with an ellipsis instead of collapsing into the menu.
+
+Resize your browser window to see the above behavior in the examples below.
+
+```tsx example
+
+ - My Shared Documents
+ - North America Spring Catalogue
+ - March 2020
+ - Downloaded Screenshots and Assets (approval required)
+ - Streetwear
+ - Jackets
+
+```
+
+```tsx example
+
+ - My Shared Documents
+ - North America Spring Catalogue
+ - March 2020
+ - Downloaded Screenshots and Assets (approval required)
+
+```
diff --git a/packages/@fds-design/breadcrumbs/index.ts b/packages/@fds-design/breadcrumbs/index.ts
new file mode 100644
index 0000000..1210ae1
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/breadcrumbs/package.json b/packages/@fds-design/breadcrumbs/package.json
new file mode 100644
index 0000000..b83d3f7
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/package.json
@@ -0,0 +1,66 @@
+{
+ "name": "@fds-design/breadcrumbs",
+ "version": "3.9.12",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/breadcrumbs": "^3.5.19",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/button": "file:../../button",
+ "@react-spectrum/menu": "file:../../menu",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/collections": "^3.12.0",
+ "@react-types/breadcrumbs": "^3.7.9",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/breadcrumbs/src/BreadcrumbItem.tsx b/packages/@fds-design/breadcrumbs/src/BreadcrumbItem.tsx
new file mode 100644
index 0000000..b19ca8b
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/src/BreadcrumbItem.tsx
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {BreadcrumbItemProps} from '@react-types/breadcrumbs';
+import ChevronRightSmall from '@spectrum-icons/ui/ChevronRightSmall';
+import {classNames} from '../../utils';
+import {FocusRing} from '@react-aria/focus';
+import {mergeProps} from '@react-aria/utils';
+import React, {Fragment, useRef} from 'react';
+import styles from '@adobe/spectrum-css-temp/components/breadcrumb/vars.css';
+import {useBreadcrumbItem} from '@react-aria/breadcrumbs';
+import {useHover} from '@react-aria/interactions';
+import {useLocale} from '@react-aria/i18n';
+
+interface SpectrumBreadcrumbItemProps extends BreadcrumbItemProps {
+ isMenu?: boolean
+}
+
+export function BreadcrumbItem(props: SpectrumBreadcrumbItemProps) {
+ let {
+ children,
+ isCurrent,
+ isDisabled,
+ isMenu
+ } = props;
+
+ let {direction} = useLocale();
+ let ref = useRef(null);
+ let ElementType: React.ElementType = props.href ? 'a' : 'span';
+ let {itemProps} = useBreadcrumbItem({
+ ...props,
+ elementType: ElementType
+ }, ref);
+ let {hoverProps, isHovered} = useHover(props);
+
+ // If this item contains a menu button, then it shouldn't be a link.
+ if (isMenu) {
+ itemProps = {};
+ }
+
+ return (
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/packages/@fds-design/breadcrumbs/src/Breadcrumbs.tsx b/packages/@fds-design/breadcrumbs/src/Breadcrumbs.tsx
new file mode 100644
index 0000000..f0d6ac0
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/src/Breadcrumbs.tsx
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+import {ActionButton} from '../../button';
+import {BreadcrumbItem} from './BreadcrumbItem';
+import {classNames, useDOMRef, useStyleProps} from '../../utils';
+import {DOMRef, Key} from '@react-types/shared';
+import FolderBreadcrumb from '@spectrum-icons/ui/FolderBreadcrumb';
+import {Menu, MenuTrigger} from '../../menu';
+import React, {ReactElement, useCallback, useRef} from 'react';
+import {SpectrumBreadcrumbsProps} from '@react-types/breadcrumbs';
+import styles from '@adobe/spectrum-css-temp/components/breadcrumb/vars.css';
+import {useBreadcrumbs} from '@react-aria/breadcrumbs';
+import {useLayoutEffect, useResizeObserver, useValueEffect} from '@react-aria/utils';
+import {useProviderProps} from '../../provider';
+
+const MIN_VISIBLE_ITEMS = 1;
+const MAX_VISIBLE_ITEMS = 4;
+
+/**
+ * Breadcrumbs show hierarchy and navigational context for a user’s location within an application.
+ */
+export const Breadcrumbs = React.forwardRef(function Breadcrumbs(props: SpectrumBreadcrumbsProps, ref: DOMRef) {
+ props = useProviderProps(props);
+ let {
+ size = 'L',
+ isMultiline,
+ children,
+ showRoot,
+ isDisabled,
+ onAction,
+ autoFocusCurrent,
+ ...otherProps
+ } = props;
+
+ // Not using React.Children.toArray because it mutates the key prop.
+ let childArray: ReactElement[] = [];
+ React.Children.forEach(children, (child, index) => {
+ if (React.isValidElement(child)) {
+ if (child.key == null) {
+ child = React.cloneElement(child, {key: index});
+ }
+ childArray.push(child);
+ }
+ });
+
+ let domRef = useDOMRef(ref);
+ let listRef = useRef(null);
+
+ let [visibleItems, setVisibleItems] = useValueEffect(childArray.length);
+
+ let {navProps} = useBreadcrumbs(props);
+ let {styleProps} = useStyleProps(otherProps);
+
+ let updateOverflow = useCallback(() => {
+ let computeVisibleItems = (visibleItems: number): number => {
+ // Refs can be null at runtime.
+ let currListRef: HTMLUListElement | null = listRef.current;
+ if (!currListRef) {
+ return visibleItems;
+ }
+
+ let listItems = Array.from(currListRef.children) as HTMLLIElement[];
+ if (listItems.length <= 0) {
+ return visibleItems;
+ }
+ let containerWidth = currListRef.offsetWidth;
+ let isShowingMenu = childArray.length > visibleItems;
+ let calculatedWidth = 0;
+ let newVisibleItems = 0;
+ let maxVisibleItems = MAX_VISIBLE_ITEMS;
+
+ if (showRoot) {
+ calculatedWidth += (listItems.shift() as HTMLLIElement).offsetWidth;
+ newVisibleItems++;
+ }
+
+ if (isShowingMenu) {
+ calculatedWidth += (listItems.shift() as HTMLLIElement).offsetWidth;
+ maxVisibleItems--;
+ }
+
+ if (showRoot && calculatedWidth >= containerWidth) {
+ newVisibleItems--;
+ }
+
+ // TODO: what if multiline and only one breadcrumb??
+ if (isMultiline) {
+ listItems.pop();
+ newVisibleItems++;
+ } else {
+ if (listItems.length > 0) {
+ // Ensure the last breadcrumb isn't truncated when we measure it.
+ let last = (listItems.pop() as HTMLLIElement);
+ last.style.overflow = 'visible';
+
+ calculatedWidth += last.offsetWidth;
+ if (calculatedWidth < containerWidth) {
+ newVisibleItems++;
+ }
+
+ last.style.overflow = '';
+ }
+ }
+
+ for (let breadcrumb of listItems.reverse()) {
+ calculatedWidth += breadcrumb.offsetWidth;
+ if (calculatedWidth < containerWidth) {
+ newVisibleItems++;
+ }
+ }
+
+ return Math.max(MIN_VISIBLE_ITEMS, Math.min(maxVisibleItems, newVisibleItems));
+ };
+
+ setVisibleItems(function *() {
+ // Update to show all items.
+ yield childArray.length;
+
+ // Measure, and update to show the items that fit.
+ let newVisibleItems = computeVisibleItems(childArray.length);
+ yield newVisibleItems;
+
+ // If the number of items is less than the number of children,
+ // then update again to ensure that the menu fits.
+ if (newVisibleItems < childArray.length && newVisibleItems > 1) {
+ yield computeVisibleItems(newVisibleItems);
+ }
+ });
+ }, [childArray.length, setVisibleItems, showRoot, isMultiline]);
+
+ useResizeObserver({ref: domRef, onResize: updateOverflow});
+
+ let lastChildren = useRef(null);
+ useLayoutEffect(() => {
+ if (children !== lastChildren.current) {
+ lastChildren.current = children;
+ updateOverflow();
+ }
+ });
+
+ let contents = childArray;
+ if (childArray.length > visibleItems) {
+ let selectedItem = childArray[childArray.length - 1];
+ let selectedKey = selectedItem.key ?? childArray.length - 1;
+ let onMenuAction = (key: Key) => {
+ // Don't fire onAction when clicking on the last item
+ if (key !== selectedKey && onAction) {
+ onAction(key);
+ }
+ };
+
+ let menuItem = (
+
+
+
+
+
+
+ {childArray}
+
+
+
+ );
+
+ contents = [menuItem];
+ let breadcrumbs = [...childArray];
+ let endItems = visibleItems;
+ if (showRoot && visibleItems > 1) {
+ let rootItem = breadcrumbs.shift();
+ if (rootItem) {
+ contents.unshift(rootItem);
+ }
+ endItems--;
+ }
+ contents.push(...breadcrumbs.slice(-endItems));
+ }
+
+ let lastIndex = contents.length - 1;
+ let breadcrumbItems = contents.map((child, index) => {
+ let isCurrent = index === lastIndex;
+ let key = child.key ?? index;
+ let onPress = () => {
+ if (onAction) {
+ onAction(key);
+ }
+ };
+
+ return (
+
+
+ {child.props.children}
+
+
+ );
+ });
+
+ return (
+
+
+
+ );
+});
diff --git a/packages/@fds-design/breadcrumbs/src/index.ts b/packages/@fds-design/breadcrumbs/src/index.ts
new file mode 100644
index 0000000..650e47c
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/src/index.ts
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2020 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.
+ */
+///
+export {Breadcrumbs} from './Breadcrumbs';
+export {Item} from '@react-stately/collections';
+export type {SpectrumBreadcrumbsProps} from '@react-types/breadcrumbs';
diff --git a/packages/@fds-design/breadcrumbs/stories/Breadcrumbs.stories.tsx b/packages/@fds-design/breadcrumbs/stories/Breadcrumbs.stories.tsx
new file mode 100644
index 0000000..8aae4aa
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/stories/Breadcrumbs.stories.tsx
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {Breadcrumbs} from '../';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+// import {Heading} from '@react-spectrum/text';
+import {Item} from '@react-stately/collections';
+import React from 'react';
+
+let styles = {
+ width: '100vw'
+};
+const CenterDecorator = storyFn => ;
+
+export type BreadcrumbsStory = ComponentStoryObj;
+
+export default {
+ title: 'Breadcrumbs',
+ component: Breadcrumbs,
+ decorators: [storyFn => CenterDecorator(storyFn)],
+ args: {
+ onAction: action('onAction')
+ },
+ argTypes: {
+ onAction: {
+ table: {
+ disable: true
+ }
+ },
+ isMultiline: {
+ control: 'boolean'
+ },
+ showRoot: {
+ control: 'boolean'
+ },
+ isDisabled: {
+ control: 'boolean'
+ },
+ autoFocusCurrent: {
+ control: 'boolean'
+ },
+ size: {
+ control: 'select',
+ options: ['S', 'M', 'L']
+ }
+ }
+} as ComponentMeta;
+
+export const Default: BreadcrumbsStory = {
+ render: (args) => render(args),
+ name: '3 items'
+};
+
+export const DefaultTruncated: BreadcrumbsStory = {
+ render: (args) => (
+
+ {render(args)}
+
+ ),
+ name: 'truncated'
+};
+
+export const RenderMany: BreadcrumbsStory = {
+ render: (args) => (
+
+ {renderMany(args)}
+
+ ),
+ name: '7 items, resizable container'
+};
+
+export const OneItem: BreadcrumbsStory = {
+ render: (args) => (
+
+ - Root
+
+ ),
+ name: '1 item'
+};
+
+export const Links: BreadcrumbsStory = {
+ render: (args) => (
+
+ - Example.com
+ - Foo
+ - Bar
+ - Baz
+ - Qux
+
+ )
+};
+
+function render(props) {
+ return (
+
+ - The quick brown fox jumps over
+ - My Documents
+ - Kangaroos jump high
+
+ );
+}
+
+function renderMany(props = {}) {
+ return (
+
+ - The quick brown fox jumps over
+ - My Documents
+ - Kangaroos jump high
+ - Koalas are very cute
+ - Wombat's noses
+ - Wattle trees
+ - April 7
+
+ );
+}
+
+// TODO: add back in when heading case is fixed?
+// .add(
+// 'last item Heading',
+// () => renderHeading()
+// )
+// .add(
+// 'last item Heading, size: S',
+// () => renderHeading({size: 'S'})
+// )
+// .add(
+// 'last item Heading, size: M',
+// () => renderHeading({size: 'M'})
+// )
+// .add(
+// 'last item Heading, isMultiline',
+// () => renderHeading({isMultiline: true})
+// )
+// .add(
+// 'last item Heading, size: S, isMultiline',
+// () => renderHeading({isMultiline: true, size: 'S'})
+// )
+// .add(
+// 'last item Heading, size: M, isMultiline',
+// () => renderHeading({isMultiline: true, size: 'M'})
+// )
+
+// function renderHeading(props = {}) {
+// return (
+//
+// -
+// The quick brown fox jumps over
+//
+// -
+// My Documents
+//
+// -
+//
+// Kangaroos jump high
+//
+//
+//
+// );
+// }
diff --git a/packages/@fds-design/breadcrumbs/test/BreadcrumbItem.test.js b/packages/@fds-design/breadcrumbs/test/BreadcrumbItem.test.js
new file mode 100644
index 0000000..bd44c1f
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/test/BreadcrumbItem.test.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {BreadcrumbItem} from '../src/BreadcrumbItem';
+import {pointerMap, render} from '@react-spectrum/test-utils-internal';
+import React from 'react';
+import userEvent from '@testing-library/user-event';
+
+// v3 component
+describe('BreadcrumbItem', function () {
+ it('Handles defaults', () => {
+ let {getByText} = render(Breadcrumb item );
+ let breadcrumbItem = getByText('Breadcrumb item');
+ expect(breadcrumbItem.id).toBeDefined();
+ expect(breadcrumbItem.tabIndex).toBe(0);
+ });
+
+ it('Handles current', () => {
+ let {getByText} = render(Breadcrumb item );
+ let breadcrumbItem = getByText('Breadcrumb item');
+ expect(breadcrumbItem.tabIndex).toBe(-1);
+ expect(breadcrumbItem).toHaveAttribute('aria-current', 'page');
+ });
+
+ it('Handles disabled', async () => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onPressSpy = jest.fn();
+ let {getByText} = render(Breadcrumb item );
+ let breadcrumbItem = getByText('Breadcrumb item');
+ expect(breadcrumbItem.tabIndex).toBe(-1);
+ expect(breadcrumbItem).toHaveAttribute('aria-disabled', 'true');
+ await user.click(breadcrumbItem);
+ expect(onPressSpy).toHaveBeenCalledTimes(0);
+ });
+
+ it('Handles onPress', async () => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onPressSpy = jest.fn();
+ let {getByText} = render(Breadcrumb item );
+ let breadcrumbItem = getByText('Breadcrumb item');
+ await user.click(breadcrumbItem);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it('Handles custom element type', () => {
+ let {getByText} = render(
+
+ Breadcrumb item
+
+ );
+ let breadcrumbItem = getByText('Breadcrumb item');
+ expect(breadcrumbItem.id).toBeDefined();
+ expect(breadcrumbItem.tabIndex).toBe(0);
+ expect(breadcrumbItem.href).toBeDefined();
+ });
+});
diff --git a/packages/@fds-design/breadcrumbs/test/Breadcrumbs.ssr.test.js b/packages/@fds-design/breadcrumbs/test/Breadcrumbs.ssr.test.js
new file mode 100644
index 0000000..3fa751c
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/test/Breadcrumbs.ssr.test.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('Breadcrumbs SSR', function () {
+ it('should render without errors', async function () {
+ await testSSR(__filename, `
+ import {Breadcrumbs, Item} from '../';
+
+
+ - One
+
+ `);
+ });
+});
diff --git a/packages/@fds-design/breadcrumbs/test/Breadcrumbs.test.js b/packages/@fds-design/breadcrumbs/test/Breadcrumbs.test.js
new file mode 100644
index 0000000..43c5073
--- /dev/null
+++ b/packages/@fds-design/breadcrumbs/test/Breadcrumbs.test.js
@@ -0,0 +1,478 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, pointerMap, render, within} from '@react-spectrum/test-utils-internal';
+import {Breadcrumbs} from '../';
+import {Item} from '@react-stately/collections';
+import {Provider} from '@react-spectrum/provider';
+import React, {useRef} from 'react';
+import {theme} from '@react-spectrum/theme-default';
+import userEvent from '@testing-library/user-event';
+
+describe('Breadcrumbs', function () {
+ let user;
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.useFakeTimers();
+ });
+ beforeEach(() => {
+ jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockImplementation(function () {
+ if (this instanceof HTMLUListElement) {
+ return 500;
+ }
+
+ return 100;
+ });
+
+ window.HTMLElement.prototype.scrollIntoView = jest.fn();
+ });
+
+ afterEach(() => {
+ HTMLElement.prototype.scrollIntoView.mockRestore();
+ });
+
+ it('$Name handles defaults', function () {
+ let {getByLabelText} = render(
+
+ - Folder 1
+
+ );
+
+ let breadcrumbs = getByLabelText('breadcrumbs-test');
+ expect(breadcrumbs).toHaveAttribute('id', 'breadcrumbs-id');
+ });
+
+ // v3 functionality, omitting v2 component
+ it('Handles UNSAFE_className', () => {
+ let {getByRole} = render(
+
+ - Folder 1
+
+ );
+ let breadcrumbs = getByRole('list');
+ expect(breadcrumbs).toHaveAttribute('class', expect.stringContaining('test-class'));
+ });
+
+ it('Handles multiple items', () => {
+ let {getByText} = render(
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+
+ );
+ let item1 = getByText('Folder 1');
+ expect(item1.tabIndex).toBe(0);
+ expect(item1).not.toHaveAttribute('aria-current');
+ let item2 = getByText('Folder 2');
+ expect(item2.tabIndex).toBe(0);
+ expect(item2).not.toHaveAttribute('aria-current');
+ let item3 = getByText('Folder 3');
+ expect(item3.tabIndex).toBe(-1);
+ expect(item3).toHaveAttribute('aria-current', 'page');
+ });
+
+ it('Handles single item and showRoot', () => {
+ let {getByText} = render(
+
+ - Folder 1
+
+ );
+ let item = getByText('Folder 1');
+ expect(item).toBeTruthy();
+ expect(item.tabIndex).toBe(-1);
+ });
+
+ it('Should handle forward ref', function () {
+ let ref;
+ let Component = () => {
+ ref = useRef();
+ return (
+
+ - Folder 1
+
+ );
+ };
+ let {getByLabelText} = render( );
+ let breadcrumb = getByLabelText('breadcrumbs-test');
+ expect(breadcrumb).toBe(ref.current.UNSAFE_getDOMNode());
+ });
+
+ it('Handles size="S"', () => {
+ let {getByRole} = render(
+
+ - Folder 1
+
+ );
+ let breadcrumbs = getByRole('list');
+ expect(breadcrumbs).toHaveAttribute('class', expect.stringContaining('--small'));
+ });
+
+ it('Handles size="M"', () => {
+ let {getByRole} = render(
+
+ - Folder 1
+
+ );
+ let breadcrumbs = getByRole('list');
+ expect(breadcrumbs).toHaveAttribute('class', expect.stringContaining('--medium'));
+ });
+
+ it('shows four items with no menu', () => {
+ let {getByText, getByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+
+
+ );
+ let {children} = getByRole('list');
+ expect(within(children[0]).queryByRole('button')).toBeNull();
+ expect(getByText('Folder 1')).toBeTruthy();
+ expect(getByText('Folder 2')).toBeTruthy();
+ expect(getByText('Folder 3')).toBeTruthy();
+ expect(getByText('Folder 4')).toBeTruthy();
+ });
+
+ it('shows a maximum of 4 items', () => {
+ let {getByText, getByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+ let {children} = getByRole('list');
+ expect(within(children[0]).getByRole('button')).toBeTruthy();
+ expect(() => getByText('Folder 1')).toThrow();
+ expect(() => getByText('Folder 2')).toThrow();
+ expect(getByText('Folder 3')).toBeTruthy();
+ expect(getByText('Folder 4')).toBeTruthy();
+ expect(getByText('Folder 5')).toBeTruthy();
+ });
+
+ it('shows a maximum of 4 items with showRoot', () => {
+ let {getByText, getByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+ let {children} = getByRole('list');
+ expect(getByText('Folder 1')).toBeTruthy();
+ expect(within(children[1]).getByRole('button')).toBeTruthy();
+ expect(() => getByText('Folder 2')).toThrow();
+ expect(() => getByText('Folder 3')).toThrow();
+ expect(getByText('Folder 4')).toBeTruthy();
+ expect(getByText('Folder 5')).toBeTruthy();
+ });
+
+ it('Handles isDisabled', () => {
+ let {getByText} = render(
+
+ - Folder 1
+ - Folder 2
+
+ );
+
+ let item1 = getByText('Folder 1');
+ expect(item1).toHaveAttribute('aria-disabled', 'true');
+ let item2 = getByText('Folder 2');
+ expect(item2).toHaveAttribute('aria-disabled', 'true');
+ });
+
+ it('shows less than 4 items if they do not fit', () => {
+ jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockImplementation(function () {
+ if (this instanceof HTMLUListElement) {
+ return 300;
+ }
+
+ return 100;
+ });
+
+ let {getByText, getByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+
+ let {children} = getByRole('list');
+ expect(within(children[0]).getByRole('button')).toBeTruthy();
+ expect(() => getByText('Folder 1')).toThrow();
+ expect(() => getByText('Folder 2')).toThrow();
+ expect(() => getByText('Folder 3')).toThrow();
+ expect(() => getByText('Folder 4')).toThrow();
+ expect(getByText('Folder 5')).toBeTruthy();
+ });
+
+ it('collapses root item if it does not fit', () => {
+ jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockImplementation(function () {
+ if (this instanceof HTMLUListElement) {
+ return 300;
+ }
+
+ return 100;
+ });
+
+ let {getByText, getByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+
+ let {children} = getByRole('list');
+ expect(() => getByText('Folder 1')).toThrow();
+ expect(within(children[0]).getByRole('button')).toBeTruthy();
+ expect(() => getByText('Folder 2')).toThrow();
+ expect(() => getByText('Folder 3')).toThrow();
+ expect(() => getByText('Folder 4')).toThrow();
+ expect(getByText('Folder 5')).toBeTruthy();
+ });
+
+ it('Handles showRoot and folders of different widths', () => {
+ // Change the width of "Folder 1" from 100px to 200px, which means there's only room for 1 other breadcrumb.
+ jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockImplementation(function () {
+ if (this instanceof HTMLUListElement) {
+ return 500;
+ }
+
+ if (this.textContent === 'Folder 1') {
+ return 200;
+ }
+
+ return 100;
+ });
+
+ let {getByText, getByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+
+ let {children} = getByRole('list');
+ expect(within(children[1]).getByRole('button')).toBeTruthy();
+ expect(getByText('Folder 1')).toBeTruthy();
+ expect(() => getByText('Folder 2')).toThrow();
+ expect(() => getByText('Folder 3')).toThrow();
+ expect(() => getByText('Folder 4')).toThrow();
+ expect(getByText('Folder 5')).toBeTruthy();
+ });
+
+
+ it('can open the menu', async () => {
+ let onAction = jest.fn();
+ let {getAllByText, getByRole, getAllByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+
+ let menuButton = getByRole('button');
+ await user.click(menuButton);
+ act(() => {jest.runAllTimers();});
+
+ let menu = getByRole('menu');
+ expect(menu).toBeTruthy();
+ // menu contains all breadcrumb items
+ expect(getAllByRole('menuitemradio').length).toBe(5);
+
+ let item1 = getAllByText('Folder 1');
+ expect(item1.length).toBe(2);
+
+ // breadcrumb root item
+ expect(item1[0]).toHaveAttribute('role', 'link');
+ await user.click(item1[0]);
+ // first press closes the menu, second press
+ act(() => {jest.runAllTimers();});
+ await user.click(item1[0]);
+ expect(onAction).toHaveBeenCalledWith('Folder 1');
+
+ // menu item
+ expect(item1[1]).toHaveAttribute('role', 'none');
+ await user.click(item1[1]);
+ expect(onAction).toHaveBeenCalledWith('Folder 1');
+ });
+
+ it('clicking on current folder does not trigger onAction', async () => {
+ let onAction = jest.fn();
+ let {getByRole, getAllByRole} = render(
+
+
+ - Folder 1
+ - Folder 2
+ - Folder 3
+ - Folder 4
+ - Folder 5
+
+
+ );
+
+ let menuButton = getByRole('button');
+ await user.click(menuButton);
+
+ let menu = getByRole('menu');
+ expect(menu).toBeTruthy();
+
+ let menuItems = getAllByRole('menuitemradio');
+ // menu contains all breadcrumb items
+ expect(menuItems.length).toBe(5);
+
+ let item = menuItems[4];
+ expect(item).toHaveAttribute('aria-checked', 'true');
+ await user.click(item);
+ expect(onAction).not.toHaveBeenCalled();
+ });
+
+ it('supports aria-label', function () {
+ let {getByRole} = render(
+
+ - Folder 1
+
+ );
+ let breadcrumbs = getByRole('navigation');
+ expect(breadcrumbs).toHaveAttribute('aria-label', 'Test');
+ });
+
+ it('supports aria-labelledby', function () {
+ let {getByRole} = render(
+ <>
+ Test
+
+ - Folder 1
+
+ >
+ );
+ let breadcrumbs = getByRole('navigation');
+ expect(breadcrumbs).toHaveAttribute('aria-labelledby', 'test');
+ });
+
+ it('supports aria-describedby', function () {
+ let {getByRole} = render(
+ <>
+ Test
+
+ - Folder 1
+
+ >
+ );
+ let breadcrumbs = getByRole('navigation');
+ expect(breadcrumbs).toHaveAttribute('aria-describedby', 'test');
+ });
+
+ it('supports custom props', function () {
+ let {getByRole} = render(
+
+ - Folder 1
+
+ );
+ let breadcrumbs = getByRole('navigation');
+ expect(breadcrumbs).toHaveAttribute('data-testid', 'test');
+ });
+
+ it('should support links', async function () {
+ let {getByRole, getAllByRole} = render(
+
+
+ - Example.com
+ - Foo
+ - Bar
+ - Baz
+ - Qux
+
+
+ );
+
+ let links = getAllByRole('link');
+ expect(links).toHaveLength(3);
+ expect(links[0]).toHaveAttribute('href', 'https://example.com/foo/bar');
+ expect(links[1]).toHaveAttribute('href', 'https://example.com/foo/bar/baz');
+ expect(links[2]).toHaveAttribute('href', 'https://example.com/foo/bar/baz/qux');
+
+ let menuButton = getByRole('button');
+ await user.click(menuButton);
+ act(() => {jest.runAllTimers();});
+
+ let menu = getByRole('menu');
+ let items = within(menu).getAllByRole('menuitemradio');
+ expect(items).toHaveLength(5);
+ expect(items[0].tagName).toBe('A');
+ expect(items[0]).toHaveAttribute('href', 'https://example.com');
+ });
+
+ it('should support RouterProvider', async () => {
+ let navigate = jest.fn();
+ let useHref = href => '/base' + href;
+ let {getByRole, getAllByRole} = render(
+
+
+ - Example.com
+ - Foo
+ - Bar
+ - Baz
+ - Qux
+
+
+ );
+
+ let links = getAllByRole('link');
+ expect(links[0]).toHaveAttribute('href', '/base/foo/bar');
+ await user.click(links[0]);
+ expect(navigate).toHaveBeenCalledWith('/foo/bar', {foo: 'bar'});
+ navigate.mockReset();
+
+ let menuButton = getByRole('button');
+ await user.click(menuButton);
+ act(() => {jest.runAllTimers();});
+
+ let menu = getByRole('menu');
+ let items = within(menu).getAllByRole('menuitemradio');
+ expect(items[1]).toHaveAttribute('href', '/base/foo');
+ await user.click(items[1]);
+ expect(navigate).toHaveBeenCalledWith('/foo', {foo: 'foo'});
+ });
+});
diff --git a/packages/@fds-design/button/README.md b/packages/@fds-design/button/README.md
new file mode 100644
index 0000000..840d60f
--- /dev/null
+++ b/packages/@fds-design/button/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/button
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/button/chromatic-fc/ActionButton.stories.tsx b/packages/@fds-design/button/chromatic-fc/ActionButton.stories.tsx
new file mode 100644
index 0000000..08a5683
--- /dev/null
+++ b/packages/@fds-design/button/chromatic-fc/ActionButton.stories.tsx
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Flex} from '@react-spectrum/layout';
+import {IconText, StaticColorBlack, StaticColorWhite} from '../chromatic/ActionButton.stories';
+import React from 'react';
+
+export default {
+ title: 'Button/ActionButtons'
+};
+
+export const All = () => (
+
+ icon + text
+
+ static color: white
+
+ static color: black
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/button/chromatic-fc/Button.stories.tsx b/packages/@fds-design/button/chromatic-fc/Button.stories.tsx
new file mode 100644
index 0000000..3111882
--- /dev/null
+++ b/packages/@fds-design/button/chromatic-fc/Button.stories.tsx
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ElementA, VariantAccent, VariantNegative, VariantPrimary, WithIcon} from '../chromatic/Button.stories';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+export default {
+ title: 'Button'
+};
+
+export const All = () => (
+
+ Accent
+
+ Primary
+
+ Negative
+
+ element a
+
+ with icon
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/button/chromatic-fc/LogicButton.stories.tsx b/packages/@fds-design/button/chromatic-fc/LogicButton.stories.tsx
new file mode 100644
index 0000000..03c3264
--- /dev/null
+++ b/packages/@fds-design/button/chromatic-fc/LogicButton.stories.tsx
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Flex} from '@react-spectrum/layout';
+import {LogicVariantAnd, LogicVariantOr} from '../chromatic/LogicButton.stories';
+import React from 'react';
+
+export default {
+ title: 'Button/LogicButton'
+};
+
+export const All = () => (
+
+ And
+
+ Or
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/button/chromatic-fc/ToggleButton.stories.tsx b/packages/@fds-design/button/chromatic-fc/ToggleButton.stories.tsx
new file mode 100644
index 0000000..5aa6773
--- /dev/null
+++ b/packages/@fds-design/button/chromatic-fc/ToggleButton.stories.tsx
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {AllPossibleStates, StaticColorBlack, StaticColorWhite} from '../chromatic/ToggleButton.stories';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+export default {
+ title: 'Button/ToggleButton'
+};
+
+export const ToggleButton = () => (
+
+
+
+
+
+);
+
+ToggleButton.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/button/chromatic/ActionButton.stories.tsx b/packages/@fds-design/button/chromatic/ActionButton.stories.tsx
new file mode 100644
index 0000000..29a722c
--- /dev/null
+++ b/packages/@fds-design/button/chromatic/ActionButton.stories.tsx
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionButton} from '../';
+import Add from '@spectrum-icons/workflow/Add';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+import {View} from '@react-spectrum/view';
+
+export default {
+ title: 'Button/ActionButton',
+ parameters: {
+ chromaticProvider: {locales: ['en-US', 'ar-AE', 'ja-JP']}
+ }
+};
+
+export const _Text = () => (
+
+
+ Default
+
+
+ Quiet
+
+
+ Disabled
+
+
+);
+
+_Text.story = {
+ name: 'text'
+};
+
+export const IconText = () => (
+
+
+
+ Default
+
+
+
+ Quiet
+
+
+ Disabled
+
+
+
+);
+
+IconText.story = {
+ name: 'icon + text'
+};
+
+export const IconOnly = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+
+IconOnly.story = {
+ name: 'icon only'
+};
+
+export const StaticColorWhite = () => (
+
+
+
+
+ Default
+
+
+
+ Quiet
+
+
+ Disabled
+
+
+
+
+);
+
+StaticColorWhite.story = {
+ name: 'staticColor: white'
+};
+
+export const StaticColorBlack = () => (
+
+
+
+
+ Default
+
+
+
+ Quiet
+
+
+ Disabled
+
+
+
+
+);
+
+StaticColorBlack.story = {
+ name: 'staticColor: black'
+};
diff --git a/packages/@fds-design/button/chromatic/ActionButtonLanguages.stories.tsx b/packages/@fds-design/button/chromatic/ActionButtonLanguages.stories.tsx
new file mode 100644
index 0000000..97b9633
--- /dev/null
+++ b/packages/@fds-design/button/chromatic/ActionButtonLanguages.stories.tsx
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionButton} from '../';
+import Add from '@spectrum-icons/workflow/Add';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+import {View} from '@react-spectrum/view';
+
+export default {
+ title: 'Languages/ActionButton',
+ parameters: {
+ chromaticProvider: {
+ colorSchemes: ['light'],
+ express: false,
+ locales: ['en-US', 'ja-JP'],
+ scales: ['large', 'medium']
+ }
+ }
+};
+
+export const JapaneseIconTextStaticColorWhite = () => (
+
+
+
+
+ ディフォルト
+
+
+
+ 静かな
+
+
+ 無効
+
+
+
+
+);
+
+JapaneseIconTextStaticColorWhite.story = {
+ name: 'Japanese, icon + text, staticColor: white'
+};
diff --git a/packages/@fds-design/button/chromatic/Button.stories.tsx b/packages/@fds-design/button/chromatic/Button.stories.tsx
new file mode 100644
index 0000000..962f860
--- /dev/null
+++ b/packages/@fds-design/button/chromatic/Button.stories.tsx
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import Bell from '@spectrum-icons/workflow/Bell';
+import {Button} from '../';
+import {classNames} from '@react-spectrum/utils';
+import {Flex, Grid, repeat} from '@react-spectrum/layout';
+import {generatePowerset} from '@react-spectrum/story-utils';
+import React from 'react';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {Text} from '@react-spectrum/text';
+import {View} from '@react-spectrum/view';
+
+let states = [
+ {UNSAFE_className: classNames(styles, 'is-hovered'), 'data-hover': true},
+ {UNSAFE_className: classNames(styles, 'is-active'), 'data-active': true},
+ {UNSAFE_className: classNames(styles, 'focus-ring'), 'data-focus': true},
+ {style: 'fill'},
+ {style: 'outline'},
+ {staticColor: 'white'},
+ {staticColor: 'black'},
+ {isDisabled: true}
+];
+
+let combinations = generatePowerset(states, v => (v.UNSAFE_className && v.isDisabled) || (v['data-focus'] && (v['data-hover'] || v['data-active'])) || (v['data-hover'] && v['data-active']));
+
+export default {
+ title: 'Button',
+ parameters: {
+ chromaticProvider: {locales: ['en-US']}
+ }
+};
+
+export const VariantAccent = () => render({variant: 'accent'});
+
+VariantAccent.story = {
+ name: 'variant: accent'
+};
+
+export const VariantPrimary = () => render({variant: 'primary'});
+
+VariantPrimary.story = {
+ name: 'variant: primary'
+};
+
+export const VariantSecondary = () => render({variant: 'secondary'});
+
+VariantSecondary.story = {
+ name: 'variant: secondary'
+};
+
+export const VariantNegative = () => render({variant: 'negative'});
+
+VariantNegative.story = {
+ name: 'variant: negative'
+};
+
+export const ElementA = () => render({elementType: 'a', variant: 'primary'});
+
+ElementA.story = {
+ name: 'element: a'
+};
+
+export const WithIcon = () => (
+
+
+
+ Default
+
+
+ Disabled
+
+
+
+);
+
+WithIcon.story = {
+ name: 'with icon',
+ parameters: {chromaticProvider: {locales: ['en-US', 'ar-AE']}}
+};
+
+export const IconOnly = () => (
+
+
+
+
+
+
+
+
+);
+
+IconOnly.story = {
+ name: 'icon only',
+ parameters: {chromaticProvider: {locales: ['en-US', 'ar-AE']}}
+};
+
+export const DoubleTextNode = () => (
+
+
+ {0} Dogs
+
+
+ {0} Dogs
+
+
+);
+
+DoubleTextNode.story = {
+ name: 'double text node'
+};
+
+function render(props: any = {}) {
+ return (
+
+ {combinations.map(c => {
+ let key = Object.keys(c).map(k => {
+ if (k === 'UNSAFE_className') {
+ return '';
+ }
+ return typeof c[k] === 'boolean' ? k.replace(/^data-/, '') : `${k}: ${c[k]}`;
+ }).filter(Boolean).reverse().join(', ');
+ if (!key) {
+ key = 'default';
+ }
+ let button = {key} ;
+ if (props.variant === 'overBackground' || c.staticColor === 'white') {
+ return (
+
+ {button}
+
+ );
+ }
+ if (c.staticColor === 'black') {
+ return (
+
+ {button}
+
+ );
+ }
+ return button;
+ })}
+
+ );
+}
diff --git a/packages/@fds-design/button/chromatic/LogicButton.stories.tsx b/packages/@fds-design/button/chromatic/LogicButton.stories.tsx
new file mode 100644
index 0000000..900276e
--- /dev/null
+++ b/packages/@fds-design/button/chromatic/LogicButton.stories.tsx
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Flex} from '@react-spectrum/layout';
+import {LogicButton} from '../';
+import React from 'react';
+
+export default {
+ title: 'Button/LogicButton'
+};
+
+export const LogicVariantAnd = () => render({variant: 'and', label: 'and'});
+
+LogicVariantAnd.story = {
+ name: 'logic variant: and'
+};
+
+export const LogicVariantOr = () => render({variant: 'or', label: 'or'});
+
+LogicVariantOr.story = {
+ name: 'logic variant: or'
+};
+
+function render(props: any = {}) {
+ return (
+
+
+ Default
+
+
+ Disabled
+
+
+ );
+}
diff --git a/packages/@fds-design/button/chromatic/ToggleButton.stories.tsx b/packages/@fds-design/button/chromatic/ToggleButton.stories.tsx
new file mode 100644
index 0000000..dd74dd5
--- /dev/null
+++ b/packages/@fds-design/button/chromatic/ToggleButton.stories.tsx
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames} from '@react-spectrum/utils';
+import {generatePowerset} from '@react-spectrum/story-utils';
+import {Grid, repeat, View} from '@adobe/react-spectrum';
+import React from 'react';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {ToggleButton} from '../';
+
+let states = [
+ {isQuiet: true},
+ {isEmphasized: true},
+ {isSelected: true},
+ {isDisabled: true},
+ {UNSAFE_className: classNames(styles, 'is-active')},
+ {UNSAFE_className: classNames(styles, 'is-hovered')},
+ {UNSAFE_className: classNames(styles, 'focus-ring')}
+];
+
+let combinations = generatePowerset(
+ states,
+ (merged) => merged.isDisabled && merged.UNSAFE_className
+);
+
+export default {
+ title: 'Button/ToggleButton',
+ parameters: {
+ providerSwitcher: {status: 'positive'},
+ chromatic: {delay: 300}
+ }
+};
+
+export const AllPossibleStates = () => (
+
+ {combinations.map((c) => (
+ Button
+ ))}
+
+);
+
+AllPossibleStates.story = {
+ name: 'all possible states'
+};
+
+export const StaticColorWhite = () => (
+
+
+ {combinations.map((c) => (
+
+ Button
+
+ ))}
+
+
+);
+
+StaticColorWhite.story = {
+ name: 'staticColor = white'
+};
+
+export const StaticColorBlack = () => (
+
+
+ {combinations.map((c) => (
+
+ Button
+
+ ))}
+
+
+);
+
+StaticColorBlack.story = {
+ name: 'staticColor = black'
+};
+
+export const Arabic = () => (
+
+ {combinations.map((c) => (
+ زر
+ ))}
+
+);
diff --git a/packages/@fds-design/button/docs/ActionButton.mdx b/packages/@fds-design/button/docs/ActionButton.mdx
new file mode 100644
index 0000000..dee4b97
--- /dev/null
+++ b/packages/@fds-design/button/docs/ActionButton.mdx
@@ -0,0 +1,136 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/button';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/button/package.json';
+
+```jsx import
+import {ActionButton} from '@react-spectrum/button';
+import {View} from '@react-spectrum/view';
+import {Flex} from '@react-spectrum/layout';
+```
+
+---
+category: Buttons
+keywords: [action button]
+---
+
+# ActionButton
+
+{docs.exports.ActionButton.description}
+
+
+
+## Example
+
+```tsx example
+Edit
+```
+
+## Content
+
+ActionButtons can have a label, an icon, or both. An icon is provided by passing an icon component as a child to the ActionButton.
+A visible label can be provided by passing a string or a Text component as a child, depending on whether the ActionButton has an accompanying icon.
+
+```tsx example
+import {Text} from '@react-spectrum/text';
+import Edit from '@spectrum-icons/workflow/Edit';
+
+
+
+ Icon + Label
+
+```
+
+### Accessibility
+
+If no visible label is provided (e.g. an icon only button),
+an alternative text label must be provided to identify the control for accessibility. This should be added using
+the `aria-label` prop.
+
+```tsx example
+
+
+
+```
+
+### Internationalization
+
+In order to internationalize an ActionButton, a localized string should be passed to the `children` or `aria-label` prop.
+
+## Events
+
+ActionButtons support user interactions via mouse, keyboard, and touch. You can handle all of these via the `onPress`
+prop.
+
+The following example uses an `onPress` handler to update a counter stored in React state.
+
+```tsx example
+function Example() {
+ let [count, setCount] = React.useState(0);
+
+ return (
+ setCount(c => c + 1)}>{count} Edits
+ );
+}
+```
+
+## Props
+
+
+
+## Visual options
+
+### Quiet
+[View guidelines](https://spectrum.adobe.com/page/action-button/#Quiet)
+
+```tsx example
+Action!
+```
+
+### Disabled
+[View guidelines](https://spectrum.adobe.com/page/action-button/#Disabled)
+
+```tsx example
+Action!
+```
+
+### Static color
+
+The `staticColor` prop can be used when an ActionButton is displayed over a color background. You are responsible for
+choosing the static color variant that ensures the text meets an
+[accessible contrast ratio](https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast)
+with the background.
+
+```tsx example
+
+
+
+
+ Edit
+
+
+
+
+
+ Edit
+
+
+
+```
diff --git a/packages/@fds-design/button/docs/Button.mdx b/packages/@fds-design/button/docs/Button.mdx
new file mode 100644
index 0000000..b17f03d
--- /dev/null
+++ b/packages/@fds-design/button/docs/Button.mdx
@@ -0,0 +1,193 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/button';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/button/package.json';
+
+```jsx import
+import {Button} from '@react-spectrum/button';
+import Bell from '@spectrum-icons/workflow/Bell';
+import {View} from '@react-spectrum/view';
+import {Flex} from '@react-spectrum/layout';
+```
+
+---
+category: Buttons
+---
+
+# Button
+
+{docs.exports.Button.description}
+
+
+
+## Example
+
+```tsx example
+Save
+```
+
+## Content
+
+Buttons must have a visible label, and can optionally have an icon. Text only buttons accept a string
+as children. Icons can also be added as children, with a sibling [Text](Text.html) element for the label.
+
+```tsx example
+import {Text} from '@react-spectrum/text';
+
+
+
+ Icon + Label
+
+```
+
+### Accessibility
+
+If no visible label is provided (e.g. an icon only button),
+an alternative text label must be provided to identify the control for accessibility. This should be added using
+the `aria-label` prop.
+
+### Internationalization
+
+In order to internationalize a button, a localized string should be passed to the `children` or `aria-label` prop.
+
+## Events
+
+Buttons support user interactions via mouse, keyboard, and touch. You can handle all of these via the `onPress`
+prop.
+
+The following example uses an `onPress` handler to update a counter stored in React state.
+
+```tsx example
+function Example() {
+ let [count, setCount] = React.useState(0);
+
+ return (
+ setCount(c => c + 1)}>{count} Dogs
+ );
+}
+```
+
+## Pending
+
+Buttons can indicate that a quick progress task is taking place (e.g., saving settings on a server). After a 1 second delay, an indeterminate spinner will be displayed in place of the button label and icon. You can trigger this behavior with the `isPending` prop. Button events are disabled while `isPending` is true.
+
+```tsx example
+function Example() {
+ let [isLoading, setIsLoading] = React.useState(false);
+
+ let handlePress = () => {
+ // Trigger button pending state
+ setIsLoading(true);
+
+ setTimeout(() => {
+ // Cancel button pending state
+ setIsLoading(false);
+ }, 3000);
+ };
+
+ return (
+ Click me!
+ );
+}
+```
+
+## Props
+
+
+
+## Visual options
+
+### Accent
+[View guidelines](https://spectrum.adobe.com/page/button/#Accent-variant)
+
+```tsx example
+
+ Save
+ Save
+
+```
+
+### Primary
+[View guidelines](https://spectrum.adobe.com/page/button/#Primary-variant)
+
+```tsx example
+
+ Save
+ Save
+
+```
+
+### Secondary
+[View guidelines](https://spectrum.adobe.com/page/button/#Secondary-variant)
+
+```tsx example
+
+ Save
+ Save
+
+```
+
+### Negative
+[View guidelines](https://spectrum.adobe.com/page/button/#Negative-variant)
+
+```tsx example
+
+ Save
+ Save
+
+```
+
+### Static color
+[View guidelines](https://spectrum.adobe.com/page/button/#Static-color)
+
+```tsx example
+
+
+
+ Save
+ Save
+
+
+
+
+ Save
+ Save
+
+
+
+```
+
+### Disabled
+[View guidelines](https://spectrum.adobe.com/page/button/#Disabled)
+
+```tsx example
+Save
+```
+
+### Icon only
+[View guidelines](https://spectrum.adobe.com/page/button/#Label-and-icon)
+
+```tsx example
+
+
+
+
+
+```
diff --git a/packages/@fds-design/button/docs/LogicButton.mdx b/packages/@fds-design/button/docs/LogicButton.mdx
new file mode 100644
index 0000000..0410d7b
--- /dev/null
+++ b/packages/@fds-design/button/docs/LogicButton.mdx
@@ -0,0 +1,87 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/button';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/button/package.json';
+
+```jsx import
+import {LogicButton} from '@react-spectrum/button';
+```
+
+---
+category: Buttons
+keywords: [logic button]
+---
+
+# LogicButton
+
+{docs.exports.LogicButton.description}
+
+
+
+## Example
+
+```tsx example
+And
+```
+
+## Content
+
+LogicButtons must have a variant and optionally can have a label.
+A visible label can be provided by passing children.
+
+```tsx example
+Or
+```
+
+### Internationalization
+
+In order to internationalize a LogicButton, a localized string should be passed to the `children` or `aria-label` prop.
+
+## Events
+
+LogicButton supports user interactions via mouse, keyboard, and touch. You can handle all of these via the `onPress` prop.
+
+The following example uses an `onPress` handler to update the variant.
+
+```tsx example
+function Example() {
+ let [variant, setVariant] = React.useState<'and' | 'or'>('or');
+
+ return (
+ setVariant(variant === 'or' ? 'and' : 'or')}>{variant}
+ );
+}
+```
+
+## Props
+
+
+
+## Visual options
+
+### Variant
+
+```tsx example
+Or
+And
+```
+
+### Disabled
+
+```tsx example
+Or
+```
diff --git a/packages/@fds-design/button/docs/ToggleButton.mdx b/packages/@fds-design/button/docs/ToggleButton.mdx
new file mode 100644
index 0000000..eec07f0
--- /dev/null
+++ b/packages/@fds-design/button/docs/ToggleButton.mdx
@@ -0,0 +1,157 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/button';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/button/package.json';
+
+```jsx import
+import {Flex} from '@react-spectrum/layout';
+import {ToggleButton} from '@react-spectrum/button';
+import {View} from '@react-spectrum/view';
+```
+
+---
+category: Buttons
+keywords: [toggle button]
+---
+
+# ToggleButton
+
+{docs.exports.ToggleButton.description}
+
+
+
+## Example
+
+```tsx example
+Pin
+```
+
+## Content
+
+ToggleButtons can have a label, an icon, or both. An icon is provided by passing an icon component as a child to the ToggleButton.
+A visible label can be provided by passing a string or a Text component as a child, depending on whether the ToggleButton has an accompanying icon.
+
+```tsx example
+import {Text} from '@react-spectrum/text';
+import Pin from '@spectrum-icons/workflow/PinOff';
+
+
+
+ Icon + Label
+
+```
+
+### Accessibility
+
+If no visible label is provided (e.g. an icon only button),
+an alternative text label must be provided to identify the control for accessibility. This should be added using
+the `aria-label` prop.
+
+```tsx example
+
+
+
+```
+
+**Note:** `ToggleButton` should not be used when the content of the button changes between selection states, for example,
+mute/unmute or play/pause. In these cases, use an [ActionButton](ActionButton.html) instead.
+
+### Internationalization
+
+In order to internationalize an ToggleButton, a localized string should be passed to the `children` or `aria-label` prop.
+
+## Value
+
+ToggleButtons are not selected by default. The `defaultSelected` prop can be used to set the default state (uncontrolled).
+Alternatively, the `isSelected` prop can be used to make the selected state controlled. See React's documentation on
+[uncontrolled components](https://reactjs.org/docs/uncontrolled-components.html) for more info, and [Events](#Events), below,
+for an example of controlled behavior.
+
+## Events
+
+ToggleButtons support user interactions via mouse, keyboard, and touch. When pressing the button, the selection
+state is toggled, and the `onChange` event is fired. The following example uses an `onChange` handler to update React state.
+
+```tsx example
+function Example() {
+ let [isSelected, setSelected] = React.useState(false);
+
+ return (
+
+
+
+ );
+}
+```
+
+## Props
+
+
+
+## Visual options
+
+### Quiet
+[View guidelines](https://spectrum.adobe.com/page/action-button/#Quiet)
+
+```tsx example
+Pin
+```
+
+### Disabled
+[View guidelines](https://spectrum.adobe.com/page/action-button/#Disabled)
+
+```tsx example
+Pin
+```
+
+### Emphasized
+[View guidelines](https://spectrum.adobe.com/page/action-button/#Emphasis)
+
+```tsx example
+Pin
+```
+
+### Static color
+
+The `staticColor` prop can be used when a ToggleButton is displayed over a color background. When selected, the icon and text
+automatically take on the color of the background. You are responsible for choosing the static color variant that ensures the
+text meets an [accessible contrast ratio](https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast)
+with the background.
+
+```tsx example
+
+
+
+
+ Pin
+
+
+
+
+
+ Pin
+
+
+
+```
diff --git a/packages/@fds-design/button/index.ts b/packages/@fds-design/button/index.ts
new file mode 100644
index 0000000..1210ae1
--- /dev/null
+++ b/packages/@fds-design/button/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/button/intl/ar-AE.json b/packages/@fds-design/button/intl/ar-AE.json
new file mode 100644
index 0000000..b3b948e
--- /dev/null
+++ b/packages/@fds-design/button/intl/ar-AE.json
@@ -0,0 +1,3 @@
+{
+ "pending": "قيد الانتظار"
+}
diff --git a/packages/@fds-design/button/intl/bg-BG.json b/packages/@fds-design/button/intl/bg-BG.json
new file mode 100644
index 0000000..5356f20
--- /dev/null
+++ b/packages/@fds-design/button/intl/bg-BG.json
@@ -0,0 +1,3 @@
+{
+ "pending": "недовършено"
+}
diff --git a/packages/@fds-design/button/intl/cs-CZ.json b/packages/@fds-design/button/intl/cs-CZ.json
new file mode 100644
index 0000000..31ab0a8
--- /dev/null
+++ b/packages/@fds-design/button/intl/cs-CZ.json
@@ -0,0 +1,3 @@
+{
+ "pending": "čeká na vyřízení"
+}
diff --git a/packages/@fds-design/button/intl/da-DK.json b/packages/@fds-design/button/intl/da-DK.json
new file mode 100644
index 0000000..1b5d80f
--- /dev/null
+++ b/packages/@fds-design/button/intl/da-DK.json
@@ -0,0 +1,3 @@
+{
+ "pending": "afventende"
+}
diff --git a/packages/@fds-design/button/intl/de-DE.json b/packages/@fds-design/button/intl/de-DE.json
new file mode 100644
index 0000000..c0464e2
--- /dev/null
+++ b/packages/@fds-design/button/intl/de-DE.json
@@ -0,0 +1,3 @@
+{
+ "pending": "Ausstehend"
+}
diff --git a/packages/@fds-design/button/intl/el-GR.json b/packages/@fds-design/button/intl/el-GR.json
new file mode 100644
index 0000000..df1db56
--- /dev/null
+++ b/packages/@fds-design/button/intl/el-GR.json
@@ -0,0 +1,3 @@
+{
+ "pending": "σε εκκρεμότητα"
+}
diff --git a/packages/@fds-design/button/intl/en-US.json b/packages/@fds-design/button/intl/en-US.json
new file mode 100644
index 0000000..997119c
--- /dev/null
+++ b/packages/@fds-design/button/intl/en-US.json
@@ -0,0 +1,3 @@
+{
+ "pending": "pending"
+}
diff --git a/packages/@fds-design/button/intl/es-ES.json b/packages/@fds-design/button/intl/es-ES.json
new file mode 100644
index 0000000..45c88c7
--- /dev/null
+++ b/packages/@fds-design/button/intl/es-ES.json
@@ -0,0 +1,3 @@
+{
+ "pending": "pendiente"
+}
diff --git a/packages/@fds-design/button/intl/et-EE.json b/packages/@fds-design/button/intl/et-EE.json
new file mode 100644
index 0000000..265a1a9
--- /dev/null
+++ b/packages/@fds-design/button/intl/et-EE.json
@@ -0,0 +1,3 @@
+{
+ "pending": "ootel"
+}
diff --git a/packages/@fds-design/button/intl/fi-FI.json b/packages/@fds-design/button/intl/fi-FI.json
new file mode 100644
index 0000000..d1360ac
--- /dev/null
+++ b/packages/@fds-design/button/intl/fi-FI.json
@@ -0,0 +1,3 @@
+{
+ "pending": "odottaa"
+}
diff --git a/packages/@fds-design/button/intl/fr-FR.json b/packages/@fds-design/button/intl/fr-FR.json
new file mode 100644
index 0000000..04500bc
--- /dev/null
+++ b/packages/@fds-design/button/intl/fr-FR.json
@@ -0,0 +1,3 @@
+{
+ "pending": "En attente"
+}
diff --git a/packages/@fds-design/button/intl/he-IL.json b/packages/@fds-design/button/intl/he-IL.json
new file mode 100644
index 0000000..b45e87b
--- /dev/null
+++ b/packages/@fds-design/button/intl/he-IL.json
@@ -0,0 +1,3 @@
+{
+ "pending": "ממתין ל"
+}
diff --git a/packages/@fds-design/button/intl/hr-HR.json b/packages/@fds-design/button/intl/hr-HR.json
new file mode 100644
index 0000000..e097f48
--- /dev/null
+++ b/packages/@fds-design/button/intl/hr-HR.json
@@ -0,0 +1,3 @@
+{
+ "pending": "u tijeku"
+}
diff --git a/packages/@fds-design/button/intl/hu-HU.json b/packages/@fds-design/button/intl/hu-HU.json
new file mode 100644
index 0000000..f4f3647
--- /dev/null
+++ b/packages/@fds-design/button/intl/hu-HU.json
@@ -0,0 +1,3 @@
+{
+ "pending": "függőben levő"
+}
diff --git a/packages/@fds-design/button/intl/it-IT.json b/packages/@fds-design/button/intl/it-IT.json
new file mode 100644
index 0000000..f720f8a
--- /dev/null
+++ b/packages/@fds-design/button/intl/it-IT.json
@@ -0,0 +1,3 @@
+{
+ "pending": "in sospeso"
+}
diff --git a/packages/@fds-design/button/intl/ja-JP.json b/packages/@fds-design/button/intl/ja-JP.json
new file mode 100644
index 0000000..54edb0f
--- /dev/null
+++ b/packages/@fds-design/button/intl/ja-JP.json
@@ -0,0 +1,3 @@
+{
+ "pending": "保留"
+}
diff --git a/packages/@fds-design/button/intl/ko-KR.json b/packages/@fds-design/button/intl/ko-KR.json
new file mode 100644
index 0000000..8eb61b2
--- /dev/null
+++ b/packages/@fds-design/button/intl/ko-KR.json
@@ -0,0 +1,3 @@
+{
+ "pending": "보류 중"
+}
diff --git a/packages/@fds-design/button/intl/lt-LT.json b/packages/@fds-design/button/intl/lt-LT.json
new file mode 100644
index 0000000..3c7a68a
--- /dev/null
+++ b/packages/@fds-design/button/intl/lt-LT.json
@@ -0,0 +1,3 @@
+{
+ "pending": "laukiama"
+}
diff --git a/packages/@fds-design/button/intl/lv-LV.json b/packages/@fds-design/button/intl/lv-LV.json
new file mode 100644
index 0000000..cb511ef
--- /dev/null
+++ b/packages/@fds-design/button/intl/lv-LV.json
@@ -0,0 +1,3 @@
+{
+ "pending": "gaida"
+}
diff --git a/packages/@fds-design/button/intl/nb-NO.json b/packages/@fds-design/button/intl/nb-NO.json
new file mode 100644
index 0000000..1bf27d7
--- /dev/null
+++ b/packages/@fds-design/button/intl/nb-NO.json
@@ -0,0 +1,3 @@
+{
+ "pending": "avventer"
+}
diff --git a/packages/@fds-design/button/intl/nl-NL.json b/packages/@fds-design/button/intl/nl-NL.json
new file mode 100644
index 0000000..b79ecb2
--- /dev/null
+++ b/packages/@fds-design/button/intl/nl-NL.json
@@ -0,0 +1,3 @@
+{
+ "pending": "in behandeling"
+}
diff --git a/packages/@fds-design/button/intl/pl-PL.json b/packages/@fds-design/button/intl/pl-PL.json
new file mode 100644
index 0000000..5238403
--- /dev/null
+++ b/packages/@fds-design/button/intl/pl-PL.json
@@ -0,0 +1,3 @@
+{
+ "pending": "oczekujące"
+}
diff --git a/packages/@fds-design/button/intl/pt-BR.json b/packages/@fds-design/button/intl/pt-BR.json
new file mode 100644
index 0000000..1459f55
--- /dev/null
+++ b/packages/@fds-design/button/intl/pt-BR.json
@@ -0,0 +1,3 @@
+{
+ "pending": "pendente"
+}
diff --git a/packages/@fds-design/button/intl/pt-PT.json b/packages/@fds-design/button/intl/pt-PT.json
new file mode 100644
index 0000000..1459f55
--- /dev/null
+++ b/packages/@fds-design/button/intl/pt-PT.json
@@ -0,0 +1,3 @@
+{
+ "pending": "pendente"
+}
diff --git a/packages/@fds-design/button/intl/ro-RO.json b/packages/@fds-design/button/intl/ro-RO.json
new file mode 100644
index 0000000..c89363e
--- /dev/null
+++ b/packages/@fds-design/button/intl/ro-RO.json
@@ -0,0 +1,3 @@
+{
+ "pending": "în așteptare"
+}
diff --git a/packages/@fds-design/button/intl/ru-RU.json b/packages/@fds-design/button/intl/ru-RU.json
new file mode 100644
index 0000000..be8ba3c
--- /dev/null
+++ b/packages/@fds-design/button/intl/ru-RU.json
@@ -0,0 +1,3 @@
+{
+ "pending": "в ожидании"
+}
diff --git a/packages/@fds-design/button/intl/sk-SK.json b/packages/@fds-design/button/intl/sk-SK.json
new file mode 100644
index 0000000..3285b07
--- /dev/null
+++ b/packages/@fds-design/button/intl/sk-SK.json
@@ -0,0 +1,3 @@
+{
+ "pending": "čakajúce"
+}
diff --git a/packages/@fds-design/button/intl/sl-SI.json b/packages/@fds-design/button/intl/sl-SI.json
new file mode 100644
index 0000000..f7a5caa
--- /dev/null
+++ b/packages/@fds-design/button/intl/sl-SI.json
@@ -0,0 +1,3 @@
+{
+ "pending": "v teku"
+}
diff --git a/packages/@fds-design/button/intl/sr-SP.json b/packages/@fds-design/button/intl/sr-SP.json
new file mode 100644
index 0000000..1303c5d
--- /dev/null
+++ b/packages/@fds-design/button/intl/sr-SP.json
@@ -0,0 +1,3 @@
+{
+ "pending": "nerešeno"
+}
diff --git a/packages/@fds-design/button/intl/sv-SE.json b/packages/@fds-design/button/intl/sv-SE.json
new file mode 100644
index 0000000..9c419f7
--- /dev/null
+++ b/packages/@fds-design/button/intl/sv-SE.json
@@ -0,0 +1,3 @@
+{
+ "pending": "väntande"
+}
diff --git a/packages/@fds-design/button/intl/tr-TR.json b/packages/@fds-design/button/intl/tr-TR.json
new file mode 100644
index 0000000..5f7a0db
--- /dev/null
+++ b/packages/@fds-design/button/intl/tr-TR.json
@@ -0,0 +1,3 @@
+{
+ "pending": "beklemede"
+}
diff --git a/packages/@fds-design/button/intl/uk-UA.json b/packages/@fds-design/button/intl/uk-UA.json
new file mode 100644
index 0000000..ee825ee
--- /dev/null
+++ b/packages/@fds-design/button/intl/uk-UA.json
@@ -0,0 +1,3 @@
+{
+ "pending": "в очікуванні"
+}
diff --git a/packages/@fds-design/button/intl/zh-CN.json b/packages/@fds-design/button/intl/zh-CN.json
new file mode 100644
index 0000000..12509de
--- /dev/null
+++ b/packages/@fds-design/button/intl/zh-CN.json
@@ -0,0 +1,3 @@
+{
+ "pending": "待处理"
+}
diff --git a/packages/@fds-design/button/intl/zh-TW.json b/packages/@fds-design/button/intl/zh-TW.json
new file mode 100644
index 0000000..8195358
--- /dev/null
+++ b/packages/@fds-design/button/intl/zh-TW.json
@@ -0,0 +1,3 @@
+{
+ "pending": "待處理"
+}
diff --git a/packages/@fds-design/button/package.json b/packages/@fds-design/button/package.json
new file mode 100644
index 0000000..f7e6fc6
--- /dev/null
+++ b/packages/@fds-design/button/package.json
@@ -0,0 +1,67 @@
+{
+ "name": "@fds-design/button",
+ "version": "3.16.9",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/button": "^3.11.0",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/progress": "file:../../progress",
+ "@react-spectrum/text": "file:../../text",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/toggle": "^3.8.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1",
+ "@react-spectrum/test-utils-internal": "file:../../test-utils-internal",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/button/src/ActionButton.tsx b/packages/@fds-design/button/src/ActionButton.tsx
new file mode 100644
index 0000000..d382259
--- /dev/null
+++ b/packages/@fds-design/button/src/ActionButton.tsx
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames, ClearSlots, SlotProvider, useFocusableRef, useSlotProps, useStyleProps} from '../../utils';
+import CornerTriangle from '@spectrum-icons/ui/CornerTriangle';
+import {FocusableRef} from '@react-types/shared';
+import {FocusRing} from '@react-aria/focus';
+import {mergeProps} from '@react-aria/utils';
+import React from 'react';
+import {SpectrumActionButtonProps} from '@react-types/button';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {Text} from '../../text';
+import {useButton} from '@react-aria/button';
+import {useHover} from '@react-aria/interactions';
+import {useProviderProps} from '../../provider';
+
+/**
+ * ActionButtons allow users to perform an action.
+ * They’re used for similar, task-based options within a workflow, and are ideal for interfaces where buttons aren’t meant to draw a lot of attention.
+ */
+export const ActionButton = React.forwardRef(function ActionButton(props: SpectrumActionButtonProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ props = useSlotProps(props, 'actionButton');
+ let textProps = useSlotProps({UNSAFE_className: classNames(styles, 'spectrum-ActionButton-label')}, 'text');
+
+ let {
+ isQuiet,
+ isDisabled,
+ staticColor,
+ children,
+ autoFocus,
+ // @ts-ignore (private)
+ holdAffordance,
+ // @ts-ignore (private)
+ hideButtonText,
+ ...otherProps
+ } = props;
+
+ let domRef = useFocusableRef(ref);
+ let {buttonProps, isPressed} = useButton(props, domRef);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let {styleProps} = useStyleProps(otherProps);
+ let isTextOnly = React.Children.toArray(props.children).every(c => !React.isValidElement(c));
+
+ return (
+
+
+ {holdAffordance &&
+
+ }
+
+
+ {typeof children === 'string' || isTextOnly
+ ? {children}
+ : children}
+
+
+
+
+ );
+});
diff --git a/packages/@fds-design/button/src/Button.tsx b/packages/@fds-design/button/src/Button.tsx
new file mode 100644
index 0000000..fe6fe29
--- /dev/null
+++ b/packages/@fds-design/button/src/Button.tsx
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {
+ classNames,
+ SlotProvider,
+ useFocusableRef,
+ useHasChild,
+ useSlotProps,
+ useStyleProps
+} from '../../utils';
+import {FocusableRef} from '@react-types/shared';
+import {FocusRing} from '@react-aria/focus';
+// @ts-ignore
+import intlMessages from '../intl/*.json';
+import {isAppleDevice, isFirefox, mergeProps, useId} from '@react-aria/utils';
+import {ProgressCircle} from '../../progress';
+import React, {ElementType, ReactElement, useEffect, useState} from 'react';
+import {SpectrumButtonProps} from '@react-types/button';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {Text} from '../../text';
+import {useButton} from '@react-aria/button';
+import {useFocus, useHover} from '@react-aria/interactions';
+import {useLocalizedStringFormatter} from '@react-aria/i18n';
+import {useProviderProps} from '../../provider';
+
+function disablePendingProps(props) {
+ // Don't allow interaction while isPending is true
+ if (props.isPending) {
+ props.onPress = undefined;
+ props.onPressStart = undefined;
+ props.onPressEnd = undefined;
+ props.onPressChange = undefined;
+ props.onPressUp = undefined;
+ props.onKeyDown = undefined;
+ props.onKeyUp = undefined;
+ props.onClick = undefined;
+ props.href = undefined;
+ }
+ return props;
+}
+
+/**
+ * Buttons allow users to perform an action or to navigate to another page.
+ * They have multiple styles for various needs, and are ideal for calling attention to
+ * where a user needs to do something in order to move forward in a flow.
+ */
+export const Button = React.forwardRef(function Button(props: SpectrumButtonProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ props = useSlotProps(props, 'button');
+ props = disablePendingProps(props);
+ let {
+ elementType: Element = 'button',
+ children,
+ variant,
+ style = variant === 'accent' || variant === 'cta' ? 'fill' : 'outline',
+ staticColor,
+ isDisabled,
+ isPending,
+ autoFocus,
+ ...otherProps
+ } = props;
+ let domRef = useFocusableRef(ref);
+ let {buttonProps, isPressed} = useButton(props, domRef);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let [isFocused, onFocusChange] = useState(false);
+ let {focusProps} = useFocus({onFocusChange, isDisabled});
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../button');
+ let {styleProps} = useStyleProps(otherProps);
+ let hasLabel = useHasChild(`.${styles['spectrum-Button-label']}`, domRef);
+ let hasIcon = useHasChild(`.${styles['spectrum-Icon']}`, domRef);
+ // an aria label will block children and their labels from being read, this is undesirable for pending state
+ let hasAriaLabel = !!buttonProps['aria-label'] || !!buttonProps['aria-labelledby'];
+ let [isProgressVisible, setIsProgressVisible] = useState(false);
+ let backupButtonId = useId();
+ let buttonId = buttonProps.id || backupButtonId;
+ let iconId = useId();
+ let textId = useId();
+ let spinnerId = useId();
+
+ useEffect(() => {
+ let timeout: ReturnType;
+
+ if (isPending) {
+ // Start timer when isPending is set to true.
+ timeout = setTimeout(() => {
+ setIsProgressVisible(true);
+ }, 1000);
+ } else {
+ // Exit loading state when isPending is set to false. */
+ setIsProgressVisible(false);
+ }
+ return () => {
+ // Clean up on unmount or when user removes isPending prop before entering loading state.
+ clearTimeout(timeout);
+ };
+ }, [isPending]);
+
+ if (variant === 'cta') {
+ variant = 'accent';
+ } else if (variant === 'overBackground') {
+ variant = 'primary';
+ staticColor = 'white';
+ }
+
+ const isPendingAriaLiveLabel = `${hasAriaLabel ? buttonProps['aria-label'] : ''} ${stringFormatter.format('pending')}`.trim();
+ const isPendingAriaLiveLabelledby = hasAriaLabel ? (buttonProps['aria-labelledby']?.replace(buttonId, spinnerId) ?? spinnerId) : `${hasIcon ? iconId : ''} ${hasLabel ? textId : ''} ${spinnerId}`.trim();
+
+ let ariaLive: 'off' | 'polite' | 'assertive' = 'polite';
+ if (isAppleDevice() && (!hasAriaLabel || isFirefox())) {
+ ariaLive = 'off';
+ }
+
+ let isPendingProps = isPending ? {
+ onClick: (e) => {
+ if (e.currentTarget instanceof HTMLButtonElement) {
+ e.preventDefault();
+ }
+ }
+ } : {
+ // no-op.
+ // Not sure why, but TypeScript wouldn't allow to have an empty object `{}`.
+ onClick: () => {}
+ };
+
+ return (
+
+
+
+ {typeof children === 'string'
+ ? {children}
+ : children}
+ {isPending && (
+
+ )}
+ {isPending &&
+ <>
+
+ {isProgressVisible &&
+
+ }
+
+ {/* Adding the element here with the same labels as the button itself causes aria-live to pick up the change in Safari.
+ Safari with VO unfortunately doesn't announce changes to *all* of its labels specifically for button
+ https://a11ysupport.io/tests/tech__html__button-name-change#assertion-aria-aria-label_attribute-convey_name_change-html-button_element-vo_macos-safari
+ The aria-live may cause extra announcements in other browsers. */}
+
+ >
+ }
+
+
+
+ );
+}) as (props: SpectrumButtonProps & {ref?: FocusableRef}) => ReactElement;
diff --git a/packages/@fds-design/button/src/ClearButton.tsx b/packages/@fds-design/button/src/ClearButton.tsx
new file mode 100644
index 0000000..32dfd68
--- /dev/null
+++ b/packages/@fds-design/button/src/ClearButton.tsx
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {AriaButtonElementTypeProps, ButtonProps} from '@react-types/button';
+import {classNames, useFocusableRef, useStyleProps} from '../../utils';
+import CrossSmall from '@spectrum-icons/ui/CrossSmall';
+import {DOMProps, FocusableRef, StyleProps} from '@react-types/shared';
+import {FocusRing} from '@react-aria/focus';
+import {mergeProps} from '@react-aria/utils';
+import React, {ElementType} from 'react';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {useButton} from '@react-aria/button';
+import {useHover} from '@react-aria/interactions';
+
+interface ClearButtonProps extends ButtonProps, AriaButtonElementTypeProps, DOMProps, StyleProps {
+ focusClassName?: string,
+ variant?: 'overBackground',
+ excludeFromTabOrder?: boolean,
+ preventFocus?: boolean
+}
+
+export const ClearButton = React.forwardRef(function ClearButton(props: ClearButtonProps, ref: FocusableRef) {
+ let {
+ children = ,
+ focusClassName,
+ variant,
+ autoFocus,
+ isDisabled,
+ preventFocus,
+ elementType = preventFocus ? 'div' : 'button' as ElementType,
+ ...otherProps
+ } = props;
+ let domRef = useFocusableRef(ref);
+ let {buttonProps, isPressed} = useButton({...props, elementType}, domRef);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let {styleProps} = useStyleProps(otherProps);
+
+ // For cases like the clear button in a search field, remove the tabIndex so
+ // iOS 14 with VoiceOver doesn't focus the button and hide the keyboard when
+ // moving the cursor over the clear button.
+ if (preventFocus) {
+ delete buttonProps.tabIndex;
+ }
+
+ let ElementType = elementType;
+ return (
+
+
+ {children}
+
+
+ );
+});
diff --git a/packages/@fds-design/button/src/FieldButton.tsx b/packages/@fds-design/button/src/FieldButton.tsx
new file mode 100644
index 0000000..1fb0143
--- /dev/null
+++ b/packages/@fds-design/button/src/FieldButton.tsx
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ButtonProps} from '@react-types/button';
+import {classNames, SlotProvider, useFocusableRef, useSlotProps, useStyleProps} from '../../utils';
+import {DOMProps, FocusableRef, RefObject, StyleProps} from '@react-types/shared';
+import {FocusRing} from '@react-aria/focus';
+import {mergeProps} from '@react-aria/utils';
+import React from 'react';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {useButton} from '@react-aria/button';
+import {useHover} from '@react-aria/interactions';
+
+interface FieldButtonProps extends ButtonProps, DOMProps, StyleProps {
+ isQuiet?: boolean,
+ isActive?: boolean,
+ validationState?: 'valid' | 'invalid',
+ isInvalid?: boolean,
+ focusRingClass?: string
+}
+
+// @private
+export const FieldButton = React.forwardRef(function FieldButton(props: FieldButtonProps, ref: FocusableRef) {
+ props = useSlotProps(props, 'button');
+ let {
+ isQuiet,
+ isDisabled,
+ validationState,
+ isInvalid,
+ children,
+ autoFocus,
+ isActive,
+ focusRingClass,
+ ...otherProps
+ } = props;
+ let domRef = useFocusableRef(ref) as RefObject;
+ let {buttonProps, isPressed} = useButton(props, domRef);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let {styleProps} = useStyleProps(otherProps);
+
+ return (
+
+
+
+ {children}
+
+
+
+ );
+});
diff --git a/packages/@fds-design/button/src/LogicButton.tsx b/packages/@fds-design/button/src/LogicButton.tsx
new file mode 100644
index 0000000..74025c9
--- /dev/null
+++ b/packages/@fds-design/button/src/LogicButton.tsx
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames, useFocusableRef, useStyleProps} from '../../utils';
+import {FocusableRef} from '@react-types/shared';
+import {FocusRing} from '@react-aria/focus';
+import {mergeProps} from '@react-aria/utils';
+import React from 'react';
+import {SpectrumLogicButtonProps} from '@react-types/button';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {useButton} from '@react-aria/button';
+import {useHover} from '@react-aria/interactions';
+import {useProviderProps} from '../../provider';
+
+/**
+ * A LogicButton displays an operator within a boolean logic sequence.
+ */
+export const LogicButton = React.forwardRef(function LogicButton(props: SpectrumLogicButtonProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ let {
+ variant,
+ children,
+ isDisabled,
+ autoFocus,
+ ...otherProps
+ } = props;
+ let domRef = useFocusableRef(ref);
+ let {buttonProps, isPressed} = useButton(props, domRef);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let {styleProps} = useStyleProps(otherProps);
+
+ return (
+
+
+ {children}
+
+
+ );
+});
diff --git a/packages/@fds-design/button/src/ToggleButton.tsx b/packages/@fds-design/button/src/ToggleButton.tsx
new file mode 100644
index 0000000..e2f2ea0
--- /dev/null
+++ b/packages/@fds-design/button/src/ToggleButton.tsx
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames, SlotProvider, useFocusableRef, useStyleProps} from '../../utils';
+import {FocusableRef} from '@react-types/shared';
+import {FocusRing} from '@react-aria/focus';
+import {mergeProps} from '@react-aria/utils';
+import React from 'react';
+import {SpectrumToggleButtonProps} from '@react-types/button';
+import styles from '@adobe/spectrum-css-temp/components/button/vars.css';
+import {Text} from '../../text';
+import {useHover} from '@react-aria/interactions';
+import {useProviderProps} from '../../provider';
+import {useToggleButton} from '@react-aria/button';
+import {useToggleState} from '@react-stately/toggle';
+
+/**
+ * ToggleButtons allow users to toggle a selection on or off, for example
+ * switching between two states or modes.
+ */
+export const ToggleButton = React.forwardRef(function ToggleButton(props: SpectrumToggleButtonProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ let {
+ isQuiet,
+ isDisabled,
+ isEmphasized,
+ staticColor,
+ children,
+ autoFocus,
+ ...otherProps
+ } = props;
+
+ let domRef = useFocusableRef(ref);
+ let state = useToggleState(props);
+ let {buttonProps, isPressed} = useToggleButton(props, state, domRef);
+ let {hoverProps, isHovered} = useHover({isDisabled});
+ let {styleProps} = useStyleProps(otherProps);
+ let isTextOnly = React.Children.toArray(props.children).every(c => !React.isValidElement(c));
+
+ return (
+
+
+
+ {typeof children === 'string' || isTextOnly
+ ? {children}
+ : children}
+
+
+
+ );
+});
diff --git a/packages/@fds-design/button/src/index.ts b/packages/@fds-design/button/src/index.ts
new file mode 100644
index 0000000..00ffe01
--- /dev/null
+++ b/packages/@fds-design/button/src/index.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2020 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.
+ */
+///
+export {Button} from './Button';
+export {ActionButton} from './ActionButton';
+export {FieldButton} from './FieldButton';
+export {LogicButton} from './LogicButton';
+export {ClearButton} from './ClearButton';
+export {ToggleButton} from './ToggleButton';
+export type {SpectrumActionButtonProps, SpectrumButtonProps, SpectrumLogicButtonProps, SpectrumToggleButtonProps} from '@react-types/button';
diff --git a/packages/@fds-design/button/stories/ActionButton.stories.tsx b/packages/@fds-design/button/stories/ActionButton.stories.tsx
new file mode 100644
index 0000000..b784c2e
--- /dev/null
+++ b/packages/@fds-design/button/stories/ActionButton.stories.tsx
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {ActionButton} from '../';
+import Add from '@spectrum-icons/workflow/Add';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+import {Text} from '@react-spectrum/text';
+import {View} from '@react-spectrum/view';
+
+export type ActionButtonStory = ComponentStoryObj;
+
+export default {
+ title: 'Button/ActionButton',
+ component: ActionButton,
+ args: {
+ onPress: action('press'),
+ onPressStart: action('pressstart'),
+ onPressEnd: action('pressend')
+ },
+ argTypes: {
+ onPress: {
+ table: {
+ disable: true
+ }
+ },
+ onPressStart: {
+ table: {
+ disable: true
+ }
+ },
+ onPressEnd: {
+ table: {
+ disable: true
+ }
+ },
+ staticColor: {
+ table: {
+ disable: true
+ }
+ },
+ isQuiet: {
+ control: 'boolean'
+ },
+ autoFocus: {
+ control: 'boolean'
+ }
+ }
+} as ComponentMeta;
+
+
+export const Default: ActionButtonStory = {
+ render: (args) => render(args)
+};
+
+export const WithIcon: ActionButtonStory = {
+ render: (args) => renderWithIcon(args)
+};
+
+export const IconOnly: ActionButtonStory = {
+ render: (args) => renderOnlyIcon(args)
+};
+
+export const StaticWhite: ActionButtonStory = {
+ args: {staticColor: 'white'},
+ render: (args) => (
+
+ {renderWithIcon(args)}
+
+ ),
+ name: 'staticColor: white'
+};
+
+export const StaticBlack: ActionButtonStory = {
+ args: {staticColor: 'black'},
+ render: (args) => (
+
+ {renderWithIcon(args)}
+
+ ),
+ name: 'staticColor: black'
+};
+
+function render(props = {}) {
+ return (
+
+
+ Default
+
+
+ Disabled
+
+
+ );
+}
+
+function renderWithIcon(props = {}) {
+ return (
+
+
+
+ Default
+
+
+ Disabled
+
+
+
+ );
+}
+
+function renderOnlyIcon(props = {}) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/@fds-design/button/stories/Button.stories.tsx b/packages/@fds-design/button/stories/Button.stories.tsx
new file mode 100644
index 0000000..2746a54
--- /dev/null
+++ b/packages/@fds-design/button/stories/Button.stories.tsx
@@ -0,0 +1,426 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {BackgroundColorValue} from '@react-types/shared';
+import Bell from '@spectrum-icons/workflow/Bell';
+import {Button} from '../';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {Flex} from '@react-spectrum/layout';
+import {Form} from '@react-spectrum/form';
+import React, {ElementType, useState} from 'react';
+import {SpectrumButtonProps} from '@react-types/button';
+import {Text} from '@react-spectrum/text';
+import {Tooltip, TooltipTrigger} from '@react-spectrum/tooltip';
+import {View} from '@react-spectrum/view';
+
+export type ButtonStory = ComponentStoryObj;
+
+export default {
+ title: 'Button',
+ component: Button,
+ args: {
+ onPress: action('press'),
+ onPressStart: action('pressstart'),
+ onPressEnd: action('pressend'),
+ onPressChange: action('presschange'),
+ onPressUp: action('pressup'),
+ onFocus: action('focus'),
+ onBlur: action('blur'),
+ onKeyUp: action('keyup')
+ },
+ argTypes: {
+ onPress: {
+ table: {
+ disable: true
+ }
+ },
+ onPressStart: {
+ table: {
+ disable: true
+ }
+ },
+ onPressEnd: {
+ table: {
+ disable: true
+ }
+ },
+ onPressUp: {
+ table: {
+ disable: true
+ }
+ },
+ autoFocus: {
+ control: 'boolean'
+ },
+ variant: {
+ control: 'select',
+ options: ['accent', 'primary', 'secondary', 'negative', 'cta', 'overBackground'],
+ defaultValue: 'accent'
+ },
+ style: {
+ control: 'select',
+ options: [undefined, 'fill', 'outline']
+ },
+ staticColor: {
+ control: 'select',
+ options: [undefined, 'white', 'black']
+ },
+ isPending: {
+ control: 'boolean',
+ defaultValue: false
+ }
+ }
+} as ComponentMeta;
+
+export const Default: ButtonStory = {
+ render: (args) => render(args)
+};
+
+export const WithIcon: ButtonStory = {
+ render: (args) => renderIconText(args)
+};
+
+export const IconOnly: ButtonStory = {
+ render: (args) => renderIconOnly(args)
+};
+
+export const AnchorElement: ButtonStory = {
+ render: (args) => render({elementType: 'a', ...args}),
+ name: 'element: a'
+};
+
+export const AnchorElementWithSelf: ButtonStory = {
+ render: (args) => render({elementType: 'a', href: '//example.com', target: '_self', ...args}),
+ name: 'element: a, href: \'//example.com\', target: \'_self\''
+};
+
+export const AnchorElementNoRefferer: ButtonStory = {
+ render: (args) => render({elementType: 'a', href: '//example.com', rel: 'noopener noreferrer', ...args}),
+ name: 'element: a, rel: \'noopener noreferrer\''
+};
+
+export const UserSelect: ButtonStory = {
+ render: () => ,
+ parameters: {
+ description: {
+ data: 'Pressing and holding on either buttons shouldn\'t trigger text selection on the button labels (wait for buttons to turn red).'
+ }
+ }
+};
+
+export const PendingSpinner: ButtonStory = {
+ render: (args) =>
+};
+
+function render(props: SpectrumButtonProps = {variant: 'primary'}) {
+ let buttons = (
+
+
+ Default
+
+
+ Disabled
+
+
+ );
+
+ if (props.variant === 'overBackground' || props.staticColor === 'white') {
+ return (
+
+ {buttons}
+
+ );
+ }
+
+ if (props.staticColor === 'black') {
+ return (
+
+ {buttons}
+
+ );
+ }
+
+ return buttons;
+}
+
+function renderIconText(props: SpectrumButtonProps = {variant: 'primary'}) {
+ let buttons = (
+
+
+
+ Default
+
+
+
+ Disabled
+
+
+ );
+
+ if (props.variant === 'overBackground' || props.staticColor === 'white') {
+ return (
+
+ {buttons}
+
+ );
+ }
+
+ if (props.staticColor === 'black') {
+ return (
+
+ {buttons}
+
+ );
+ }
+
+ return buttons;
+}
+
+function renderIconOnly(props: SpectrumButtonProps = {variant: 'primary'}) {
+ let buttons = (
+
+
+
+
+
+ Notifications
+
+
+
+
+
+ Notifications
+
+
+ );
+
+ if (props.variant === 'overBackground' || props.staticColor === 'white') {
+ return (
+
+ {buttons}
+
+ );
+ }
+
+ if (props.staticColor === 'black') {
+ return (
+
+ {buttons}
+
+ );
+ }
+
+ return buttons;
+}
+
+function Example() {
+ let [show, setShow] = React.useState(false);
+ let [show2, setShow2] = React.useState(false);
+
+ return (
+
+ setTimeout(() => setShow(true), 3000)}>
+ Press and hold (overwrite)
+
+ setTimeout(() => setShow2(true), 3000)}>
+ Press and hold (no overwrite)
+
+
+ );
+}
+
+function PendingButtonContainerComponent(props) {
+ let {children, ...otherProps} = props;
+
+ function containerBackgroundColor(variant, staticColor): BackgroundColorValue | undefined {
+ if (variant === 'overBackground' || staticColor === 'white') {
+ return 'static-blue-700';
+ }
+ if (staticColor === 'black') {
+ return 'static-yellow-200';
+ }
+ return;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
+function Pending(props) {
+ let [tooltipPending, setTooltipPending] = useState(false);
+
+ let handlePress = (e) => {
+ action('press')(e);
+ setTooltipPending(true);
+ setTimeout(() => {
+ setTooltipPending(false);
+ }, timerValue);
+ };
+
+ return (
+
+
+
+ click me!
+
+
+
+
+
+ I have an icon
+
+
+
+
+
+ with onClick
+
+
+
+
+ disabled
+
+
+
+
+ Aria-label "Button label" on button
+
+
+
+
+
+
+ Aria-label "icon label" on icon
+
+
+
+
+
+
+ No aria-labels--bad implementation
+
+
+
+
+
+
+ Tooltip and aria-label "Notifications" on button
+
+
+
+
+
+ Click here to view
+
+
+
+
+
+
+
+ {window.alert('use storybook control to change this button isPending prop');}}>
+ Controlled
+
+
+
+
+
+
+
+ Form submit
+
+
+
+
+ );
+}
+let timerValue = 5000;
+function PendingButtonComponent(props) {
+ let [isPending, setPending] = useState(false);
+
+ let handlePress = (e) => {
+ action('press')(e);
+ setPending(true);
+ setTimeout(() => {
+ setPending(false);
+ }, timerValue);
+ };
+
+ return (
+
+ {props.children}
+
+ );
+}
+
+function PendingButtonOnClickComponent(props) {
+ let [isPending, setPending] = useState(false);
+
+ let handlePress = (e) => {
+ action('click')(e);
+ setPending(true);
+ setTimeout(() => {
+ setPending(false);
+ }, timerValue);
+ };
+
+ return (
+
+ {props.children}
+
+ );
+}
+
+function PendingButtonFormComponent(props) {
+ let [isPending, setPending] = useState(false);
+
+ let onSubmit = (e) => {
+ console.log('onSubmit called.');
+ e.preventDefault();
+ if (!isPending) {
+ setPending(true);
+ setTimeout(() => {
+ setPending(false);
+ }, timerValue);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/packages/@fds-design/button/stories/LogicButton.stories.tsx b/packages/@fds-design/button/stories/LogicButton.stories.tsx
new file mode 100644
index 0000000..e5e4e23
--- /dev/null
+++ b/packages/@fds-design/button/stories/LogicButton.stories.tsx
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {LogicButton} from '../';
+import React from 'react';
+
+export type LogicButtonStory = ComponentStoryObj;
+
+export default {
+ title: 'Button/LogicButton',
+ component: LogicButton,
+ args: {
+ onPress: action('press'),
+ onPressStart: action('pressstart'),
+ onPressEnd: action('pressend')
+ },
+ argTypes: {
+ onPress: {
+ table: {
+ disable: true
+ }
+ },
+ onPressStart: {
+ table: {
+ disable: true
+ }
+ },
+ onPressEnd: {
+ table: {
+ disable: true
+ }
+ },
+ autoFocus: {
+ control: 'boolean'
+ },
+ variant: {
+ control: 'select',
+ options: ['and', 'or'],
+ defaultValue: 'and'
+ }
+ }
+} as ComponentMeta;
+
+export const Default: LogicButtonStory = {
+ render: (args) => render(args)
+};
+
+function render(props: any = {}) {
+ return (
+
+
+ Default
+
+
+ Disabled
+
+
+ );
+}
diff --git a/packages/@fds-design/button/stories/ToggleButton.stories.tsx b/packages/@fds-design/button/stories/ToggleButton.stories.tsx
new file mode 100644
index 0000000..9dcee11
--- /dev/null
+++ b/packages/@fds-design/button/stories/ToggleButton.stories.tsx
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import Add from '@spectrum-icons/workflow/Add';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {Flex, Text, View} from '@adobe/react-spectrum';
+import React, {useState} from 'react';
+import {ToggleButton} from '../';
+
+export type ToggleButtonStory = ComponentStoryObj;
+
+export default {
+ title: 'Button/ToggleButton',
+ component: ToggleButton,
+ args: {
+ onPress: action('press'),
+ onPressStart: action('pressstart'),
+ onPressEnd: action('pressend'),
+ variant: 'cta'
+ },
+ argTypes: {
+ onPress: {
+ table: {
+ disable: true
+ }
+ },
+ onPressStart: {
+ table: {
+ disable: true
+ }
+ },
+ onPressEnd: {
+ table: {
+ disable: true
+ }
+ },
+ staticColor: {
+ table: {
+ disable: true
+ }
+ },
+ isQuiet: {
+ control: 'boolean'
+ },
+ isEmphasized: {
+ control: 'boolean'
+ },
+ isDisabled: {
+ control: 'boolean'
+ },
+ autoFocus: {
+ control: 'boolean'
+ }
+ }
+} as ComponentMeta;
+
+export const Default: ToggleButtonStory = {
+ render: (args) => render(args)
+};
+
+export const StaticWhite: ToggleButtonStory = {
+ args: {staticColor: 'white'},
+ render: (args) => (
+
+
+ {render(args)}
+
+
+ ),
+ name: 'staticColor: white'
+};
+
+export const StaticBlack: ToggleButtonStory = {
+ args: {staticColor: 'black'},
+ render: (args) => (
+
+
+ {render(args)}
+
+
+ ),
+ name: 'staticColor: black'
+};
+
+export const WHCM: ToggleButtonStory = {
+ render: () => (
+
+
+ {render()}
+ {render({isEmphasized: true})}
+ {render({isQuiet: true})}
+ {render({isQuiet: true, isEmphasized: true})}
+
+
+ ),
+ name: 'styles to check WHCM support'
+};
+
+export const Controlled: ToggleButtonStory = {
+ render: () => ,
+ name: 'controlled state'
+};
+
+function render(props = {}) {
+ return (
+
+
+
+ Default
+
+
+
+ Selected
+
+
+ );
+}
+
+function ControlledToggleButton() {
+ let [selected, setSelected] = useState(false);
+ return (
+
+ Press Me
+
+ {selected ? 'true' : 'false'}
+
+ );
+}
diff --git a/packages/@fds-design/button/test/ActionButton.test.js b/packages/@fds-design/button/test/ActionButton.test.js
new file mode 100644
index 0000000..3fd868e
--- /dev/null
+++ b/packages/@fds-design/button/test/ActionButton.test.js
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionButton} from '../';
+import {pointerMap, render} from '@react-spectrum/test-utils-internal';
+import React from 'react';
+import userEvent from '@testing-library/user-event';
+
+describe('ActionButton', function () {
+ let onPressSpy = jest.fn();
+
+ afterEach(() => {
+ onPressSpy.mockClear();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton} | ${{onPress: onPressSpy}}
+ `('$Name handles defaults', async function ({Component, props}) {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ await user.click(button);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ expect(button).not.toHaveAttribute('aria-pressed');
+ expect(button).not.toHaveAttribute('aria-checked');
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton} | ${{}}
+ `('$Name allows custom props to be passed through to the button', function ({Component, props}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button', {hidden: true});
+ expect(button).toHaveAttribute('data-foo', 'bar');
+ });
+});
diff --git a/packages/@fds-design/button/test/Button.ssr.test.js b/packages/@fds-design/button/test/Button.ssr.test.js
new file mode 100644
index 0000000..4eeaf48
--- /dev/null
+++ b/packages/@fds-design/button/test/Button.ssr.test.js
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('Button SSR', function () {
+ it.each`
+ Name | props
+ ${'ActionButton'} | ${{}}
+ ${'Button'} | ${{}}
+ ${'FieldButton'} | ${{}}
+ ${'LogicButton'} | ${{}}
+ `('$Name should render without errors', async function ({Name, props}) {
+ await testSSR(__filename, `
+ import {${Name}} from '../';
+ <${Name}>Button${Name}>
+ `);
+ });
+});
diff --git a/packages/@fds-design/button/test/Button.test.js b/packages/@fds-design/button/test/Button.test.js
new file mode 100644
index 0000000..42a5ed6
--- /dev/null
+++ b/packages/@fds-design/button/test/Button.test.js
@@ -0,0 +1,383 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, pointerMap, render} from '@react-spectrum/test-utils-internal';
+import {ActionButton, Button, ClearButton, LogicButton} from '../';
+import {Checkbox, defaultTheme} from '@adobe/react-spectrum';
+import {Form} from '@react-spectrum/form';
+import {Provider} from '@react-spectrum/provider';
+import React, {useState} from 'react';
+import userEvent from '@testing-library/user-event';
+
+/**
+ * Logic Button has no tests outside of this file because functionally it is identical
+ * to Button right now. The only difference is the class names, and since we aren't
+ * testing that, these are all the tests we need to cover Logic Button.
+ */
+
+describe('Button', function () {
+ let onPressSpy = jest.fn();
+ let spinnerVisibilityDelay = 1000;
+ let onPressStartSpy = jest.fn();
+ let onPressEndSpy = jest.fn();
+ let onPressUpSpy = jest.fn();
+ let onPressChangeSpy = jest.fn();
+ let user;
+
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ onPressSpy.mockClear();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton}| ${{onPress: onPressSpy}}
+ ${'Button'} | ${Button} | ${{onPress: onPressSpy}}
+ ${'LogicButton'} | ${LogicButton} | ${{onPress: onPressSpy}}
+ `('$Name handles defaults', async function ({Component, props}) {
+ let {getByRole, getByText} = render(Click Me );
+
+ let button = getByRole('button');
+ await user.click(button);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+
+ let text = getByText('Click Me');
+ expect(text).not.toBeNull();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton}| ${{onPress: onPressSpy, onPressStart: onPressStartSpy, onPressEnd: onPressEndSpy, onPressUp: onPressUpSpy, onPressChange: onPressChangeSpy}}
+ ${'Button'} | ${Button} | ${{onPress: onPressSpy, onPressStart: onPressStartSpy, onPressEnd: onPressEndSpy, onPressUp: onPressUpSpy, onPressChange: onPressChangeSpy}}
+ ${'LogicButton'} | ${LogicButton} | ${{onPress: onPressSpy, onPressStart: onPressStartSpy, onPressEnd: onPressEndSpy, onPressUp: onPressUpSpy, onPressChange: onPressChangeSpy}}
+ `('$Name supports press events', async function ({Component, props}) {
+ let {getByRole, getByText} = render(Click Me );
+
+ let button = getByRole('button');
+ await user.click(button);
+ expect(onPressStartSpy).toHaveBeenCalledTimes(1);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ expect(onPressEndSpy).toHaveBeenCalledTimes(1);
+ expect(onPressUpSpy).toHaveBeenCalledTimes(1);
+ expect(onPressChangeSpy).toHaveBeenCalledTimes(2);
+
+ let text = getByText('Click Me');
+ expect(text).not.toBeNull();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton}| ${{onPress: onPressSpy, onPressStart: onPressStartSpy, onPressEnd: onPressEndSpy, onPressUp: onPressUpSpy, onPressChange: onPressChangeSpy}}
+ ${'Button'} | ${Button} | ${{onPress: onPressSpy, onPressStart: onPressStartSpy, onPressEnd: onPressEndSpy, onPressUp: onPressUpSpy, onPressChange: onPressChangeSpy}}
+ ${'LogicButton'} | ${LogicButton} | ${{onPress: onPressSpy, onPressStart: onPressStartSpy, onPressEnd: onPressEndSpy, onPressUp: onPressUpSpy, onPressChange: onPressChangeSpy}}
+ `('$Name keyboard press and key events', async function ({Component, props}) {
+ let onKeyDownSpy = jest.fn();
+ let onKeyUpSpy = jest.fn();
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ await user.tab();
+ expect(onKeyUpSpy).toHaveBeenCalledTimes(1);
+ expect(document.activeElement).toBe(button);
+ await user.keyboard('{Enter}');
+ expect(onPressStartSpy).toHaveBeenCalledTimes(1);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ expect(onPressEndSpy).toHaveBeenCalledTimes(1);
+ expect(onPressUpSpy).toHaveBeenCalledTimes(1);
+ expect(onPressChangeSpy).toHaveBeenCalledTimes(2);
+ expect(onKeyDownSpy).toHaveBeenCalledTimes(1);
+ expect(onKeyUpSpy).toHaveBeenCalledTimes(2);
+
+ await user.keyboard('A');
+ expect(onKeyDownSpy).toHaveBeenCalledTimes(2);
+ expect(onKeyUpSpy).toHaveBeenCalledTimes(3);
+ });
+
+ it.each`
+ Name | Component
+ ${'ActionButton'} | ${ActionButton}
+ ${'Button'} | ${Button}
+ ${'ClearButton'} | ${ClearButton}
+ ${'LogicButton'} | ${LogicButton}
+ `('$Name allows custom props to be passed through to the button', function ({Component}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('data-foo', 'bar');
+ });
+
+ it.each`
+ Name | Component
+ ${'ActionButton'} | ${ActionButton}
+ ${'Button'} | ${Button}
+ ${'ClearButton'} | ${ClearButton}
+ ${'LogicButton'} | ${LogicButton}
+ `('$Name supports aria-label', function ({Component}) {
+ let {getByRole} = render( );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('aria-label', 'Test');
+ });
+
+ it.each`
+ Name | Component
+ ${'ActionButton'} | ${ActionButton}
+ ${'Button'} | ${Button}
+ ${'ClearButton'} | ${ClearButton}
+ ${'LogicButton'} | ${LogicButton}
+ `('$Name supports aria-labelledby', function ({Component}) {
+ let {getByRole} = render(
+ <>
+ Test
+
+ >
+ );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('aria-labelledby', 'test');
+ });
+
+ it.each`
+ Name | Component
+ ${'ActionButton'} | ${ActionButton}
+ ${'Button'} | ${Button}
+ ${'ClearButton'} | ${ClearButton}
+ ${'LogicButton'} | ${LogicButton}
+ `('$Name supports aria-describedby', function ({Component}) {
+ let {getByRole} = render(
+ <>
+ Test
+ Hi
+ >
+ );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('aria-describedby', 'test');
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton} | ${{UNSAFE_className: 'x-men-first-class'}}
+ ${'Button'} | ${Button} | ${{UNSAFE_className: 'x-men-first-class'}}
+ ${'ClearButton'} | ${ClearButton} | ${{UNSAFE_className: 'x-men-first-class'}}
+ ${'LogicButton'} | ${LogicButton} | ${{UNSAFE_className: 'x-men-first-class'}}
+ `('$Name allows a custom classname on the button', function ({Component, props}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button.getAttribute('class')).toEqual(expect.stringContaining('x-men-first-class'));
+ });
+
+ it.each`
+ Name | Component
+ ${'ActionButton'} | ${ActionButton}
+ ${'Button'} | ${Button}
+ ${'ClearButton'} | ${ClearButton}
+ ${'LogicButton'} | ${LogicButton}
+ `('$Name handles deprecated onClick', async function ({Component}) {
+ let spyWarn = jest.spyOn(console, 'warn').mockImplementation(() => {});
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ await user.click(button);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ expect(spyWarn).toHaveBeenCalledWith('onClick is deprecated, please use onPress');
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton}| ${{onPress: onPressSpy, elementType: 'a'}}
+ ${'Button'} | ${Button} | ${{onPress: onPressSpy, elementType: 'a'}}
+ ${'LogicButton'} | ${LogicButton} | ${{onPress: onPressSpy, elementType: 'a'}}
+ `('$Name can have elementType=a', async function ({Component, props}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('tabindex', '0');
+ expect(button).not.toHaveAttribute('type', 'button');
+ await user.click(button);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+
+ await user.keyboard('{Enter}');
+ expect(onPressSpy).toHaveBeenCalledTimes(2);
+
+ await user.keyboard('[Space]');
+ expect(onPressSpy).toHaveBeenCalledTimes(3);
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton}| ${{onPress: onPressSpy, elementType: 'a', href: '#only-hash-in-jsdom'}}
+ ${'Button'} | ${Button} | ${{onPress: onPressSpy, elementType: 'a', href: '#only-hash-in-jsdom'}}
+ ${'LogicButton'} | ${LogicButton} | ${{onPress: onPressSpy, elementType: 'a', href: '#only-hash-in-jsdom'}}
+ `('$Name can have elementType=a with an href', async function ({Component, props}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('tabindex', '0');
+ expect(button).toHaveAttribute('href', '#only-hash-in-jsdom');
+ await user.click(button);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ActionButton'} | ${ActionButton}| ${{onPress: onPressSpy, isDisabled: true}}
+ ${'Button'} | ${Button} | ${{onPress: onPressSpy, isDisabled: true}}
+ ${'ClearButton'} | ${ClearButton} | ${{onPress: onPressSpy, isDisabled: true}}
+ ${'LogicButton'} | ${LogicButton} | ${{onPress: onPressSpy, isDisabled: true}}
+ `('$Name does not respond when disabled', async function ({Component, props}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ await user.click(button);
+ expect(button).toBeDisabled();
+ expect(onPressSpy).not.toHaveBeenCalled();
+ });
+
+ it.each`
+ Name | Component
+ ${'ActionButton'} | ${ActionButton}
+ ${'Button'} | ${Button}
+ ${'LogicButton'} | ${LogicButton}
+ `('$Name supports autoFocus', function ({Component}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(document.activeElement).toBe(button);
+ });
+
+
+ it('prevents default for non-submit types', async function () {
+ let eventDown;
+ let eventUp;
+ let btn = React.createRef();
+ let {getByRole} = render(
+
+
+
+ );
+ // need to attach event listeners after instead of directly on Button because the ones directly on Button
+ // will fire before the usePress ones
+ btn.current.UNSAFE_getDOMNode().addEventListener('keydown', e => eventDown = e);
+ btn.current.UNSAFE_getDOMNode().addEventListener('keyup', e => eventUp = e);
+
+ let button = getByRole('button');
+ act(() => button.focus());
+ await user.keyboard('{Enter}');
+ expect(eventDown.defaultPrevented).toBeTruthy();
+ expect(eventUp.defaultPrevented).toBeTruthy();
+
+ await user.keyboard('[Space]');
+ expect(eventDown.defaultPrevented).toBeTruthy();
+ expect(eventUp.defaultPrevented).toBeTruthy();
+ });
+
+ // we only need to test that we allow the browser to do the default thing when space or enter is pressed on a submit button
+ // space submits on key up and is actually a click
+ it('submit in form using space', async function () {
+ let eventUp;
+ let btn = React.createRef();
+ let {getByRole} = render(
+
+
+
+ );
+ btn.current.UNSAFE_getDOMNode().addEventListener('keyup', e => eventUp = e);
+
+ let button = getByRole('button');
+ act(() => button.focus());
+ await user.keyboard('{Space}');
+ expect(eventUp.defaultPrevented).toBeFalsy();
+ });
+
+ // enter submits on keydown
+ it('submit in form using enter', async function () {
+ let eventDown;
+ let btn = React.createRef();
+ let {getByRole} = render(
+
+
+
+ );
+ btn.current.UNSAFE_getDOMNode().addEventListener('keydown', e => {
+ eventDown = {...e};
+ // Prevent default to avoid "Error: Not implemented: HTMLFormElement.prototype.requestSubmit"
+ e.preventDefault();
+ });
+ let button = getByRole('button');
+ act(() => button.focus());
+ await user.keyboard('[Enter]');
+ expect(eventDown.defaultPrevented).toBeFalsy();
+ });
+
+ // isPending state
+ it('displays a spinner after a short delay when isPending prop is true', async function () {
+ let onPressSpy = jest.fn();
+ function TestComponent() {
+ let [pending, setPending] = useState(false);
+ return (
+ {
+ setPending(true);
+ onPressSpy();
+ }}
+ isPending={pending}>
+ Click me
+
+ );
+ }
+ let {getByRole, queryByRole} = render( );
+ let button = getByRole('button');
+ expect(button).not.toHaveAttribute('aria-disabled');
+ await user.click(button);
+ // Button is disabled immediately, but spinner visibility is delayed
+ expect(button).toHaveAttribute('aria-disabled', 'true');
+ let spinner = queryByRole('progressbar');
+ expect(spinner).not.toBeInTheDocument();
+ // Multiple clicks shouldn't call onPressSpy
+ await user.click(button);
+ act(() => {
+ jest.advanceTimersByTime(spinnerVisibilityDelay);
+ });
+ expect(button).toHaveAttribute('aria-disabled', 'true');
+ spinner = queryByRole('progressbar', {hidden: true});
+ expect(spinner).toBeVisible();
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ });
+
+ // isPending anchor element
+ it('removes href attribute from anchor element when isPending is true', () => {
+ let {getByRole} = render(
+
+ Click Me
+
+ );
+ let button = getByRole('button');
+ expect(button).not.toHaveAttribute('href');
+ });
+
+ // 'implicit submission' can't be tested https://github.com/testing-library/react-testing-library/issues/487
+});
diff --git a/packages/@fds-design/button/test/ClearButton.test.js b/packages/@fds-design/button/test/ClearButton.test.js
new file mode 100644
index 0000000..81e8fef
--- /dev/null
+++ b/packages/@fds-design/button/test/ClearButton.test.js
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, pointerMap, render} from '@react-spectrum/test-utils-internal';
+import {ClearButton} from '../';
+import React from 'react';
+import userEvent from '@testing-library/user-event';
+
+// NOTE: ClearButton doesn't use Button.tsx as a base and thus differs from v2 ClearButton in a couple ways
+// Refinement of ClearButton to be done later
+describe('ClearButton', function () {
+ let onPressSpy = jest.fn();
+ let FakeIcon = (props) => ;
+
+ afterEach(() => {
+ onPressSpy.mockClear();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'v3 ClearButton'} | ${ClearButton} | ${{onPress: onPressSpy}}
+ `('$Name handles defaults', async function ({Component, props}) {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button', {hidden: true});
+ await user.click(button);
+ expect(onPressSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it.each`
+ Name | Component | props
+ ${'v3 ClearButton'} | ${ClearButton} | ${{}}
+ `('$Name allows custom props to be passed through to the button', function ({Component, props}) {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button', {hidden: true});
+ expect(button).toHaveAttribute('data-foo', 'bar');
+ });
+
+ it.each`
+ Name | Component
+ ${'v3 ClearButton'} | ${ClearButton}
+ `('$Name doesn\'t accept an icon as a prop', function ({Component}) {
+ let mockIcon = ;
+ let tree = render( );
+
+ let icon = tree.queryByRole('status');
+ expect(icon).toBeNull();
+ });
+
+ it.each`
+ Name | Component
+ ${'v3 ClearButton'} | ${ClearButton}
+ `('$Name allows a user to forward a ref to the button', function ({Component}) {
+ let ref = React.createRef();
+ let tree = render( );
+
+ let button = tree.queryByRole('button');
+ expect(button).toBe(ref.current.UNSAFE_getDOMNode());
+
+ act(() => {ref.current.focus();});
+ expect(document.activeElement).toBe(button);
+ });
+});
diff --git a/packages/@fds-design/button/test/ToggleButton.test.js b/packages/@fds-design/button/test/ToggleButton.test.js
new file mode 100644
index 0000000..985fad1
--- /dev/null
+++ b/packages/@fds-design/button/test/ToggleButton.test.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {pointerMap, render} from '@react-spectrum/test-utils-internal';
+import React from 'react';
+import {ToggleButton} from '../';
+import userEvent from '@testing-library/user-event';
+
+describe('ToggleButton', function () {
+ it('handles defaults', async function () {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onPress = jest.fn();
+ let onChange = jest.fn();
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('aria-pressed', 'false');
+
+ await user.click(button);
+ expect(onPress).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(true);
+ expect(button).toHaveAttribute('aria-pressed', 'true');
+ });
+
+ it('supports defaultSelected', async function () {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onPress = jest.fn();
+ let onChange = jest.fn();
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('aria-pressed', 'true');
+
+ await user.click(button);
+ expect(onPress).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(false);
+ expect(button).toHaveAttribute('aria-pressed', 'false');
+ });
+
+ it('supports isSelected', async function () {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onPress = jest.fn();
+ let onChange = jest.fn();
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('aria-pressed', 'true');
+
+ await user.click(button);
+ expect(onPress).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith(false);
+ expect(button).toHaveAttribute('aria-pressed', 'true');
+ });
+
+ it('allows custom props to be passed through to the button', function () {
+ let {getByRole} = render(Click Me );
+
+ let button = getByRole('button');
+ expect(button).toHaveAttribute('data-foo', 'bar');
+ });
+});
diff --git a/packages/@fds-design/buttongroup/README.md b/packages/@fds-design/buttongroup/README.md
new file mode 100644
index 0000000..78bed62
--- /dev/null
+++ b/packages/@fds-design/buttongroup/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/buttongroup
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/buttongroup/chromatic/ButtonGroup.stories.tsx b/packages/@fds-design/buttongroup/chromatic/ButtonGroup.stories.tsx
new file mode 100644
index 0000000..ce2b1ab
--- /dev/null
+++ b/packages/@fds-design/buttongroup/chromatic/ButtonGroup.stories.tsx
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Button} from '@react-spectrum/button';
+import {ButtonGroup} from '../';
+import React from 'react';
+import {View} from '@react-spectrum/view';
+
+export default {
+ title: 'ButtonGroup'
+};
+
+export const Default = () => render({});
+
+Default.story = {
+ name: 'default'
+};
+
+export const AlignCenter = () => render({align: 'center'});
+
+AlignCenter.story = {
+ name: 'align: center'
+};
+
+export const AlignEnd = () => render({align: 'end'});
+
+AlignEnd.story = {
+ name: 'align: end'
+};
+
+export const OrientationVertical = () => render({orientation: 'vertical'});
+
+OrientationVertical.story = {
+ name: 'orientation: vertical'
+};
+
+export const OrientationVerticalAlignCenter = () =>
+ render({orientation: 'vertical', align: 'center'});
+
+OrientationVerticalAlignCenter.story = {
+ name: 'orientation: vertical, align: center'
+};
+
+export const OrientationVerticalAlignEnd = () => render({orientation: 'vertical', align: 'end'});
+
+OrientationVerticalAlignEnd.story = {
+ name: 'orientation: vertical, align: end'
+};
+
+function render(props) {
+ return (
+ <>
+
+
+ Button 1
+ Button 2
+
+
+
+
+ Button 1
+ Button 2
+
+
+ >
+ );
+}
diff --git a/packages/@fds-design/buttongroup/docs/ButtonGroup.mdx b/packages/@fds-design/buttongroup/docs/ButtonGroup.mdx
new file mode 100644
index 0000000..c966fc9
--- /dev/null
+++ b/packages/@fds-design/buttongroup/docs/ButtonGroup.mdx
@@ -0,0 +1,98 @@
+{/* Copyright 2020 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/buttongroup';
+import {HeaderInfo, PropTable, PageDescription} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/buttongroup/package.json';
+
+---
+category: Buttons
+keywords: [button group]
+---
+
+# ButtonGroup
+
+{docs.exports.ButtonGroup.description}
+
+
+
+## Example
+```tsx example
+import {ButtonGroup} from '@react-spectrum/buttongroup';
+import {Button} from '@react-spectrum/button';
+
+
+ Rate Now
+ No, thanks
+ Remind me later
+
+```
+
+## Content
+ButtonGroup expects [Buttons](./Button.html) as children and is used to handle overflow. When horizontal space is limited, the ButtonGroup switches to a vertical layout. ButtonGroup should be used when there are two or more related Buttons in a group.
+To see the orientation switch in the example above, resize the width of your window.
+
+## Props
+
+
+
+## Visual options
+
+### Orientation
+[View guidelines](https://spectrum.adobe.com/page/button-group/#Orientation)
+
+Setting this to 'vertical' will prevent any dynamic orientation changes, the ButtonGroup will remain in vertical regardless of the available width.
+```tsx example
+
+ No, thanks
+ Remind me later
+ Rate Now
+
+```
+
+### Alignment
+[View guidelines](https://spectrum.adobe.com/page/button-group/#Align-button-groups-based-on-content)
+
+Button groups are aligned contextually. Generally, button groups should be start-aligned to follow content. However, they should be end-aligned inside container components, such as in dialogs, popovers, or cards. Center alignment should be used in the context of an empty state. In right-to-left languages, alignment is flipped automatically.
+
+```tsx example
+
+ No, thanks
+ Remind me later
+ Rate Now
+
+```
+
+```tsx example
+
+ No, thanks
+ Remind me later
+ Rate Now
+
+```
+
+### Disabled
+[View guidelines](https://spectrum.adobe.com/page/button-group/#Disabled)
+
+```tsx example
+
+ No, thanks
+ Remind me later
+ Rate Now
+
+```
diff --git a/packages/@fds-design/buttongroup/index.ts b/packages/@fds-design/buttongroup/index.ts
new file mode 100644
index 0000000..1210ae1
--- /dev/null
+++ b/packages/@fds-design/buttongroup/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/buttongroup/package.json b/packages/@fds-design/buttongroup/package.json
new file mode 100644
index 0000000..bd72898
--- /dev/null
+++ b/packages/@fds-design/buttongroup/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "@fds-design/buttongroup",
+ "version": "3.6.17",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-types/buttongroup": "^3.3.13",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1",
+ "@spectrum-icons/workflow": "^4.0.0"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/buttongroup/src/ButtonGroup.tsx b/packages/@fds-design/buttongroup/src/ButtonGroup.tsx
new file mode 100644
index 0000000..b71449e
--- /dev/null
+++ b/packages/@fds-design/buttongroup/src/ButtonGroup.tsx
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {
+ classNames,
+ SlotProvider,
+ useDOMRef,
+ useResizeObserver,
+ useSlotProps,
+ useStyleProps
+} from '../../utils';
+import {DOMRef} from '@react-types/shared';
+import {filterDOMProps, useLayoutEffect, useValueEffect} from '@react-aria/utils';
+import {Provider, useProvider, useProviderProps} from '../../provider';
+import React, {useCallback, useRef} from 'react';
+import {SpectrumButtonGroupProps} from '@react-types/buttongroup';
+import styles from '@adobe/spectrum-css-temp/components/buttongroup/vars.css';
+
+/**
+ * ButtonGroup handles overflow for a grouping of buttons whose actions are related to each other.
+ */
+export const ButtonGroup = React.forwardRef(function ButtonGroup(props: SpectrumButtonGroupProps, ref: DOMRef) {
+ let {scale} = useProvider();
+ props = useProviderProps(props);
+ props = useSlotProps(props, 'buttonGroup');
+
+ let {
+ children,
+ orientation = 'horizontal',
+ isDisabled,
+ align = 'start',
+ ...otherProps
+ } = props;
+
+ let {styleProps} = useStyleProps(otherProps);
+ let domRef = useDOMRef(ref);
+ let [hasOverflow, setHasOverflow] = useValueEffect(false);
+
+ let checkForOverflow = useCallback(() => {
+ let computeHasOverflow = () => {
+ if (domRef.current && orientation === 'horizontal') {
+ let buttonGroupChildren = Array.from(domRef.current.children) as HTMLElement[];
+ let maxX = domRef.current.offsetWidth + 1; // + 1 to account for rounding errors
+ // If any buttons have negative X positions (align="end") or extend beyond
+ // the width of the button group (align="start"), then switch to vertical.
+ if (buttonGroupChildren.some(child => child.offsetLeft < 0 || child.offsetLeft + child.offsetWidth > maxX)) {
+ return true;
+ }
+ return false;
+ }
+ };
+ if (orientation === 'horizontal') {
+ setHasOverflow(function* () {
+ // Force to horizontal for measurement.
+ yield false;
+
+ // Measure, and update if there is overflow.
+ yield computeHasOverflow();
+ });
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [domRef, orientation, scale, setHasOverflow, children]);
+
+ // There are two main reasons we need to remeasure:
+ // 1. Internal changes: Check for initial overflow or when orientation/scale/children change (from checkForOverflow dep array)
+ useLayoutEffect(() => {
+ checkForOverflow();
+ }, [checkForOverflow]);
+
+ // 2. External changes: buttongroup won't change size due to any parents changing size, so listen to its container for size changes to figure out if we should remeasure
+ let parent = useRef(undefined);
+ useLayoutEffect(() => {
+ if (domRef.current) {
+ parent.current = domRef.current.parentElement as HTMLElement;
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [domRef.current]);
+ useResizeObserver({ref: parent, onResize: checkForOverflow});
+
+ return (
+
+ );
+});
diff --git a/packages/@fds-design/buttongroup/src/index.ts b/packages/@fds-design/buttongroup/src/index.ts
new file mode 100644
index 0000000..1d1d63d
--- /dev/null
+++ b/packages/@fds-design/buttongroup/src/index.ts
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2020 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.
+ */
+///
+export {ButtonGroup} from './ButtonGroup';
+export type {SpectrumButtonGroupProps} from '@react-types/buttongroup';
diff --git a/packages/@fds-design/buttongroup/stories/ButtonGroup.stories.tsx b/packages/@fds-design/buttongroup/stories/ButtonGroup.stories.tsx
new file mode 100644
index 0000000..ac784ae
--- /dev/null
+++ b/packages/@fds-design/buttongroup/stories/ButtonGroup.stories.tsx
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import Bell from '@spectrum-icons/workflow/Bell';
+import {Button} from '@react-spectrum/button';
+import {ButtonGroup} from '../';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import React, {useState} from 'react';
+import {Text} from '@react-spectrum/text';
+
+export type ButtonGroupStory = ComponentStoryObj;
+
+export default {
+ title: 'ButtonGroup',
+ component: ButtonGroup,
+ argTypes: {
+ isDisabled: {
+ control: 'boolean'
+ },
+ orientation: {
+ control: 'select',
+ options: ['horizontal', 'vertical']
+ },
+ align: {
+ control: 'select',
+ options: ['start', 'end', 'center']
+ }
+ }
+} as ComponentMeta;
+
+export const Default: ButtonGroupStory = {
+ render: (args) => (
+
+ {render(args)}
+
+ )
+};
+
+export const ConstantContainer: ButtonGroupStory = {
+ render: (args) => ,
+ name: 'constant container, changing siblings'
+};
+
+function render(props) {
+ return ;
+}
+
+let ExpandingSibling = (props = {}) => {
+ let [isExpanded, setIsExpanded] = useState(false);
+ return (
+
+
+ setIsExpanded(prev => !prev)}>{isExpanded ? 'Shrink' : 'Expand'}
+
+ {render(props)}
+
+ );
+};
+
+let Component = (props) => {
+ let [show, setShow] = useState(false);
+ return (
+
+ Button 1
+ Button long long long name
+ Disabled button
+ setShow(show => !show)}>
+
+ Click me to make Button larger
+ {show && to test overflow resizing :D }
+
+
+ );
+};
diff --git a/packages/@fds-design/buttongroup/test/ButtonGroup.ssr.test.js b/packages/@fds-design/buttongroup/test/ButtonGroup.ssr.test.js
new file mode 100644
index 0000000..b90c771
--- /dev/null
+++ b/packages/@fds-design/buttongroup/test/ButtonGroup.ssr.test.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('ButtonGroup SSR', function () {
+ it('should render without errors', async function () {
+ await testSSR(__filename, `
+ import {ButtonGroup} from '../';
+ import {Button} from '@react-spectrum/button';
+ import {Provider} from '@react-spectrum/provider';
+ import {theme} from '@react-spectrum/theme-default';
+
+
+
+ Test
+
+
+ `);
+ });
+});
diff --git a/packages/@fds-design/buttongroup/test/ButtonGroup.test.js b/packages/@fds-design/buttongroup/test/ButtonGroup.test.js
new file mode 100644
index 0000000..43131e9
--- /dev/null
+++ b/packages/@fds-design/buttongroup/test/ButtonGroup.test.js
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, pointerMap, render, within} from '@react-spectrum/test-utils-internal';
+import {Button} from '@react-spectrum/button';
+import {ButtonGroup} from '../';
+import {Provider} from '@react-spectrum/provider';
+import React, {useEffect, useRef} from 'react';
+import {theme} from '@react-spectrum/theme-default';
+import userEvent from '@testing-library/user-event';
+
+let buttonGroupId = 'button-group';
+let onPressSpy1 = jest.fn();
+let onPressSpy2 = jest.fn();
+let onPressSpy3 = jest.fn();
+
+function renderComponent(Component, props = {}) {
+ return render(
+
+
+
+ Button1
+
+
+ Button2
+
+
+ Button3
+
+
+
+ );
+}
+
+describe('ButtonGroup', function () {
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ButtonGroup'} | ${ButtonGroup} | ${{}}
+ `('$Name renders multiple buttons', async function ({Component, props}) {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let tree = renderComponent(Component, props);
+ let buttonGroup = tree.getByTestId(buttonGroupId);
+ expect(buttonGroup).toBeTruthy();
+
+ let button1 = within(buttonGroup).getByText('Button1');
+ let button2 = within(buttonGroup).getByText('Button2');
+ let button3 = within(buttonGroup).getByText('Button3');
+
+ expect(button1).toBeTruthy();
+ expect(button2).toBeTruthy();
+ expect(button3).toBeTruthy();
+
+ await user.click(button1);
+ await user.click(button2);
+ await user.click(button3);
+
+ expect(onPressSpy1).toHaveBeenCalledTimes(1);
+ expect(onPressSpy2).toHaveBeenCalledTimes(1);
+ expect(onPressSpy3).toHaveBeenCalledTimes(1);
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ButtonGroup'} | ${ButtonGroup} | ${{UNSAFE_className: 'custom class'}}
+ `('$Name supports UNSAFE_className', function ({Component, props}) {
+ let tree = renderComponent(Component, props);
+ let buttonGroup = tree.getByTestId(buttonGroupId);
+ expect(buttonGroup).toBeTruthy();
+ expect(buttonGroup).toHaveAttribute('class', expect.stringContaining('custom class'));
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ButtonGroup'} | ${ButtonGroup} | ${{}}
+ `('$Name supports attaching a ref to the button group', function ({Component}) {
+ let ref = React.createRef();
+ let tree = renderComponent(Component, {ref});
+ let buttonGroup = tree.getByTestId(buttonGroupId);
+ expect(buttonGroup).toEqual(ref.current.UNSAFE_getDOMNode());
+ });
+
+ it.each`
+ Name | Component | props
+ ${'ButtonGroup'} | ${ButtonGroup} | ${{isDisabled: true}}
+ `('$Name supports disabling all buttons within via isDisabled', async function ({Component, props}) {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let tree = renderComponent(Component, props);
+ let buttonGroup = tree.getByTestId(buttonGroupId);
+ expect(buttonGroup).toBeTruthy();
+
+ let button1 = within(buttonGroup).getByText('Button1');
+ let button2 = within(buttonGroup).getByText('Button2');
+ let button3 = within(buttonGroup).getByText('Button3');
+
+ await user.click(button1);
+ await user.click(button2);
+ await user.click(button3);
+
+ expect(onPressSpy1).toHaveBeenCalledTimes(0);
+ expect(onPressSpy2).toHaveBeenCalledTimes(0);
+ expect(onPressSpy3).toHaveBeenCalledTimes(0);
+ });
+
+ // TODO: Retool this one to check for aria-orientation when ButtonGroup is finalized
+ it.each`
+ Name | Component | props
+ ${'ButtonGroup'} | ${ButtonGroup} | ${{orientation: 'vertical'}}
+ `('$Name supports vertical orientation', function ({Component, props}) {
+ let tree = renderComponent(Component, props);
+ let buttonGroup = tree.getByTestId(buttonGroupId);
+ expect(buttonGroup).toBeTruthy();
+ expect(buttonGroup).toHaveAttribute('class', expect.stringContaining('spectrum-ButtonGroup--vertical'));
+ });
+
+ describe('resizing', () => {
+ it('goes vertical if there is not enough room after buttongroup gets a new size', () => {
+ let setUp = ({buttonGroup, button1, button2, button3}) => {
+ jest.spyOn(buttonGroup, 'offsetWidth', 'get').mockImplementationOnce(() => 88).mockImplementation(() => 90);
+ jest.spyOn(button1, 'offsetLeft', 'get').mockImplementation(() => 0);
+ jest.spyOn(button1, 'offsetWidth', 'get').mockImplementation(() => 30);
+ jest.spyOn(button2, 'offsetLeft', 'get').mockImplementation(() => 30);
+ jest.spyOn(button2, 'offsetWidth', 'get').mockImplementation(() => 30);
+ jest.spyOn(button3, 'offsetLeft', 'get').mockImplementation(() => 60);
+ jest.spyOn(button3, 'offsetWidth', 'get').mockImplementation(() => 30);
+
+ };
+ let {getByTestId} = render( );
+ let buttonGroup = getByTestId(buttonGroupId);
+
+ // ResizeObserver not actually implemented in jsdom, so rely on the fallback to window resize listener
+ act(() => {window.dispatchEvent(new Event('resize'));});
+ expect(buttonGroup).toHaveAttribute('class', expect.stringContaining('spectrum-ButtonGroup--vertical'));
+
+ act(() => {window.dispatchEvent(new Event('resize'));});
+ expect(buttonGroup).not.toHaveAttribute('class', expect.stringContaining('spectrum-ButtonGroup--vertical'));
+ });
+ // can't test children being added because i don't have access to the ref in time
+ });
+
+// Test that it handles the useEffect wrapping?
+});
+
+function ButtonGroupWithRefs(props) {
+ let buttonGroup = useRef();
+ let button1 = useRef();
+ let button2 = useRef();
+ let button3 = useRef();
+ useEffect(() => {
+ props.setUp({
+ buttonGroup: buttonGroup.current.UNSAFE_getDOMNode(),
+ button1: button1.current.UNSAFE_getDOMNode(),
+ button2: button2.current.UNSAFE_getDOMNode(),
+ button3: button3.current.UNSAFE_getDOMNode()
+ });
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+ return (
+
+
+
+ Button1
+
+
+ Button2
+
+
+ Button3
+
+
+
+ );
+}
diff --git a/packages/@fds-design/calendar/README.md b/packages/@fds-design/calendar/README.md
new file mode 100644
index 0000000..a3e1ffe
--- /dev/null
+++ b/packages/@fds-design/calendar/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/calendar
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/calendar/chromatic-fc/Calendar.stories.tsx b/packages/@fds-design/calendar/chromatic-fc/Calendar.stories.tsx
new file mode 100644
index 0000000..4a254ab
--- /dev/null
+++ b/packages/@fds-design/calendar/chromatic-fc/Calendar.stories.tsx
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Disabled, DisabledInvalid, ErrorMessage, MinMax, Selected, Unavailable} from '../chromatic/Calendar.stories';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+export default {
+ title: 'Calendar'
+};
+
+export const All = () => (
+
+ Selected
+
+ Min Max
+
+ Disabled
+
+ Unavailable
+
+ Error Message
+
+ Disabled Invalid
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/calendar/chromatic-fc/CalendarCell.stories.tsx b/packages/@fds-design/calendar/chromatic-fc/CalendarCell.stories.tsx
new file mode 100644
index 0000000..9cc5311
--- /dev/null
+++ b/packages/@fds-design/calendar/chromatic-fc/CalendarCell.stories.tsx
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {AllStates} from '../chromatic/CalendarCell.stories';
+import {Flex} from '@react-spectrum/layout';
+import React from 'react';
+
+export default {
+ title: 'CalendarCell'
+};
+
+export const All = () => (
+
+ All States
+
+
+);
+All.story = {
+ name: 'all'
+};
diff --git a/packages/@fds-design/calendar/chromatic/Calendar.stories.tsx b/packages/@fds-design/calendar/chromatic/Calendar.stories.tsx
new file mode 100644
index 0000000..f29c990
--- /dev/null
+++ b/packages/@fds-design/calendar/chromatic/Calendar.stories.tsx
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Calendar} from '../';
+import {CalendarDate} from '@internationalized/date';
+import React from 'react';
+
+export default {
+ title: 'Calendar',
+ parameters: {
+ chromaticProvider: {
+ locales: ['en-US'/* , 'ar-EG', 'ja-JP' */]
+ }
+ }
+};
+
+const date = new CalendarDate(2022, 2, 3);
+
+export const Default = () => ;
+export const Selected = () => ;
+export const MinMax = () => (
+
+);
+export const Disabled = () => ;
+export const ReadOnly = () => ;
+export const Unavailable = () => (
+ date.day >= 10 && date.day <= 20} />
+);
+export const VisibleMonths2 = () => ;
+export const VisibleMonths3 = () => ;
+export const Invalid = () => ;
+export const ErrorMessage = () => ;
+export const UnavailableInvalid = () => d.compare(date) === 0} />;
+export const DisabledInvalid = () => ;
diff --git a/packages/@fds-design/calendar/chromatic/CalendarCell.stories.tsx b/packages/@fds-design/calendar/chromatic/CalendarCell.stories.tsx
new file mode 100644
index 0000000..5bf28ee
--- /dev/null
+++ b/packages/@fds-design/calendar/chromatic/CalendarCell.stories.tsx
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {classNames} from '@react-spectrum/utils';
+import {generatePowerset} from '@react-spectrum/story-utils';
+import {Grid, repeat} from '@react-spectrum/layout';
+import React from 'react';
+import styles from '@adobe/spectrum-css-temp/components/calendar/vars.css';
+import {useProvider} from '@react-spectrum/provider';
+
+export default {
+ title: 'CalendarCall',
+ excludeStories: ['AllStates']
+};
+
+let states = [
+ {isToday: true},
+ {isSelected: true},
+ {isFocused: true},
+ {isHovered: true},
+ {isPressed: true},
+ {isDisabled: true},
+ {isRangeSelection: true},
+ {isRangeStart: true},
+ {isRangeEnd: true},
+ {isSelectionStart: true},
+ {isSelectionEnd: true},
+ {isInvalid: true},
+ {isUnavailable: true}
+];
+
+export const LightMedium = () => ;
+LightMedium.parameters = {
+ chromaticProvider: {
+ locales: ['en-US'],
+ colorSchemes: ['light'],
+ scales: ['medium']
+ }
+};
+
+export const LightLarge = () => ;
+LightLarge.parameters = {
+ chromaticProvider: {
+ locales: ['en-US'],
+ colorSchemes: ['light'],
+ scales: ['large']
+ }
+};
+
+export const DarkMedium = () => ;
+DarkMedium.parameters = {
+ chromaticProvider: {
+ locales: ['en-US'],
+ colorSchemes: ['dark'],
+ scales: ['medium']
+ }
+};
+
+export const DarkLarge = () => ;
+DarkLarge.parameters = {
+ chromaticProvider: {
+ locales: ['en-US'],
+ colorSchemes: ['dark'],
+ scales: ['large']
+ }
+};
+
+export function AllStates() {
+ let {scale} = useProvider();
+ let size = scale === 'medium' ? 40 : 50;
+ return (
+
+ {generatePowerset(states, (merged) =>
+ (merged.isDisabled && (merged.isFocused || merged.isHovered || merged.isPressed || merged.isInvalid || merged.isSelected)) ||
+ (merged.isUnavailable && (merged.isHovered || merged.isPressed || merged.isDisabled)) ||
+ (merged.isSelected && merged.isUnavailable && !merged.isInvalid) ||
+ (!merged.isSelected && (merged.isRangeSelection || merged.isSelectionStart || merged.isSelectionEnd || merged.isRangeStart || merged.isRangeEnd || merged.isInvalid)) ||
+ ((merged.isRangeStart || merged.isRangeEnd) && !merged.isRangeSelection) ||
+ (merged.isRangeStart && merged.isRangeEnd) ||
+ (merged.isSelectionStart && !merged.isRangeStart) ||
+ (merged.isSelectionEnd && !merged.isRangeEnd)
+ ).map(props => (
+
+ {Object.keys(props).join('\n')}
+
+ |
+
+
+ ))}
+
+ );
+}
+
+// Fake cell for testing css
+function Cell({isToday, isSelected, isFocused, isHovered, isPressed, isDisabled, isRangeStart, isRangeEnd, isRangeSelection, isSelectionStart, isSelectionEnd, isInvalid, isUnavailable}) {
+ return (
+
+ 12
+
+ );
+}
diff --git a/packages/@fds-design/calendar/chromatic/RangeCalendar.stories.tsx b/packages/@fds-design/calendar/chromatic/RangeCalendar.stories.tsx
new file mode 100644
index 0000000..ea27789
--- /dev/null
+++ b/packages/@fds-design/calendar/chromatic/RangeCalendar.stories.tsx
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {CalendarDate, isWeekend} from '@internationalized/date';
+import {RangeCalendar} from '../';
+import React from 'react';
+import {useLocale} from '@react-aria/i18n';
+
+export default {
+ title: 'RangeCalendar',
+ parameters: {
+ chromaticProvider: {
+ locales: ['en-US'/* , 'ar-EG', 'ja-JP' */]
+ }
+ }
+};
+
+const value = {
+ start: new CalendarDate(2022, 2, 3),
+ end: new CalendarDate(2022, 2, 8)
+};
+
+export const Default = () => ;
+export const Selected = () => ;
+export const MinMax = () => (
+
+);
+export const Disabled = () => ;
+export const ReadOnly = () => ;
+export const Unavailable = () => (
+ date.day >= 10 && date.day <= 20} />
+);
+export const VisibleMonths2 = () => ;
+export const VisibleMonths3 = () => ;
+export const Invalid = () => ;
+export const ErrorMessage = () => ;
+export const UnavailableInvalid = () => date.day >= 1 && date.day <= 5} />;
+export const DisabledInvalid = () => ;
+export const NonContiguous = () => {
+ let {locale} = useLocale();
+ return (
+ isWeekend(date, locale)}
+ allowsNonContiguousRanges />
+ );
+};
+
+export const NonContiguousInvalid = () => {
+ let {locale} = useLocale();
+ return (
+ isWeekend(date, locale)}
+ allowsNonContiguousRanges />
+ );
+};
+
diff --git a/packages/@fds-design/calendar/docs/Calendar.mdx b/packages/@fds-design/calendar/docs/Calendar.mdx
new file mode 100644
index 0000000..97fc6f8
--- /dev/null
+++ b/packages/@fds-design/calendar/docs/Calendar.mdx
@@ -0,0 +1,222 @@
+{/* Copyright 2022 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/calendar';
+import i18nDocs from 'docs:@internationalized/date';
+import {HeaderInfo, PropTable, PageDescription, TypeLink} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/calendar/package.json';
+
+```jsx import
+import {Calendar} from '@react-spectrum/calendar';
+import {Flex} from '@react-spectrum/layout';
+import {ActionButton} from '@adobe/react-spectrum';
+```
+
+---
+category: Date and Time
+keywords: [date]
+---
+
+# Calendar
+
+{docs.exports.Calendar.description}
+
+
+
+## Example
+
+```tsx example
+
+```
+
+## Value
+
+A `Calendar` has no selection by default. An initial, uncontrolled value can be provided to the `Calendar` using the `defaultValue` prop. Alternatively, a controlled value can be provided using the `value` prop.
+
+Date values are provided using objects in the [@internationalized/date](../internationalized/date/) package. This library handles correct international date manipulation across calendars, time zones, and other localization concerns.
+
+`Calendar` supports values with both date and time components, but only allows users to modify the date. By default, `Calendar` will emit objects in the `onChange` event, but if a or object is passed as the `value` or `defaultValue`, values of that type will be emitted, changing only the date and preserving the time components.
+
+```tsx example
+import {parseDate} from '@internationalized/date';
+
+function Example() {
+ let [value, setValue] = React.useState(parseDate('2020-02-03'));
+
+ return (
+
+
+
+
+ );
+}
+```
+
+### International calendars
+
+`Calendar` supports selecting dates in many calendar systems used around the world, including Gregorian, Hebrew, Indian, Islamic, Buddhist, and more. Dates are automatically displayed in the appropriate calendar system for the user's locale. The calendar system can be overridden using the [Unicode calendar locale extension](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#adding_a_calendar_in_the_locale_string), passed to the `Provider` component.
+
+Selected dates passed to `onChange` always use the same calendar system as the `value` or `defaultValue` prop. If no `value` or `defaultValue` is provided, then dates passed to `onChange` are always in the Gregorian calendar since this is the most commonly used. This means that even though the user selects dates in their local calendar system, applications are able to deal with dates from all users consistently.
+
+The below example displays a `Calendar` in the Hindi language, using the Indian calendar. Dates emitted from `onChange` are in the Gregorian calendar.
+
+```tsx example
+import {Provider} from '@adobe/react-spectrum';
+
+function Example() {
+ let [date, setDate] = React.useState(null);
+ return (
+
+
+ Selected date: {date?.toString()}
+
+ );
+}
+```
+
+## Labeling
+
+An aria-label must be provided to the `Calendar` for accessibility. If it is labeled by a separate element, an `aria-labelledby` prop must be provided using the `id` of the labeling element instead.
+
+### Internationalization
+
+In order to internationalize a `Calendar`, a localized string should be passed to the `aria-label` prop. For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the `Calendar` is automatically flipped. Dates are automatically formatted using the current locale.
+
+## Events
+
+`Calendar` accepts an `onChange` prop which is triggered whenever a date is selected by the user. The example below uses `onChange` to update a separate element with a formatted version of the date in the user's locale. This is done by converting the date to a native JavaScript `Date` object to pass to the formatter.
+
+```tsx example
+import {getLocalTimeZone} from '@internationalized/date';
+import {useDateFormatter} from '@adobe/react-spectrum';
+
+function Example() {
+ let [date, setDate] = React.useState(parseDate('2022-07-04'));
+ let formatter = useDateFormatter({dateStyle: 'full'});
+
+ return (
+ <>
+
+ Selected date: {formatter.format(date.toDate(getLocalTimeZone()))}
+ >
+ );
+}
+```
+
+## Validation
+
+By default, `Calendar` allows selecting any date. The `minValue` and `maxValue` props can also be used to prevent the user from selecting dates outside a certain range.
+
+This example only accepts dates after today.
+
+```tsx example
+import {today} from '@internationalized/date';
+
+
+```
+
+### Unavailable dates
+
+`Calendar` supports marking certain dates as _unavailable_. These dates cannot be selected by the user and are displayed with a crossed out appearance. The `isDateUnavailable` prop accepts a callback that is called to evaluate whether each visible date is unavailable.
+
+This example includes multiple unavailable date ranges, e.g. dates when no appointments are available. In addition, all weekends are unavailable. The `minValue` prop is also used to prevent selecting dates before today.
+
+
+```tsx example
+import {today, isWeekend} from '@internationalized/date';
+import {useLocale} from '@adobe/react-spectrum';
+
+function Example() {
+ let now = today(getLocalTimeZone());
+ let disabledRanges = [
+ [now, now.add({days: 5})],
+ [now.add({days: 14}), now.add({days: 16})],
+ [now.add({days: 23}), now.add({days: 24})],
+ ];
+
+ let {locale} = useLocale();
+ let isDateUnavailable = (date) => isWeekend(date, locale) || disabledRanges.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+
+ return
+}
+```
+
+## Controlling the focused date
+
+By default, the selected date is focused when a `Calendar` first mounts. If no `value` or `defaultValue` prop is provided, then the current date is focused. However, `Calendar` supports controlling which date is focused using the `focusedValue` and `onFocusChange` props. This also determines which month is visible. The `defaultFocusedValue` prop allows setting the initial focused date when the `Calendar` first mounts, without controlling it.
+
+This example focuses July 1, 2021 by default. The user may change the focused date, and the `onFocusChange` event updates the state. Clicking the button resets the focused date back to the initial value.
+
+```tsx example
+import {CalendarDate} from '@internationalized/date';
+
+function Example() {
+ let defaultDate = new CalendarDate(2021, 7, 1);
+ let [focusedDate, setFocusedDate] = React.useState(defaultDate);
+
+ return (
+
+ setFocusedDate(defaultDate)}>Reset focused date
+
+
+ );
+}
+```
+
+## Props
+
+
+
+## Visual options
+
+### Disabled
+
+```tsx example
+
+```
+
+### Read only
+
+The `isReadOnly` boolean prop makes the Calendar's value immutable. Unlike `isDisabled`, the Calendar remains focusable.
+
+```tsx example
+
+```
+
+### Visible months
+
+By default, the `Calendar` displays a single month. The `visibleMonths` prop allows displaying up to 3 months at a time.
+
+```tsx example
+
+
+
+```
+
+### Page behavior
+
+By default, when pressing the next or previous buttons, pagination will advance by the `visibleMonths` value. This behavior can be changed to page by single months instead, by setting `pageBehavior` to `single`.
+
+```tsx example
+
+
+
+```
diff --git a/packages/@fds-design/calendar/docs/RangeCalendar.mdx b/packages/@fds-design/calendar/docs/RangeCalendar.mdx
new file mode 100644
index 0000000..2ad4e62
--- /dev/null
+++ b/packages/@fds-design/calendar/docs/RangeCalendar.mdx
@@ -0,0 +1,254 @@
+{/* Copyright 2022 Adobe. All rights reserved.
+This file is licensed to you under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License. You may obtain a copy
+of the License at http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under
+the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '@react-spectrum/docs';
+export default Layout;
+
+import docs from 'docs:@react-spectrum/calendar';
+import i18nDocs from 'docs:@internationalized/date';
+import {HeaderInfo, PropTable, PageDescription, TypeLink} from '@react-spectrum/docs';
+import packageData from '@react-spectrum/calendar/package.json';
+
+```jsx import
+import {RangeCalendar} from '@react-spectrum/calendar';
+import {Flex} from '@react-spectrum/layout';
+import {ActionButton} from '@adobe/react-spectrum';
+```
+
+---
+category: Date and Time
+keywords: [date]
+---
+
+# RangeCalendar
+
+{docs.exports.RangeCalendar.description}
+
+
+
+## Example
+
+```tsx example
+
+```
+
+## Value
+
+A `RangeCalendar` has no selection by default. An initial, uncontrolled value can be provided to the `RangeCalendar` using the `defaultValue` prop. Alternatively, a controlled value can be provided using the `value` prop.
+
+Date ranges are objects with `start` and `end` properties containing date values, which are provided using objects in the [@internationalized/date](../internationalized/date/) package. This library handles correct international date manipulation across calendars, time zones, and other localization concerns.
+
+`RangeCalendar` supports values with both date and time components, but only allows users to modify the dates. By default, `RangeCalendar` will emit objects in the `onChange` event, but if a or object is passed as the `value` or `defaultValue`, values of that type will be emitted, changing only the date and preserving the time components.
+
+```tsx example
+import {parseDate} from '@internationalized/date';
+
+function Example() {
+ let [value, setValue] = React.useState({
+ start: parseDate('2020-02-03'),
+ end: parseDate('2020-02-12')
+ });
+
+ return (
+
+
+
+
+ );
+}
+```
+
+### International calendars
+
+`RangeCalendar` supports selecting dates in many calendar systems used around the world, including Gregorian, Hebrew, Indian, Islamic, Buddhist, and more. Dates are automatically displayed in the appropriate calendar system for the user's locale. The calendar system can be overridden using the [Unicode calendar locale extension](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#adding_a_calendar_in_the_locale_string), passed to the `Provider` component.
+
+Selected dates passed to `onChange` always use the same calendar system as the `value` or `defaultValue` prop. If no `value` or `defaultValue` is provided, then dates passed to `onChange` are always in the Gregorian calendar since this is the most commonly used. This means that even though the user selects dates in their local calendar system, applications are able to deal with dates from all users consistently.
+
+The below example displays a `RangeCalendar` in the Hindi language, using the Indian calendar. Dates emitted from `onChange` are in the Gregorian calendar.
+
+```tsx example
+import {Provider} from '@adobe/react-spectrum';
+
+function Example() {
+ let [range, setRange] = React.useState(null);
+ return (
+
+
+ Start date: {range?.start.toString()}
+ End date: {range?.end.toString()}
+
+ );
+}
+```
+
+## Labeling
+
+An aria-label must be provided to the `RangeCalendar` for accessibility. If it is labeled by a separate element, an `aria-labelledby` prop must be provided using the `id` of the labeling element instead.
+
+### Internationalization
+
+In order to internationalize a `RangeCalendar`, a localized string should be passed to the `aria-label` prop. For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the `RangeCalendar` is automatically flipped. Dates are automatically formatted using the current locale.
+
+## Events
+
+`RangeCalendar` accepts an `onChange` prop which is triggered whenever a date is selected by the user. The example below uses `onChange` to update a separate element with a formatted version of the date in the user's locale. This is done by converting the date to a native JavaScript `Date` object to pass to the formatter.
+
+```tsx example
+import {getLocalTimeZone} from '@internationalized/date';
+import {useDateFormatter} from '@adobe/react-spectrum';
+
+function Example() {
+ let [range, setRange] = React.useState({
+ start: parseDate('2020-07-03'),
+ end: parseDate('2020-07-10')
+ });
+ let formatter = useDateFormatter({dateStyle: 'long'});
+
+ return (
+ <>
+
+
+ Selected date:{' '}
+ {formatter.formatRange(
+ range.start.toDate(getLocalTimeZone()),
+ range.end.toDate(getLocalTimeZone())
+ )}
+
+ >
+ );
+}
+```
+
+## Validation
+
+By default, `RangeCalendar` allows selecting any date range. The `minValue` and `maxValue` props can also be used to prevent the user from selecting dates outside a certain range.
+
+This example only accepts dates after today.
+
+```tsx example
+import {today} from '@internationalized/date';
+
+
+```
+
+### Unavailable dates
+
+`RangeCalendar` supports marking certain dates as _unavailable_. These dates cannot be selected by the user and are displayed with a crossed out appearance. The `isDateUnavailable` prop accepts a callback that is called to evaluate whether each visible date is unavailable.
+
+Note that by default, users may not select non-contiguous ranges, i.e. ranges that contain unavailable dates within them. Once a start date is selected, enabled dates will be restricted to subsequent dates until an unavailable date is hit. See [below](#non-contiguous-ranges) for an example of how to allow non-contiguous ranges.
+
+This example includes multiple unavailable date ranges, e.g. dates when a rental house is not available. The `minValue` prop is also used to prevent selecting dates before today.
+
+```tsx example
+import {today} from '@internationalized/date';
+
+function Example() {
+ let now = today(getLocalTimeZone());
+ let disabledRanges = [
+ [now, now.add({days: 5})],
+ [now.add({days: 14}), now.add({days: 16})],
+ [now.add({days: 23}), now.add({days: 24})],
+ ];
+
+ let isDateUnavailable = (date) => disabledRanges.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+
+ return
+}
+```
+
+### Non-contiguous ranges
+
+The `allowsNonContiguousRanges` prop enables a range to be selected even if there are unavailable dates in the middle. The value emitted in the `onChange` event will still be a single range with a `start` and `end` property, but unavailable dates will not be displayed as selected. It is up to applications to split the full selected range into multiple as needed for business logic.
+
+This example prevents selecting weekends, but allows selecting ranges that span multiple weeks.
+
+```tsx example
+import {isWeekend} from '@internationalized/date';
+import {useLocale} from '@adobe/react-spectrum';
+
+function Example() {
+ let {locale} = useLocale();
+
+ return isWeekend(date, locale)} allowsNonContiguousRanges />
+}
+```
+
+## Controlling the focused date
+
+By default, the first selected date is focused when a `RangeCalendar` first mounts. If no `value` or `defaultValue` prop is provided, then the current date is focused. However, `RangeCalendar` supports controlling which date is focused using the `focusedValue` and `onFocusChange` props. This also determines which month is visible. The `defaultFocusedValue` prop allows setting the initial focused date when the `RangeCalendar` first mounts, without controlling it.
+
+This example focuses July 1, 2021 by default. The user may change the focused date, and the `onFocusChange` event updates the state. Clicking the button resets the focused date back to the initial value.
+
+```tsx example
+import {CalendarDate} from '@internationalized/date';
+
+function Example() {
+ let defaultDate = new CalendarDate(2021, 7, 1);
+ let [focusedDate, setFocusedDate] = React.useState(defaultDate);
+
+ return (
+
+ setFocusedDate(defaultDate)}>Reset focused date
+
+
+ );
+}
+```
+
+## Props
+
+
+
+## Visual options
+
+### Disabled
+
+```tsx example
+
+```
+
+### Read only
+
+The `isReadOnly` boolean prop makes the RangeCalendar's value immutable. Unlike `isDisabled`, the RangeCalendar remains focusable.
+
+```tsx example
+
+```
+
+### Visible months
+
+By default, a `RangeCalendar` displays a single month. The `visibleMonths` prop allows displaying up to 3 months at a time.
+
+```tsx example
+
+
+
+```
+
+### Page behavior
+
+By default, when pressing the next or previous buttons, pagination will advance by the `visibleMonths` value. This behavior can be changed to page by single months instead, by setting `pageBehavior` to `single`.
+
+```tsx example
+
+
+
+```
diff --git a/packages/@fds-design/calendar/index.ts b/packages/@fds-design/calendar/index.ts
new file mode 100644
index 0000000..1210ae1
--- /dev/null
+++ b/packages/@fds-design/calendar/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/calendar/intl/ar-AE.json b/packages/@fds-design/calendar/intl/ar-AE.json
new file mode 100644
index 0000000..7a1ed92
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/ar-AE.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {التاريخ} other {التواريخ}} المحدد/المحددة غير متوفرة."
+}
diff --git a/packages/@fds-design/calendar/intl/bg-BG.json b/packages/@fds-design/calendar/intl/bg-BG.json
new file mode 100644
index 0000000..32d75be
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/bg-BG.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Избраната дата не е налична} other {Избраните дати не са налични}}."
+}
diff --git a/packages/@fds-design/calendar/intl/cs-CZ.json b/packages/@fds-design/calendar/intl/cs-CZ.json
new file mode 100644
index 0000000..6c5c786
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/cs-CZ.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Vybrané datum není} other {Vybraná data nejsou}} k dispozici."
+}
diff --git a/packages/@fds-design/calendar/intl/da-DK.json b/packages/@fds-design/calendar/intl/da-DK.json
new file mode 100644
index 0000000..a0bf126
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/da-DK.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Valgte {selectedCount, plural, one {dato} other {datoer}} ikke ledige."
+}
diff --git a/packages/@fds-design/calendar/intl/de-DE.json b/packages/@fds-design/calendar/intl/de-DE.json
new file mode 100644
index 0000000..a851aa4
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/de-DE.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Ausgewählte(s) {selectedCount, plural, one {Datum} other {Daten}} nicht verfügbar."
+}
diff --git a/packages/@fds-design/calendar/intl/el-GR.json b/packages/@fds-design/calendar/intl/el-GR.json
new file mode 100644
index 0000000..8d0da49
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/el-GR.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Η επιλεγμένη ημερομηνία δεν είναι διαθέσιμη} other {Οι επιλεγμένες ημερομηνίες δεν είναι διαθέσιμες}}."
+}
diff --git a/packages/@fds-design/calendar/intl/en-US.json b/packages/@fds-design/calendar/intl/en-US.json
new file mode 100644
index 0000000..afa5ea7
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/en-US.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Selected {selectedCount, plural, one {date} other {dates}} unavailable."
+}
diff --git a/packages/@fds-design/calendar/intl/es-ES.json b/packages/@fds-design/calendar/intl/es-ES.json
new file mode 100644
index 0000000..7fa5142
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/es-ES.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {La fecha seleccionada no está disponible} other {Las fechas seleccionadas no están disponibles}}."
+}
diff --git a/packages/@fds-design/calendar/intl/et-EE.json b/packages/@fds-design/calendar/intl/et-EE.json
new file mode 100644
index 0000000..e206f1d
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/et-EE.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Valitud {selectedCount, plural, one {kuupäev} other {kuupäevad}} pole saadaval."
+}
diff --git a/packages/@fds-design/calendar/intl/fi-FI.json b/packages/@fds-design/calendar/intl/fi-FI.json
new file mode 100644
index 0000000..d6aa734
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/fi-FI.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Valittu päivämäärä ei ole} other {Valitut päivämäärät eivät ole}} saatavilla."
+}
diff --git a/packages/@fds-design/calendar/intl/fr-FR.json b/packages/@fds-design/calendar/intl/fr-FR.json
new file mode 100644
index 0000000..69ebec8
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/fr-FR.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {La date sélectionnée est indisponible} other {Les dates sélectionnées sont indisponibles}}."
+}
diff --git a/packages/@fds-design/calendar/intl/he-IL.json b/packages/@fds-design/calendar/intl/he-IL.json
new file mode 100644
index 0000000..31103cf
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/he-IL.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "נבחר {selectedCount, plural, one {תאריך} other {תאריכים}} אינו זמין."
+}
diff --git a/packages/@fds-design/calendar/intl/hr-HR.json b/packages/@fds-design/calendar/intl/hr-HR.json
new file mode 100644
index 0000000..408566b
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/hr-HR.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Odabrani datum nije dostupan} other {Odabrani datumi nisu dostupni}}."
+}
diff --git a/packages/@fds-design/calendar/intl/hu-HU.json b/packages/@fds-design/calendar/intl/hu-HU.json
new file mode 100644
index 0000000..6a28eef
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/hu-HU.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "A kijelölt {selectedCount, plural, one {dátum nem érhető el} other {dátumok nem érhetőek el}}."
+}
diff --git a/packages/@fds-design/calendar/intl/it-IT.json b/packages/@fds-design/calendar/intl/it-IT.json
new file mode 100644
index 0000000..0f784d1
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/it-IT.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Data selezionata non disponibile} other {Date selezionate non disponibili}}."
+}
diff --git a/packages/@fds-design/calendar/intl/ja-JP.json b/packages/@fds-design/calendar/intl/ja-JP.json
new file mode 100644
index 0000000..cc8747f
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/ja-JP.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "選択した{selectedCount, plural, one {日付} other {日付}}は使用できません。"
+}
diff --git a/packages/@fds-design/calendar/intl/ko-KR.json b/packages/@fds-design/calendar/intl/ko-KR.json
new file mode 100644
index 0000000..68a57ee
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/ko-KR.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "선택한 {selectedCount, plural, one {일자를} other {일자를}} 사용할 수 없습니다."
+}
diff --git a/packages/@fds-design/calendar/intl/lt-LT.json b/packages/@fds-design/calendar/intl/lt-LT.json
new file mode 100644
index 0000000..75247ac
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/lt-LT.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Datos} other {Datų}} pasirinkimas negalimas."
+}
diff --git a/packages/@fds-design/calendar/intl/lv-LV.json b/packages/@fds-design/calendar/intl/lv-LV.json
new file mode 100644
index 0000000..40222d7
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/lv-LV.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Atlasītais(-ie) {selectedCount, plural, one {date} other {dates}} nav pieejams(-i)."
+}
diff --git a/packages/@fds-design/calendar/intl/nb-NO.json b/packages/@fds-design/calendar/intl/nb-NO.json
new file mode 100644
index 0000000..ef61a98
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/nb-NO.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Valgt(e) {selectedCount, plural, one {dato} other {datoer}} er utilgjengelig."
+}
diff --git a/packages/@fds-design/calendar/intl/nl-NL.json b/packages/@fds-design/calendar/intl/nl-NL.json
new file mode 100644
index 0000000..4b4b6c6
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/nl-NL.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Geselecteerde {selectedCount, plural, one {datum} other {datums}} niet beschikbaar."
+}
diff --git a/packages/@fds-design/calendar/intl/pl-PL.json b/packages/@fds-design/calendar/intl/pl-PL.json
new file mode 100644
index 0000000..2a7f937
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/pl-PL.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Wybrana data jest niedostępna} other {Wybrane daty są niedostępne}}."
+}
diff --git a/packages/@fds-design/calendar/intl/pt-BR.json b/packages/@fds-design/calendar/intl/pt-BR.json
new file mode 100644
index 0000000..c791afa
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/pt-BR.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Data} other {Datas}} selecionada(s) indisponível(is)."
+}
diff --git a/packages/@fds-design/calendar/intl/pt-PT.json b/packages/@fds-design/calendar/intl/pt-PT.json
new file mode 100644
index 0000000..2847cf9
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/pt-PT.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "A(s) {selectedCount, plural, one {data} other {datas}} selecionada(s) não está(ão) disponível/disponível(eis)."
+}
diff --git a/packages/@fds-design/calendar/intl/ro-RO.json b/packages/@fds-design/calendar/intl/ro-RO.json
new file mode 100644
index 0000000..4243a8d
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/ro-RO.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Data selectată nu este disponibilă} other {Datele selectate nu sunt disponibile}}."
+}
diff --git a/packages/@fds-design/calendar/intl/ru-RU.json b/packages/@fds-design/calendar/intl/ru-RU.json
new file mode 100644
index 0000000..75b4903
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/ru-RU.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Выбранные {selectedCount, plural, one {дата} other {даты}} недоступны."
+}
diff --git a/packages/@fds-design/calendar/intl/sk-SK.json b/packages/@fds-design/calendar/intl/sk-SK.json
new file mode 100644
index 0000000..8363a1d
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/sk-SK.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Vybratý dátum} other {Vybraté dátumy}}: nedostupné."
+}
diff --git a/packages/@fds-design/calendar/intl/sl-SI.json b/packages/@fds-design/calendar/intl/sl-SI.json
new file mode 100644
index 0000000..de22866
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/sl-SI.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Izbrano {selectedCount, plural, one {date} other {dates}} ni na voljo."
+}
diff --git a/packages/@fds-design/calendar/intl/sr-SP.json b/packages/@fds-design/calendar/intl/sr-SP.json
new file mode 100644
index 0000000..db94b40
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/sr-SP.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Izabrani {selectedCount, plural, one {date} other {dates}} nije dostupan."
+}
diff --git a/packages/@fds-design/calendar/intl/sv-SE.json b/packages/@fds-design/calendar/intl/sv-SE.json
new file mode 100644
index 0000000..c0734d8
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/sv-SE.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Valt datum är inte tillgängligt.} other {Valda datum är inte tillgängliga.}}"
+}
diff --git a/packages/@fds-design/calendar/intl/tr-TR.json b/packages/@fds-design/calendar/intl/tr-TR.json
new file mode 100644
index 0000000..d48936d
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/tr-TR.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "Seçilen {selectedCount, plural, one {tarih} other {tarihler}} müsait değil."
+}
diff --git a/packages/@fds-design/calendar/intl/uk-UA.json b/packages/@fds-design/calendar/intl/uk-UA.json
new file mode 100644
index 0000000..21cc7ee
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/uk-UA.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "{selectedCount, plural, one {Вибрана дата недоступна} other {Вибрані дати недоступні}}."
+}
diff --git a/packages/@fds-design/calendar/intl/zh-CN.json b/packages/@fds-design/calendar/intl/zh-CN.json
new file mode 100644
index 0000000..06369c6
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/zh-CN.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "选定的 {selectedCount, plural, one {个日期} other {个日期}} 不可用。"
+}
diff --git a/packages/@fds-design/calendar/intl/zh-TW.json b/packages/@fds-design/calendar/intl/zh-TW.json
new file mode 100644
index 0000000..192e8f6
--- /dev/null
+++ b/packages/@fds-design/calendar/intl/zh-TW.json
@@ -0,0 +1,3 @@
+{
+ "invalidSelection": "所選的{selectedCount, plural, one {日期} other {日期}}無法使用。"
+}
diff --git a/packages/@fds-design/calendar/package.json b/packages/@fds-design/calendar/package.json
new file mode 100644
index 0000000..299814f
--- /dev/null
+++ b/packages/@fds-design/calendar/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "@fds-design/calendar",
+ "version": "3.5.0",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@internationalized/date": "^3.6.0",
+ "@react-aria/calendar": "^3.6.0",
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/visually-hidden": "^3.8.18",
+ "@react-spectrum/button": "file:../../button",
+ "@react-spectrum/label": "file:../../label",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/calendar": "^3.6.0",
+ "@react-types/button": "^3.10.1",
+ "@react-types/calendar": "^3.5.0",
+ "@react-types/shared": "^3.26.0",
+ "@spectrum-icons/ui": "^3.6.11",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1",
+ "@react-spectrum/test-utils-internal": "file:../../test-utils-internal"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/calendar/src/Calendar.tsx b/packages/@fds-design/calendar/src/Calendar.tsx
new file mode 100644
index 0000000..cc161bb
--- /dev/null
+++ b/packages/@fds-design/calendar/src/Calendar.tsx
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {CalendarBase} from './CalendarBase';
+import {createCalendar} from '@internationalized/date';
+import {createDOMRef} from '../../utils';
+import {DateValue, SpectrumCalendarProps} from '@react-types/calendar';
+import {FocusableRef} from '@react-types/shared';
+import React, {ReactElement, useImperativeHandle, useMemo, useRef} from 'react';
+import {useCalendar} from '@react-aria/calendar';
+import {useCalendarState} from '@react-stately/calendar';
+import {useLocale} from '@react-aria/i18n';
+import {useProviderProps} from '../../provider';
+
+/**
+ * Calendars display a grid of days in one or more months and allow users to select a single date.
+ */
+export const Calendar = React.forwardRef(function Calendar(props: SpectrumCalendarProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ let {visibleMonths = 1} = props;
+ visibleMonths = Math.max(visibleMonths, 1);
+ let visibleDuration = useMemo(() => ({months: visibleMonths}), [visibleMonths]);
+ let {locale} = useLocale();
+ let state = useCalendarState({
+ ...props,
+ locale,
+ visibleDuration,
+ createCalendar
+ });
+
+ let domRef = useRef(null);
+ useImperativeHandle(ref, () => ({
+ ...createDOMRef(domRef),
+ focus() {
+ state.setFocused(true);
+ }
+ }));
+
+ let {calendarProps, prevButtonProps, nextButtonProps, errorMessageProps} = useCalendar(props, state);
+
+ return (
+
+ );
+}) as (props: SpectrumCalendarProps & {ref?: FocusableRef}) => ReactElement;
diff --git a/packages/@fds-design/calendar/src/CalendarBase.tsx b/packages/@fds-design/calendar/src/CalendarBase.tsx
new file mode 100644
index 0000000..c145157
--- /dev/null
+++ b/packages/@fds-design/calendar/src/CalendarBase.tsx
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {ActionButton} from '../../button';
+import {AriaButtonProps} from '@react-types/button';
+import {CalendarMonth} from './CalendarMonth';
+import {CalendarPropsBase} from '@react-types/calendar';
+import {CalendarState, RangeCalendarState} from '@react-stately/calendar';
+import ChevronLeft from '@spectrum-icons/ui/ChevronLeftLarge';
+import ChevronRight from '@spectrum-icons/ui/ChevronRightLarge';
+import {classNames, useStyleProps} from '../../utils';
+import {DOMProps, RefObject, StyleProps} from '@react-types/shared';
+import {HelpText} from '../../label';
+// @ts-ignore
+import intlMessages from '../intl/*.json';
+import React, {HTMLAttributes, JSX} from 'react';
+import styles from '@adobe/spectrum-css-temp/components/calendar/vars.css';
+import {useDateFormatter, useLocale, useLocalizedStringFormatter} from '@react-aria/i18n';
+import {VisuallyHidden} from '@react-aria/visually-hidden';
+
+interface CalendarBaseProps extends CalendarPropsBase, DOMProps, StyleProps {
+ state: T,
+ visibleMonths?: number,
+ calendarProps: HTMLAttributes,
+ nextButtonProps: AriaButtonProps,
+ prevButtonProps: AriaButtonProps,
+ errorMessageProps: HTMLAttributes,
+ calendarRef: RefObject
+}
+
+export function CalendarBase(props: CalendarBaseProps) {
+ let {
+ state,
+ calendarProps,
+ nextButtonProps,
+ prevButtonProps,
+ errorMessageProps,
+ calendarRef: ref,
+ visibleMonths = 1
+ } = props;
+ let {styleProps} = useStyleProps(props);
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../calendar');
+ let {direction} = useLocale();
+ let currentMonth = state.visibleRange.start;
+ let monthDateFormatter = useDateFormatter({
+ month: 'long',
+ year: 'numeric',
+ era: currentMonth.calendar.identifier === 'gregory' && currentMonth.era === 'BC' ? 'short' : undefined,
+ calendar: currentMonth.calendar.identifier,
+ timeZone: state.timeZone
+ });
+
+ let titles: JSX.Element[] = [];
+ let calendars: JSX.Element[] = [];
+ for (let i = 0; i < visibleMonths; i++) {
+ let d = currentMonth.add({months: i});
+ titles.push(
+
+ {i === 0 &&
+
+ {direction === 'rtl' ? : }
+
+ }
+
+ {monthDateFormatter.format(d.toDate(state.timeZone))}
+
+ {i === visibleMonths - 1 &&
+
+ {direction === 'rtl' ? : }
+
+ }
+
+ );
+
+ calendars.push(
+
+ );
+ }
+
+ return (
+
+ {/* Add a screen reader only description of the entire visible range rather than
+ * a separate heading above each month grid. This is placed first in the DOM order
+ * so that it is the first thing a touch screen reader user encounters.
+ * In addition, VoiceOver on iOS does not announce the aria-label of the grid
+ * elements, so the aria-label of the Calendar is included here as well. */}
+
+ {calendarProps['aria-label']}
+
+
+ {titles}
+
+
+ {calendars}
+
+ {/* For touch screen readers, add a visually hidden next button after the month grid
+ * so it's easy to navigate after reaching the end without going all the way
+ * back to the start of the month. */}
+
+ state.focusNextPage()}
+ tabIndex={-1} />
+
+ {state.isValueInvalid &&
+
+ }
+
+ );
+}
diff --git a/packages/@fds-design/calendar/src/CalendarCell.tsx b/packages/@fds-design/calendar/src/CalendarCell.tsx
new file mode 100644
index 0000000..555c8c7
--- /dev/null
+++ b/packages/@fds-design/calendar/src/CalendarCell.tsx
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {AriaCalendarCellProps, useCalendarCell} from '@react-aria/calendar';
+import {CalendarDate, getDayOfWeek, isSameDay, isSameMonth, isToday} from '@internationalized/date';
+import {CalendarState, RangeCalendarState} from '@react-stately/calendar';
+import {classNames} from '../../utils';
+import {mergeProps} from '@react-aria/utils';
+import React, {useRef} from 'react';
+import styles from '@adobe/spectrum-css-temp/components/calendar/vars.css';
+import {useFocusRing} from '@react-aria/focus';
+import {useHover} from '@react-aria/interactions';
+import {useLocale} from '@react-aria/i18n';
+
+interface CalendarCellProps extends AriaCalendarCellProps {
+ state: CalendarState | RangeCalendarState,
+ currentMonth: CalendarDate
+}
+
+export function CalendarCell({state, currentMonth, ...props}: CalendarCellProps) {
+ let ref = useRef(null);
+ let {
+ cellProps,
+ buttonProps,
+ isPressed,
+ isSelected,
+ isDisabled,
+ isFocused,
+ isInvalid,
+ formattedDate
+ } = useCalendarCell({
+ ...props,
+ isDisabled: !isSameMonth(props.date, currentMonth)
+ }, state, ref);
+ let isUnavailable = state.isCellUnavailable(props.date) && !isDisabled;
+ let isLastSelectedBeforeDisabled = !isDisabled && !isInvalid && state.isCellUnavailable(props.date.add({days: 1}));
+ let isFirstSelectedAfterDisabled = !isDisabled && !isInvalid && state.isCellUnavailable(props.date.subtract({days: 1}));
+ let highlightedRange = 'highlightedRange' in state && state.highlightedRange;
+ let isSelectionStart = isSelected && highlightedRange && isSameDay(props.date, highlightedRange.start);
+ let isSelectionEnd = isSelected && highlightedRange && isSameDay(props.date, highlightedRange.end);
+ let {locale} = useLocale();
+ let dayOfWeek = getDayOfWeek(props.date, locale);
+ let isRangeStart = isSelected && (isFirstSelectedAfterDisabled || dayOfWeek === 0 || props.date.day === 1);
+ let isRangeEnd = isSelected && (isLastSelectedBeforeDisabled || dayOfWeek === 6 || props.date.day === currentMonth.calendar.getDaysInMonth(currentMonth));
+ let {focusProps, isFocusVisible} = useFocusRing();
+ let {hoverProps, isHovered} = useHover({isDisabled: isDisabled || isUnavailable || state.isReadOnly});
+
+ return (
+
+
+
+ {formattedDate}
+
+
+
+ );
+}
diff --git a/packages/@fds-design/calendar/src/CalendarMonth.tsx b/packages/@fds-design/calendar/src/CalendarMonth.tsx
new file mode 100644
index 0000000..a37c5ac
--- /dev/null
+++ b/packages/@fds-design/calendar/src/CalendarMonth.tsx
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {CalendarCell} from './CalendarCell';
+import {CalendarDate, endOfMonth, getWeeksInMonth} from '@internationalized/date';
+import {CalendarPropsBase} from '@react-types/calendar';
+import {CalendarState, RangeCalendarState} from '@react-stately/calendar';
+import {classNames} from '../../utils';
+import {DOMProps, StyleProps} from '@react-types/shared';
+import React from 'react';
+import styles from '@adobe/spectrum-css-temp/components/calendar/vars.css';
+import {useCalendarGrid} from '@react-aria/calendar';
+import {useLocale} from '@react-aria/i18n';
+
+interface CalendarMonthProps extends CalendarPropsBase, DOMProps, StyleProps {
+ state: CalendarState | RangeCalendarState,
+ startDate: CalendarDate
+}
+
+export function CalendarMonth(props: CalendarMonthProps) {
+ let {
+ state,
+ startDate
+ } = props;
+ let {
+ gridProps,
+ headerProps,
+ weekDays
+ } = useCalendarGrid({
+ ...props,
+ endDate: endOfMonth(startDate)
+ }, state);
+
+ let {locale} = useLocale();
+ let weeksInMonth = getWeeksInMonth(startDate, locale);
+
+ return (
+
+
+
+ {weekDays.map((day, index) => (
+
+
+ {day}
+
+
+ ))}
+
+
+
+ {[...new Array(weeksInMonth).keys()].map(weekIndex => (
+
+ {state.getDatesInWeek(weekIndex, startDate).map((date, i) => (
+ date ? (
+
+ ) :
+ ))}
+
+ ))}
+
+
+ );
+}
diff --git a/packages/@fds-design/calendar/src/RangeCalendar.tsx b/packages/@fds-design/calendar/src/RangeCalendar.tsx
new file mode 100644
index 0000000..7d80308
--- /dev/null
+++ b/packages/@fds-design/calendar/src/RangeCalendar.tsx
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {CalendarBase} from './CalendarBase';
+import {createCalendar} from '@internationalized/date';
+import {createDOMRef} from '../../utils';
+import {DateValue, SpectrumRangeCalendarProps} from '@react-types/calendar';
+import {FocusableRef} from '@react-types/shared';
+import React, {ReactElement, useImperativeHandle, useMemo, useRef} from 'react';
+import {useLocale} from '@react-aria/i18n';
+import {useProviderProps} from '../../provider';
+import {useRangeCalendar} from '@react-aria/calendar';
+import {useRangeCalendarState} from '@react-stately/calendar';
+
+/**
+ * RangeCalendars display a grid of days in one or more months and allow users to select a contiguous range of dates.
+ */
+export const RangeCalendar = React.forwardRef(function RangeCalendar(props: SpectrumRangeCalendarProps, ref: FocusableRef) {
+ props = useProviderProps(props);
+ let {visibleMonths = 1} = props;
+ visibleMonths = Math.max(visibleMonths, 1);
+ let visibleDuration = useMemo(() => ({months: visibleMonths}), [visibleMonths]);
+ let {locale} = useLocale();
+ let state = useRangeCalendarState({
+ ...props,
+ locale,
+ visibleDuration,
+ createCalendar
+ });
+
+ let domRef = useRef(null);
+ useImperativeHandle(ref, () => ({
+ ...createDOMRef(domRef),
+ focus() {
+ state.setFocused(true);
+ }
+ }));
+
+ let {calendarProps, prevButtonProps, nextButtonProps, errorMessageProps} = useRangeCalendar(props, state, domRef);
+
+ return (
+
+ );
+}) as (props: SpectrumRangeCalendarProps & {ref?: FocusableRef}) => ReactElement;
diff --git a/packages/@fds-design/calendar/src/index.ts b/packages/@fds-design/calendar/src/index.ts
new file mode 100644
index 0000000..34b2be5
--- /dev/null
+++ b/packages/@fds-design/calendar/src/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 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.
+ */
+
+///
+
+export {Calendar} from './Calendar';
+export {RangeCalendar} from './RangeCalendar';
+export type {SpectrumCalendarProps, SpectrumRangeCalendarProps} from '@react-types/calendar';
diff --git a/packages/@fds-design/calendar/stories/Calendar.stories.tsx b/packages/@fds-design/calendar/stories/Calendar.stories.tsx
new file mode 100644
index 0000000..b198657
--- /dev/null
+++ b/packages/@fds-design/calendar/stories/Calendar.stories.tsx
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {ActionButton} from '@react-spectrum/button';
+import {Calendar} from '../';
+import {CalendarDate, CalendarDateTime, getLocalTimeZone, parseZonedDateTime, today, ZonedDateTime} from '@internationalized/date';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {DateValue} from '@react-types/calendar';
+import {Flex} from '@react-spectrum/layout';
+import {Item, Picker, Section} from '@react-spectrum/picker';
+import {Key} from '@react-types/shared';
+import {Provider} from '@react-spectrum/provider';
+import React, {useState} from 'react';
+import {TimeField} from '@react-spectrum/datepicker';
+import {useLocale} from '@react-aria/i18n';
+import {View} from '@react-spectrum/view';
+
+export type CalendarStory = ComponentStoryObj;
+
+export default {
+ title: 'Date and Time/Calendar',
+ component: Calendar,
+ args: {
+ onChange: action('onChange')
+ },
+ argTypes: {
+ onChange: {
+ table: {
+ disable: true
+ }
+ },
+ defaultValue: {
+ table: {
+ disable: true
+ }
+ },
+ minValue: {
+ table: {
+ disable: true
+ }
+ },
+ value: {
+ table: {
+ disable: true
+ }
+ },
+ maxValue: {
+ table: {
+ disable: true
+ }
+ },
+ defaultFocusedValue: {
+ table: {
+ disable: true
+ }
+ },
+ isDisabled: {
+ control: 'boolean'
+ },
+ isReadOnly: {
+ control: 'boolean'
+ },
+ autoFocus: {
+ control: 'boolean'
+ },
+ visibleMonths: {
+ control: 'number'
+ },
+ pageBehavior: {
+ control: 'select',
+ options: [null, 'single', 'visible']
+ },
+ isInvalid: {
+ control: 'boolean'
+ },
+ 'aria-label': {
+ control: 'text'
+ },
+ errorMessage: {
+ control: 'text'
+ }
+ }
+} as ComponentMeta;
+
+export const Default: CalendarStory = {
+ render: (args) =>
+};
+
+export const DefaultValue: CalendarStory = {
+ ...Default,
+ args: {defaultValue: new CalendarDate(2019, 6, 5)}
+};
+
+export const ControlledValue: CalendarStory = {
+ ...Default,
+ args: {value: new CalendarDate(2019, 5, 5)}
+};
+
+export const WithTime: CalendarStory = {
+ render: (args) =>
+};
+
+export const ZonedTime: CalendarStory = {
+ render: (args) => ,
+ name: 'with zoned time'
+};
+
+export const OneWeek: CalendarStory = {
+ ...Default,
+ args: {minValue: today(getLocalTimeZone()), maxValue: today(getLocalTimeZone()).add({weeks: 1})},
+ name: 'minValue: today, maxValue: 1 week from now'
+};
+
+export const DefaultMinMax: CalendarStory = {
+ ...Default,
+ args: {defaultValue: new CalendarDate(2019, 6, 10), minValue: new CalendarDate(2019, 6, 5), maxValue: new CalendarDate(2019, 6, 20)},
+ name: 'defaultValue + minValue + maxValue'
+};
+
+export const DateUnavailable: CalendarStory = {
+ render: (args) => (
+ {
+ const disabledIntervals = [[today(getLocalTimeZone()), today(getLocalTimeZone()).add({weeks: 1})], [today(getLocalTimeZone()).add({weeks: 2}), today(getLocalTimeZone()).add({weeks: 3})]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) > 0 && date.compare(interval[1]) < 0);
+ }} />
+ ),
+ name: 'isDateUnavailable'
+};
+
+export const MinValue: CalendarStory = {
+ ...Default,
+ args: {minValue: today(getLocalTimeZone())},
+ name: 'minValue: today'
+};
+
+export const MinValueDefaultVal: CalendarStory = {
+ ...Default,
+ args: {minValue: today(getLocalTimeZone()), defaultValue: new CalendarDate(2019, 6, 5)},
+ name: 'minValue: today, defaultValue'
+};
+
+export const DefaultFocusedValue: CalendarStory = {
+ ...Default,
+ args: {defaultFocusedValue: new CalendarDate(2019, 6, 5)},
+ name: 'defaultFocusedValue'
+};
+
+export const FocusedValue: CalendarStory = {
+ render: (args) => ,
+ name: 'focusedValue'
+};
+
+// https://github.com/unicode-org/cldr/blob/22af90ae3bb04263f651323ce3d9a71747a75ffb/common/supplemental/supplementalData.xml#L4649-L4664
+const preferences = [
+ {locale: '', label: 'Default', ordering: 'gregory'},
+ {label: 'Arabic (Algeria)', locale: 'ar-DZ', territories: 'DJ DZ EH ER IQ JO KM LB LY MA MR OM PS SD SY TD TN YE', ordering: 'gregory islamic islamic-civil islamic-tbla'},
+ {label: 'Arabic (United Arab Emirates)', locale: 'ar-AE', territories: 'AE BH KW QA', ordering: 'gregory islamic-umalqura islamic islamic-civil islamic-tbla'},
+ {label: 'Arabic (Egypt)', locale: 'AR-EG', territories: 'EG', ordering: 'gregory coptic islamic islamic-civil islamic-tbla'},
+ {label: 'Arabic (Saudi Arabia)', locale: 'ar-SA', territories: 'SA', ordering: 'islamic-umalqura gregory islamic islamic-rgsa'},
+ {label: 'Farsi (Afghanistan)', locale: 'fa-AF', territories: 'AF IR', ordering: 'persian gregory islamic islamic-civil islamic-tbla'},
+ // {territories: 'CN CX HK MO SG', ordering: 'gregory chinese'},
+ {label: 'Amharic (Ethiopia)', locale: 'am-ET', territories: 'ET', ordering: 'gregory ethiopic ethioaa'},
+ {label: 'Hebrew (Israel)', locale: 'he-IL', territories: 'IL', ordering: 'gregory hebrew islamic islamic-civil islamic-tbla'},
+ {label: 'Hindi (India)', locale: 'hi-IN', territories: 'IN', ordering: 'gregory indian'},
+ {label: 'Japanese (Japan)', locale: 'ja-JP', territories: 'JP', ordering: 'gregory japanese'},
+ // {territories: 'KR', ordering: 'gregory dangi'},
+ {label: 'Thai (Thailand)', locale: 'th-TH', territories: 'TH', ordering: 'buddhist gregory'},
+ {label: 'Chinese (Taiwan)', locale: 'zh-TW', territories: 'TW', ordering: 'gregory roc chinese'}
+];
+
+const calendars = [
+ {key: 'gregory', name: 'Gregorian'},
+ {key: 'japanese', name: 'Japanese'},
+ {key: 'buddhist', name: 'Buddhist'},
+ {key: 'roc', name: 'Taiwan'},
+ {key: 'persian', name: 'Persian'},
+ {key: 'indian', name: 'Indian'},
+ {key: 'islamic-umalqura', name: 'Islamic (Umm al-Qura)'},
+ {key: 'islamic-civil', name: 'Islamic Civil'},
+ {key: 'islamic-tbla', name: 'Islamic Tabular'},
+ {key: 'hebrew', name: 'Hebrew'},
+ {key: 'coptic', name: 'Coptic'},
+ {key: 'ethiopic', name: 'Ethiopic'},
+ {key: 'ethioaa', name: 'Ethiopic (Amete Alem)'}
+];
+
+function Example(props) {
+ let [locale, setLocale] = React.useState('');
+ let [calendar, setCalendar] = React.useState(calendars[0].key);
+ let {locale: defaultLocale} = useLocale();
+
+ let pref = preferences.find(p => p.locale === locale)!;
+ let preferredCalendars = React.useMemo(() => pref ? pref.ordering.split(' ').map(p => calendars.find(c => c.key === p)).filter(Boolean) : [calendars[0]], [pref]);
+ let otherCalendars = React.useMemo(() => calendars.filter(c => !preferredCalendars.some(p => p!.key === c.key)), [preferredCalendars]);
+
+ let updateLocale = locale => {
+ setLocale(locale);
+ let pref = preferences.find(p => p.locale === locale);
+ if (pref) {
+ setCalendar(pref.ordering.split(' ')[0]);
+ }
+ };
+
+ return (
+
+
+
+ {item => - {item.label}
}
+
+
+
+ {item => - {item!.name}
}
+
+
+ {item => - {item.name}
}
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function CalendarWithTime(props) {
+ let [value, setValue] = useState(new CalendarDateTime(2019, 6, 5, 8));
+ let onChange = (v: CalendarDateTime | null) => {
+ setValue(v);
+ props?.onChange?.(v);
+ };
+
+ return (
+
+
+
+
+ );
+}
+
+function CalendarWithZonedTime(props) {
+ let [value, setValue] = useState(parseZonedDateTime('2021-03-14T00:45-08:00[America/Los_Angeles]'));
+ let onChange = (v: ZonedDateTime | null) => {
+ setValue(v);
+ props?.onChange?.(v);
+ };
+
+ return (
+
+
+
+
+ );
+}
+
+function ControlledFocus(props) {
+ let [focusedDate, setFocusedDate] = useState(new CalendarDate(2019, 6, 5));
+ return (
+
+ setFocusedDate(new CalendarDate(2019, 6, 5))}>Reset focused date
+
+
+ );
+}
diff --git a/packages/@fds-design/calendar/stories/RangeCalendar.stories.tsx b/packages/@fds-design/calendar/stories/RangeCalendar.stories.tsx
new file mode 100644
index 0000000..2e998f5
--- /dev/null
+++ b/packages/@fds-design/calendar/stories/RangeCalendar.stories.tsx
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {action} from '@storybook/addon-actions';
+import {CalendarDate, CalendarDateTime, getLocalTimeZone, isWeekend, parseZonedDateTime, today} from '@internationalized/date';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {DateValue} from '@react-types/calendar';
+import {Flex} from '@react-spectrum/layout';
+import {RangeCalendar} from '../';
+import React, {useState} from 'react';
+import {TimeField} from '@react-spectrum/datepicker';
+import {useLocale} from '@react-aria/i18n';
+import {View} from '@react-spectrum/view';
+
+export type RangeCalendarStory = ComponentStoryObj;
+
+export default {
+ title: 'Date and Time/RangeCalendar',
+ component: RangeCalendar,
+ args: {
+ onChange: action('onChange')
+ },
+ argTypes: {
+ onChange: {
+ table: {
+ disable: true
+ }
+ },
+ defaultValue: {
+ table: {
+ disable: true
+ }
+ },
+ minValue: {
+ table: {
+ disable: true
+ }
+ },
+ value: {
+ table: {
+ disable: true
+ }
+ },
+ maxValue: {
+ table: {
+ disable: true
+ }
+ },
+ isDisabled: {
+ control: 'boolean'
+ },
+ isReadOnly: {
+ control: 'boolean'
+ },
+ allowsNonContiguousRanges: {
+ control: 'boolean'
+ },
+ autoFocus: {
+ control: 'boolean'
+ },
+ visibleMonths: {
+ control: 'number'
+ },
+ pageBehavior: {
+ control: 'select',
+ options: [null, 'single', 'visible']
+ },
+ isInvalid: {
+ control: 'boolean'
+ },
+ errorMessage: {
+ control: 'text'
+ }
+ }
+} as ComponentMeta;
+
+export const Default: RangeCalendarStory = {
+ render: (args) => render(args)
+};
+
+export const DefaultValue: RangeCalendarStory = {
+ ...Default,
+ args: {defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}
+};
+
+export const ControlledValue: RangeCalendarStory = {
+ ...Default,
+ args: {value: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}
+};
+
+export const WithTime: RangeCalendarStory = {
+ render: (args) =>
+};
+
+export const ZonedTime: RangeCalendarStory = {
+ render: (args) => ,
+ name: 'with zoned time'
+};
+
+export const OneWeek: RangeCalendarStory = {
+ ...Default,
+ args: {minValue: today(getLocalTimeZone()), maxValue: today(getLocalTimeZone()).add({weeks: 1})},
+ name: 'minValue: today, maxValue: 1 week from now'
+};
+
+export const DefaultMinMax: RangeCalendarStory = {
+ ...Default,
+ args: {defaultValue: {start: new CalendarDate(2019, 6, 10), end: new CalendarDate(2019, 6, 12)}, minValue: new CalendarDate(2019, 6, 5), maxValue: new CalendarDate(2019, 6, 20)},
+ name: 'defaultValue + minValue + maxValue'
+};
+
+export const DateUnavailable: RangeCalendarStory = {
+ ...Default,
+ args: {isDateUnavailable: (date: DateValue) => {
+ const disabledIntervals = [[today(getLocalTimeZone()), today(getLocalTimeZone()).add({weeks: 1})], [today(getLocalTimeZone()).add({weeks: 2}), today(getLocalTimeZone()).add({weeks: 3})]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) > 0 && date.compare(interval[1]) < 0);
+ }},
+ name: 'isDateUnavailable'
+};
+
+export const MinValue: RangeCalendarStory = {
+ ...Default,
+ args: {minValue: today(getLocalTimeZone())},
+ name: 'minValue: today'
+};
+
+export const DefaultValVisibleMonths: RangeCalendarStory = {
+ ...Default,
+ args: {visibleMonths: 3, defaultValue: {start: new CalendarDate(2021, 10, 5), end: new CalendarDate(2021, 12, 10)}},
+ name: 'defaultValue, visibleMonths: 3'
+};
+
+export const DateUnavailableInvalid: RangeCalendarStory = {
+ render: (args) => ,
+ name: 'isDateUnavailable, invalid'
+};
+
+function render(props) {
+ return (
+
+
+
+ );
+}
+
+function RangeCalendarWithTime(props) {
+ let [value, setValue] = useState({start: new CalendarDateTime(2019, 6, 5, 8), end: new CalendarDateTime(2019, 6, 10, 12)});
+ let onChange = (v) => {
+ setValue(v);
+ props?.onChange?.(v);
+ };
+
+ return (
+
+
+
+ onChange({...value, start: v})} />
+ onChange({...value, end: v})} />
+
+
+ );
+}
+
+function RangeCalendarWithZonedTime(props) {
+ let [value, setValue] = useState({start: parseZonedDateTime('2021-03-10T00:45-05:00[America/New_York]'), end: parseZonedDateTime('2021-03-26T18:05-07:00[America/Los_Angeles]')});
+ let onChange = (v) => {
+ setValue(v);
+ props?.onChange?.(v);
+ };
+
+ return (
+
+
+
+ onChange({...value, start: v})} />
+ onChange({...value, end: v})} />
+
+
+ );
+}
+
+function DateUnavailableAndInvalid(props) {
+ let {locale} = useLocale();
+ return (
+ render({...props, isDateUnavailable: (date: DateValue) => isWeekend(date, locale), allowsNonContiguousRanges: true, defaultValue: {start: new CalendarDate(2021, 10, 3), end: new CalendarDate(2021, 10, 16)}})
+ );
+}
diff --git a/packages/@fds-design/calendar/stories/RangeCalendarCell.stories.tsx b/packages/@fds-design/calendar/stories/RangeCalendarCell.stories.tsx
new file mode 100644
index 0000000..15e8763
--- /dev/null
+++ b/packages/@fds-design/calendar/stories/RangeCalendarCell.stories.tsx
@@ -0,0 +1,60 @@
+import {classNames} from '@react-spectrum/utils';
+import {generatePowerset} from '@react-spectrum/story-utils';
+import {Grid, repeat} from '@react-spectrum/layout';
+import React from 'react';
+import styles from '@adobe/spectrum-css-temp/components/calendar/vars.css';
+
+let states = [
+ {isToday: true},
+ {isSelected: true},
+ {isFocused: true},
+ {isHovered: true},
+ {isPressed: true},
+ {isDisabled: true},
+ {isRangeSelection: true},
+ {isRangeStart: true},
+ {isRangeEnd: true},
+ {isSelectionStart: true},
+ {isSelectionEnd: true}
+];
+
+export default {
+ title: 'Date and Time/RangeCalendar/cell'
+};
+
+// Fake cell for testing css
+function Cell({isToday, isSelected, isFocused, isHovered, isPressed, isDisabled, isRangeStart, isRangeEnd, isRangeSelection, isSelectionStart, isSelectionEnd}) {
+ return (
+
+ 12
+
+ );
+}
+
+export const Default = {
+ render: () => (
+
+ {generatePowerset(states, (merged) =>
+ (merged.isDisabled && (merged.isFocused || merged.isHovered || merged.isPressed)) ||
+ (!merged.isSelected && (merged.isRangeSelection || merged.isSelectionStart || merged.isSelectionEnd || merged.isRangeStart || merged.isRangeEnd)) ||
+ ((merged.isRangeStart || merged.isRangeEnd) && !merged.isRangeSelection) ||
+ (merged.isRangeStart && merged.isRangeEnd) ||
+ (merged.isSelectionStart && !merged.isRangeStart) ||
+ (merged.isSelectionEnd && !merged.isRangeEnd)
+ ).map(props => {Object.keys(props).join(' ')}
|
)}
+
+ )
+};
diff --git a/packages/@fds-design/calendar/test/Calendar.ssr.test.js b/packages/@fds-design/calendar/test/Calendar.ssr.test.js
new file mode 100644
index 0000000..91db5a8
--- /dev/null
+++ b/packages/@fds-design/calendar/test/Calendar.ssr.test.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {testSSR} from '@react-spectrum/test-utils-internal';
+
+describe('Calendar SSR', function () {
+ it('should render a Calendar without errors', async function () {
+ await testSSR(__filename, `
+ import {Calendar} from '../';
+
+ `);
+ });
+
+ it('should render a RangeCalendar without errors', async function () {
+ await testSSR(__filename, `
+ import {RangeCalendar} from '../';
+
+ `);
+ });
+});
diff --git a/packages/@fds-design/calendar/test/Calendar.test.js b/packages/@fds-design/calendar/test/Calendar.test.js
new file mode 100644
index 0000000..cc6fb08
--- /dev/null
+++ b/packages/@fds-design/calendar/test/Calendar.test.js
@@ -0,0 +1,454 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act} from '@testing-library/react';
+
+jest.mock('@react-aria/live-announcer');
+import {announce} from '@react-aria/live-announcer';
+import {Calendar} from '../';
+import {CalendarDate, isWeekend} from '@internationalized/date';
+import {pointerMap, render} from '@react-spectrum/test-utils-internal';
+import React from 'react';
+import {useLocale} from '@react-aria/i18n';
+import userEvent from '@testing-library/user-event';
+
+describe('Calendar', () => {
+ beforeAll(() => {
+ jest.useFakeTimers();
+ });
+ afterEach(() => {
+ act(() => {jest.runAllTimers();});
+ });
+
+ describe('basics', () => {
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name should render a calendar with a defaultValue', ({Calendar}) => {
+ let {getByLabelText, getByRole, getAllByRole} = render( );
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('June 2019');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+
+ let selectedDate = getByLabelText('Selected', {exact: false});
+ expect(selectedDate.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(selectedDate.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(selectedDate).toHaveAttribute('aria-label', 'Wednesday, June 5, 2019 selected');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name should render a calendar with a value', ({Calendar}) => {
+ let {getByLabelText, getByRole, getAllByRole} = render( );
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('June 2019');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+
+ let selectedDate = getByLabelText('Selected', {exact: false});
+ expect(selectedDate.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(selectedDate.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(selectedDate).toHaveAttribute('aria-label', 'Wednesday, June 5, 2019 selected');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name should focus the selected date if autoFocus is set', ({Calendar}) => {
+ let {getByRole, getByLabelText} = render( );
+
+ let cell = getByLabelText('selected', {exact: false});
+
+ let grid = getByRole('grid');
+ expect(cell.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell).toHaveFocus();
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('should center the selected date if multiple months are visible', () => {
+ let {getAllByRole, getByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+
+ let cell = getByLabelText('selected', {exact: false});
+ expect(grids[1].contains(cell)).toBe(true);
+ });
+
+ it('should constrain the visible region depending on the minValue', () => {
+ let {getAllByRole, getByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+
+ let cell = getByLabelText('selected', {exact: false});
+ expect(grids[0].contains(cell)).toBe(true);
+ });
+
+ it('should show era for BC dates', () => {
+ let {getByLabelText} = render( );
+ let cell = getByLabelText('selected', {exact: false});
+ expect(cell).toHaveAttribute('aria-label', 'Saturday, February 3, 5 BC selected');
+ });
+ });
+
+ describe('selection', () => {
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name selects a date on keyDown Enter/Space (uncontrolled)', async ({Calendar}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText} = render(
+
+ );
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+
+ // Select a new date
+ await user.keyboard('{ArrowLeft}');
+ await user.keyboard('{Enter}');
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('4');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange.mock.calls[0][0]).toEqual(new CalendarDate(2019, 6, 4));
+
+ await user.keyboard('{ArrowLeft}');
+ await user.keyboard('[Space]');
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('3');
+ expect(onChange).toHaveBeenCalledTimes(2);
+ expect(onChange.mock.calls[1][0]).toEqual(new CalendarDate(2019, 6, 3));
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name selects a date on keyDown Enter/Space (controlled)', async ({Calendar}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText} = render(
+
+ );
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+
+ // Select a new date
+ await user.keyboard('{ArrowLeft}');
+ await user.keyboard('{Enter}');
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5'); // controlled
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange.mock.calls[0][0]).toEqual(new CalendarDate(2019, 6, 4));
+
+ await user.keyboard('{ArrowLeft}');
+ await user.keyboard('[Space]');
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5'); // controlled
+ expect(onChange).toHaveBeenCalledTimes(2);
+ expect(onChange.mock.calls[1][0]).toEqual(new CalendarDate(2019, 6, 3));
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3'} | ${Calendar} | ${{isReadOnly: true}}
+ `('$Name does not select a date on keyDown Enter/Space if isReadOnly', async ({Calendar, props}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText} = render(
+
+ );
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+
+ await user.keyboard('{ArrowLeft}');
+ await user.keyboard('{Enter}');
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+ expect(onChange).not.toHaveBeenCalled();
+
+ await user.keyboard('{ArrowLeft}');
+ await user.keyboard('[Space]');
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+ expect(onChange).not.toHaveBeenCalled();
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name selects a date on click (uncontrolled)', async ({Calendar}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText, getByText} = render(
+
+ );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange.mock.calls[0][0]).toEqual(new CalendarDate(2019, 6, 17));
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3'} | ${Calendar}
+ `('$Name selects a date on click (controlled)', async ({Calendar}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText, getByText} = render(
+
+ );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange.mock.calls[0][0]).toEqual(new CalendarDate(2019, 6, 17));
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3'} | ${Calendar} | ${{isDisabled: true}}
+ `('$Name does not select a date on click if isDisabled', async ({Calendar, props}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+
+ expect(() => {
+ getAllByLabelText('selected', {exact: false});
+ }).toThrow();
+ expect(onChange).not.toHaveBeenCalled();
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3'} | ${Calendar} | ${{isReadOnly: true}}
+ `('$Name does not select a date on click if isReadOnly', async ({Calendar, props}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText, getByText} = render(
+
+ );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+ expect(onChange).not.toHaveBeenCalled();
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 2, 8), minValue: new CalendarDate(2019, 2, 5), maxValue: new CalendarDate(2019, 2, 15)}}
+ `('$Name does not select a date on click if outside the valid date range', async ({Calendar, props}) => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let onChange = jest.fn();
+ let {getByLabelText} = render(
+
+ );
+
+ await user.click(getByLabelText('Sunday, February 3, 2019'));
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('8');
+ expect(onChange).not.toHaveBeenCalled();
+
+ await user.click(getByLabelText('Sunday, February 17, 2019'));
+
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('8');
+ expect(onChange).not.toHaveBeenCalled();
+
+ await user.click(getByLabelText('Tuesday, February 5, 2019, First available date'));
+
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('5');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ await user.click(getByLabelText('Friday, February 15, 2019, Last available date'));
+
+ selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate.textContent).toBe('15');
+ expect(onChange).toHaveBeenCalledTimes(2);
+ });
+
+ it('should support invalid state', () => {
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Friday, March 11, 2022 selected'});
+ expect(cell).toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-invalid', 'true');
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selected date unavailable.');
+ });
+
+ it('should support a custom errorMessage', () => {
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Friday, March 11, 2022 selected'});
+ expect(cell).toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-invalid', 'true');
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selection dates cannot include weekends.');
+ });
+
+ it('does not show error message without isInvalid', () => {
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Friday, March 11, 2022 selected'});
+ expect(cell).not.toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).not.toHaveAttribute('aria-invalid', 'true');
+ });
+
+ it('automatically marks selection as invalid using isDateUnavailable', () => {
+ function Example() {
+ let {locale} = useLocale();
+ return (
+ isWeekend(date, locale)}
+ allowsNonContiguousRanges />
+ );
+ }
+
+ let {getByRole} = render( );
+
+ let cell = getByRole('button', {name: 'Saturday, March 5, 2022 selected'});
+ expect(cell).toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-invalid', 'true');
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selected date unavailable.');
+ });
+ });
+
+ describe('announcing', () => {
+ it('announces when the current month changes', async () => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let {getAllByLabelText} = render( );
+
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+ act(() => {jest.runAllTimers();});
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('July 2019');
+ });
+
+ it('announces when the selected date changes', async () => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let {getByText} = render( );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+ act(() => {jest.runAllTimers();});
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('Selected Date: Monday, June 17, 2019', 'polite', 4000);
+ });
+
+ it('ensures that the active descendant is announced when the focused date changes', async () => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let {getByLabelText} = render( );
+
+ let selectedDate = getByLabelText('selected', {exact: false});
+ expect(selectedDate).toHaveFocus();
+
+ await user.keyboard('{ArrowRight}');
+ act(() => {jest.runAllTimers();});
+ expect(getByLabelText('Thursday, June 6, 2019', {exact: false})).toHaveFocus();
+ });
+
+ it('includes era in BC dates', async () => {
+ let user = userEvent.setup({delay: null, pointerMap});
+ let {getByText, getAllByLabelText} = render( );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+ act(() => {jest.runAllTimers();});
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('Selected Date: Saturday, February 17, 5 BC', 'polite', 4000);
+
+ announce.mockReset();
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+ act(() => {jest.runAllTimers();});
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('March 5 BC');
+ });
+ });
+});
diff --git a/packages/@fds-design/calendar/test/CalendarBase.test.js b/packages/@fds-design/calendar/test/CalendarBase.test.js
new file mode 100644
index 0000000..c9420ab
--- /dev/null
+++ b/packages/@fds-design/calendar/test/CalendarBase.test.js
@@ -0,0 +1,793 @@
+/*
+ * Copyright 2020 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {act, fireEvent, pointerMap, render, within} from '@react-spectrum/test-utils-internal';
+import {Calendar, RangeCalendar} from '../';
+import {CalendarDate, GregorianCalendar, today} from '@internationalized/date';
+import {Provider} from '@react-spectrum/provider';
+import React from 'react';
+import {theme} from '@react-spectrum/theme-default';
+import userEvent from '@testing-library/user-event';
+
+let cellFormatter = new Intl.DateTimeFormat('en-US', {weekday: 'long', day: 'numeric', month: 'long', year: 'numeric'});
+let headingFormatter = new Intl.DateTimeFormat('en-US', {month: 'long', year: 'numeric'});
+
+describe('CalendarBase', () => {
+ let user;
+
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ // clear any live announcers
+ act(() => {
+ jest.runAllTimers();
+ });
+ });
+
+ describe('basics', () => {
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name shows the current month by default', ({Calendar, props}) => {
+ let {getByLabelText, getAllByLabelText, getByRole, getAllByRole} = render( );
+
+ let calendar = getByRole('application');
+ expect(calendar).toBeVisible();
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent(headingFormatter.format(new Date()));
+
+ let grid = getByRole('grid');
+ expect(grid).not.toHaveAttribute('tabIndex');
+
+ let todayCell = getByLabelText('today', {exact: false});
+ expect(todayCell.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(todayCell).toHaveAttribute('aria-label', `Today, ${cellFormatter.format(new Date())}`);
+ expect(todayCell).toHaveAttribute('tabIndex', '0');
+
+ expect(getByLabelText('Previous')).toBeVisible();
+ expect(getAllByLabelText('Next')[0]).toBeVisible();
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(new GregorianCalendar().getDaysInMonth(today()));
+ for (let cell of gridCells) {
+ expect(cell.children[0]).toHaveAttribute('aria-label');
+ }
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{isDisabled: true}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{isDisabled: true}}
+ `('$Name should set aria-disabled when isDisabled', ({Calendar, props}) => {
+ let {getByRole, getAllByRole, getByLabelText, getAllByLabelText} = render( );
+
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-disabled', 'true');
+ expect(grid).not.toHaveAttribute('tabIndex');
+
+ let gridCells = getAllByRole('gridcell');
+ for (let cell of gridCells) {
+ expect(cell).toHaveAttribute('aria-disabled', 'true');
+ }
+
+ expect(getByLabelText('Previous')).toHaveAttribute('disabled');
+ for (let next of getAllByLabelText('Next')) {
+ expect(next).toHaveAttribute('disabled');
+ }
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{isReadOnly: true}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{isReadOnly: true}}
+ `('$Name should set aria-readonly when isReadOnly', ({Calendar, props}) => {
+ let {getByRole} = render( );
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-readonly', 'true');
+ expect(grid).not.toHaveAttribute('tabIndex');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should focus today if autoFocus is set and there is no selected value', ({Calendar}) => {
+ let {getByLabelText} = render( );
+
+ let cell = getByLabelText('today', {exact: false});
+ expect(cell.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(cell).toHaveFocus();
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 2, 10), minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 2, 20)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 2, 10), end: new CalendarDate(2019, 2, 15)}, minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 2, 20)}}
+ `('$Name should set aria-disabled on cells outside the valid date range', ({Calendar, props}) => {
+ let {getAllByRole} = render( );
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(18);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 2, 10), minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 3, 20)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 2, 10), end: new CalendarDate(2019, 2, 15)}, minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 3, 20)}}
+ `('$Name should disable the previous button if outside valid date range', ({Calendar, props}) => {
+ let {getByLabelText, getAllByLabelText} = render( );
+
+ expect(getByLabelText('Previous')).toHaveAttribute('disabled');
+ for (let next of getAllByLabelText('Next')) {
+ expect(next).not.toHaveAttribute('disabled');
+ }
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 3, 10), minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 3, 20)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 3, 10), end: new CalendarDate(2019, 3, 15)}, minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 3, 20)}}
+ `('$Name should disable the next button if outside valid date range', ({Calendar, props}) => {
+ let {getByLabelText, getAllByLabelText} = render( );
+
+ expect(getByLabelText('Previous')).not.toHaveAttribute('disabled');
+ for (let next of getAllByLabelText('Next')) {
+ expect(next).toHaveAttribute('disabled');
+ }
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 3, 10), minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 2, 20)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 3, 10), end: new CalendarDate(2019, 3, 15)}, minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 2, 20)}}
+ `('$Name should disable both the next and previous buttons if outside valid date range', ({Calendar, props}) => {
+ let {getByLabelText, getAllByLabelText} = render( );
+
+ expect(getByLabelText('Previous')).toHaveAttribute('disabled');
+ for (let next of getAllByLabelText('Next')) {
+ expect(next).toHaveAttribute('disabled');
+ }
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name should change the month when previous or next buttons are clicked', async ({Calendar, props}) => {
+ let {getByRole, getByLabelText, getAllByLabelText, getAllByRole} = render( );
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('June 2019');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+ expect(getAllByLabelText('selected', {exact: false}).length).toBeGreaterThan(0);
+
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+
+ expect(() => {
+ getAllByLabelText('selected', {exact: false});
+ }).toThrow();
+
+ expect(heading).toHaveTextContent('July 2019');
+ gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(31);
+
+ expect(nextButton).toHaveFocus();
+
+ let prevButton = getByLabelText('Previous');
+ await user.click(prevButton);
+
+ expect(heading).toHaveTextContent('June 2019');
+ gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+ expect(getAllByLabelText('selected', {exact: false}).length).toBeGreaterThan(0);
+ expect(prevButton).toHaveFocus();
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name should change the month when previous or next buttons are clicked and multiple months are visible', async ({Calendar, props}) => {
+ let {getAllByRole, getByLabelText, getAllByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+ expect(grids[0]).toHaveAttribute('aria-label', 'May 2019');
+ expect(grids[1]).toHaveAttribute('aria-label', 'June 2019');
+ expect(grids[2]).toHaveAttribute('aria-label', 'July 2019');
+
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+
+ grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+ expect(grids[0]).toHaveAttribute('aria-label', 'August 2019');
+ expect(grids[1]).toHaveAttribute('aria-label', 'September 2019');
+ expect(grids[2]).toHaveAttribute('aria-label', 'October 2019');
+
+ let prevButton = getByLabelText('Previous');
+ await user.click(prevButton);
+
+ grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+ expect(grids[0]).toHaveAttribute('aria-label', 'May 2019');
+ expect(grids[1]).toHaveAttribute('aria-label', 'June 2019');
+ expect(grids[2]).toHaveAttribute('aria-label', 'July 2019');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 3, 10), minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 4, 20)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 3, 10), end: new CalendarDate(2019, 3, 15)}, minValue: new CalendarDate(2019, 2, 3), maxValue: new CalendarDate(2019, 4, 20)}}
+ `('$Name should move focus when the previous or next buttons become disabled', async ({Calendar, props}) => {
+ let {getByLabelText, getAllByLabelText} = render( );
+
+ let prevButton = getByLabelText('Previous');
+ let nextButton = getAllByLabelText('Next')[0];
+
+ expect(prevButton).not.toHaveAttribute('disabled');
+ expect(nextButton).not.toHaveAttribute('disabled');
+
+ await user.click(prevButton);
+ expect(prevButton).toHaveAttribute('disabled');
+ expect(nextButton).not.toHaveAttribute('disabled');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Sunday, February 10, 2019')).toBe(true);
+
+ await user.click(nextButton);
+
+ expect(prevButton).not.toHaveAttribute('disabled');
+ expect(nextButton).not.toHaveAttribute('disabled');
+ expect(document.activeElement).toBe(nextButton);
+
+ await user.click(nextButton);
+ expect(prevButton).not.toHaveAttribute('disabled');
+ expect(nextButton).toHaveAttribute('disabled');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Wednesday, April 10, 2019')).toBe(true);
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should handle minimum dates in a calendar system', ({Calendar}) => {
+ let {getByRole, getAllByRole} = render(
+
+
+
+ );
+
+ let grid = getByRole('grid');
+ let headers = within(grid).getAllByRole('columnheader', {hidden: true});
+ expect(headers.map(h => h.textContent)).toEqual(['S', 'M', 'T', 'W', 'T', 'F', 'S']);
+
+ let cells = within(grid).getAllByRole('gridcell');
+ expect(cells[0]).toHaveTextContent('8');
+ expect([...cells[0].parentElement.children].indexOf(cells[0])).toBe(2);
+
+ let button = getByRole('button', {name: 'Previous'});
+ expect(button).toHaveAttribute('disabled');
+
+ button = getAllByRole('button', {name: 'Next'})[0];
+ expect(button).not.toHaveAttribute('disabled');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should handle maximum dates in a calendar system', ({Calendar}) => {
+ let {getByRole, getAllByRole} = render( );
+
+ let grid = getByRole('grid');
+ let cells = within(grid).getAllByRole('gridcell');
+ expect(cells[cells.length - 1]).toHaveTextContent('31');
+
+ let button = getByRole('button', {name: 'Previous'});
+ expect(button).not.toHaveAttribute('disabled');
+
+ button = getAllByRole('button', {name: 'Next'})[0];
+ expect(button).toHaveAttribute('disabled');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should show era for BC dates', ({Calendar}) => {
+ let {getByRole} = render( );
+
+ let group = getByRole('application');
+ expect(group).toHaveAttribute('aria-label', 'January 2 BC');
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('January 2 BC');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name should change the month when keyboard navigating and multiple months are visible', async ({Calendar, props}) => {
+ let {getAllByRole, getByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+ expect(grids[0]).toHaveAttribute('aria-label', 'May 2019');
+ expect(grids[1]).toHaveAttribute('aria-label', 'June 2019');
+ expect(grids[2]).toHaveAttribute('aria-label', 'July 2019');
+
+ act(() => getByLabelText('Wednesday, July 31, 2019').focus());
+ await user.keyboard('{ArrowRight}');
+
+ grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+ expect(grids[0]).toHaveAttribute('aria-label', 'August 2019');
+ expect(grids[1]).toHaveAttribute('aria-label', 'September 2019');
+ expect(grids[2]).toHaveAttribute('aria-label', 'October 2019');
+
+ await user.keyboard('{ArrowLeft}');
+
+ grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+ expect(grids[0]).toHaveAttribute('aria-label', 'May 2019');
+ expect(grids[1]).toHaveAttribute('aria-label', 'June 2019');
+ expect(grids[2]).toHaveAttribute('aria-label', 'July 2019');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2021, 12, 15)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2021, 12, 15), end: new CalendarDate(2021, 12, 15)}}}
+ `('$Name should set aria-disabled on cells for which isDateUnavailable returns true', async ({Calendar, props}) => {
+ const isDateUnavailable = (date) => {
+ const disabledIntervals = [[new CalendarDate(2021, 12, 6), new CalendarDate(2021, 12, 10)], [new CalendarDate(2021, 12, 22), new CalendarDate(2021, 12, 26)]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+ };
+ let {getByRole, getAllByRole} = render( );
+
+ expect(getByRole('button', {name: 'Monday, December 6, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Tuesday, December 7, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Wednesday, December 8, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Thursday, December 9, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Friday, December 10, 2021'})).toHaveAttribute('aria-disabled', 'true');
+
+ expect(getByRole('button', {name: 'Wednesday, December 22, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Thursday, December 23, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Friday, December 24, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Saturday, December 25, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Sunday, December 26, 2021'})).toHaveAttribute('aria-disabled', 'true');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(21);
+
+ let cell = getByRole('button', {name: 'Wednesday, December 22, 2021'});
+ await user.click(cell);
+ expect(cell.parentElement).not.toHaveAttribute('aria-selected');
+
+ cell = getByRole('button', {name: 'Sunday, December 12, 2021'});
+ await user.click(cell);
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should support defaultFocusedValue', async ({Calendar}) => {
+ let onFocusChange = jest.fn();
+ let {getByRole} = render( );
+
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-label', 'June 2019');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Wednesday, June 5, 2019')).toBe(true);
+
+ await user.keyboard('{ArrowRight}');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Thursday, June 6, 2019')).toBe(true);
+ expect(onFocusChange).toHaveBeenCalledWith(new CalendarDate(2019, 6, 6));
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should support controlled focusedValue', async ({Calendar}) => {
+ let onFocusChange = jest.fn();
+ let {getByRole} = render( );
+
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-label', 'June 2019');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Wednesday, June 5, 2019')).toBe(true);
+
+ await user.keyboard('{ArrowRight}');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Wednesday, June 5, 2019')).toBe(true);
+ expect(onFocusChange).toHaveBeenCalledWith(new CalendarDate(2019, 6, 6));
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should constrain defaultFocusedValue', ({Calendar}) => {
+ let {getByRole} = render( );
+
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-label', 'July 2019');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Friday, July 5, 2019')).toBe(true);
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should constrain focusedValue', ({Calendar}) => {
+ let {getByRole} = render( );
+
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-label', 'July 2019');
+ expect(document.activeElement.getAttribute('aria-label').startsWith('Friday, July 5, 2019')).toBe(true);
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should support focusing via a ref', ({Calendar}) => {
+ let ref = React.createRef();
+ render( );
+ expect(ref.current).toHaveProperty('focus');
+
+ act(() => ref.current.focus());
+ expect(document.activeElement).toHaveAttribute('role', 'button');
+ expect(document.activeElement.parentElement).toHaveAttribute('role', 'gridcell');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should pass through data attributes', ({Calendar}) => {
+ let {getByTestId} = render( );
+ expect(getByTestId('foo')).toHaveAttribute('role', 'application');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should return the outer most DOM element from the ref', ({Calendar}) => {
+ let ref = React.createRef();
+ render( );
+ expect(ref.current).toHaveProperty('UNSAFE_getDOMNode');
+
+ let wrapper = ref.current.UNSAFE_getDOMNode();
+ expect(wrapper).toHaveAttribute('role', 'application');
+ });
+
+ it.each`
+ Name | Calendar
+ ${'v3 Calendar'} | ${Calendar}
+ ${'v3 RangeCalendar'} | ${RangeCalendar}
+ `('$Name should respond to provider props', ({Calendar}) => {
+ let {getByRole, getAllByRole, getByLabelText, getAllByLabelText} = render(
+
+
+
+ );
+
+ let grid = getByRole('grid');
+ expect(grid).toHaveAttribute('aria-disabled', 'true');
+ expect(grid).not.toHaveAttribute('tabIndex');
+
+ let gridCells = getAllByRole('gridcell');
+ for (let cell of gridCells) {
+ expect(cell).toHaveAttribute('aria-disabled', 'true');
+ }
+
+ expect(getByLabelText('Previous')).toHaveAttribute('disabled');
+ expect(getAllByLabelText('Next')[0]).toHaveAttribute('disabled');
+ });
+ });
+
+ describe('labeling', () => {
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 5)}}}
+ `('$Name should be labeled by month heading by default', async ({Calendar, props}) => {
+ let {getByRole} = render( );
+ let calendar = getByRole('application');
+ let body = getByRole('grid');
+ expect(calendar).toHaveAttribute('id');
+ expect(calendar).toHaveAttribute('aria-label', 'June 2019');
+ expect(body).toHaveAttribute('aria-label', 'June 2019');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 5)}}}
+ `('$Name should support labeling with aria-label', ({Calendar, props}) => {
+ let {getByRole} = render( );
+ let calendar = getByRole('application');
+ let body = getByRole('grid');
+ expect(calendar).toHaveAttribute('id');
+ expect(calendar).toHaveAttribute('aria-label', 'foo, June 2019');
+ expect(body).toHaveAttribute('aria-label', 'foo, June 2019');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 5)}}}
+ `('$Name should support labeling with aria-labelledby', ({Calendar, props}) => {
+ let {getByRole} = render( );
+ let calendar = getByRole('application');
+ let body = getByRole('grid');
+ expect(calendar).toHaveAttribute('id');
+ expect(calendar).toHaveAttribute('aria-label', 'June 2019');
+ expect(calendar).toHaveAttribute('aria-labelledby', `${calendar.id} foo`);
+ expect(body).toHaveAttribute('aria-label', 'June 2019');
+ expect(body).toHaveAttribute('id');
+ expect(body).toHaveAttribute('aria-labelledby', `${body.id} foo`);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 5)}}}
+ `('$Name should support labeling with aria-labelledby and aria-label', ({Calendar, props}) => {
+ let {getByRole} = render( );
+ let calendar = getByRole('application');
+ let body = getByRole('grid');
+ expect(calendar).toHaveAttribute('id');
+ expect(calendar).toHaveAttribute('aria-label', 'cal, June 2019');
+ expect(calendar).toHaveAttribute('aria-labelledby', `${calendar.id} foo`);
+ expect(body).toHaveAttribute('aria-label', 'cal, June 2019');
+ expect(body).toHaveAttribute('id');
+ expect(body).toHaveAttribute('aria-labelledby', `${body.id} foo`);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 5)}}}
+ `('$Name should support labeling with a custom id', ({Calendar, props}) => {
+ let {getByRole} = render( );
+ let calendar = getByRole('application');
+ let body = getByRole('grid');
+ expect(calendar).toHaveAttribute('id', 'hi');
+ expect(calendar).toHaveAttribute('aria-label', 'cal, June 2019');
+ expect(calendar).toHaveAttribute('aria-labelledby', `${calendar.id} foo`);
+ expect(body).toHaveAttribute('aria-label', 'cal, June 2019');
+ expect(body).toHaveAttribute('id');
+ expect(body).toHaveAttribute('aria-labelledby', `${body.id} foo`);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 5)}}}
+ `('$Name should support labeling with multiple visible months', ({Calendar, props}) => {
+ let {getByRole, getAllByRole} = render( );
+ let calendar = getByRole('application');
+ let months = getAllByRole('grid');
+ expect(months).toHaveLength(3);
+ expect(calendar).toHaveAttribute('id');
+ expect(calendar).toHaveAttribute('aria-label', 'Calendar, May to July 2019');
+ expect(months[0]).toHaveAttribute('aria-label', 'Calendar, May 2019');
+ expect(months[1]).toHaveAttribute('aria-label', 'Calendar, June 2019');
+ expect(months[2]).toHaveAttribute('aria-label', 'Calendar, July 2019');
+ });
+ });
+
+ describe('keyboard navigation', () => {
+ async function testKeyboard(Calendar, defaultValue, key, value, month, props, opts) {
+ // For range calendars, convert the value to a range of one day
+ if (Calendar === RangeCalendar) {
+ defaultValue = {start: defaultValue, end: defaultValue};
+ }
+
+ let {getAllByRole, getAllByLabelText, unmount} = render( );
+ let grid = getAllByRole('grid')[0]; // get by role will see two, role=grid and implicit which also has role=grid
+
+ let cell = getAllByLabelText('selected', {exact: false}).filter(cell => cell.role !== 'grid')[0];
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(document.activeElement).toBe(cell);
+
+ if (opts?.shiftKey) {
+ await user.keyboard('{Shift>}');
+ }
+ await user.keyboard(`[${key}]`);
+ if (opts?.shiftKey) {
+ await user.keyboard('{/Shift}');
+ }
+
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(document.activeElement.getAttribute('aria-label')).toMatch(value);
+
+ let heading = getAllByRole('heading')[0];
+ expect(heading).toHaveTextContent(month);
+
+ // clear any live announcers
+ act(() => {
+ jest.runAllTimers();
+ });
+
+ unmount();
+ }
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should move the focused date by one day with the left/right arrows', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'ArrowLeft', 'Tuesday, June 4, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'ArrowRight', 'Thursday, June 6, 2019', 'June 2019', props);
+
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 1), 'ArrowLeft', 'Friday, May 31, 2019', 'May 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 30), 'ArrowRight', 'Monday, July 1, 2019', 'July 2019', props);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should move the focused date by one week with the up/down arrows', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 12), 'ArrowUp', 'Wednesday, June 5, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 12), 'ArrowDown', 'Wednesday, June 19, 2019', 'June 2019', props);
+
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'ArrowUp', 'Wednesday, May 29, 2019', 'May 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 26), 'ArrowDown', 'Wednesday, July 3, 2019', 'July 2019', props);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should move the focused date to the start or end of the month with the home/end keys', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 12), 'Home', 'Saturday, June 1, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 12), 'End', 'Sunday, June 30, 2019', 'June 2019', props);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{visibleMonths: 3}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{visibleMonths: 3}}
+ `('$Name should move the focused date to the start or end of the month with the home/end keys when multiple months are visible', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 12), 'Home', 'Saturday, June 1, 2019', 'May to July 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 12), 'End', 'Sunday, June 30, 2019', 'May to July 2019', props);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should move the focused date by one month with the page up/page down keys', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageUp', 'Sunday, May 5, 2019', 'May 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageDown', 'Friday, July 5, 2019', 'July 2019', props);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{visibleMonths: 3}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{visibleMonths: 3}}
+ `('$Name should move the focused date by one month with the page up/page down keys when multiple months are visible', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageUp', 'Sunday, May 5, 2019', 'May to July 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageDown', 'Friday, July 5, 2019', 'May to July 2019', props);
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should move the focused date by one year with the shift + page up/shift + page down keys', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageUp', 'Tuesday, June 5, 2018', 'June 2018', props, {shiftKey: true});
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageDown', 'Friday, June 5, 2020', 'June 2020', props, {shiftKey: true});
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{minValue: new CalendarDate(2019, 6, 2), maxValue: new CalendarDate(2019, 6, 8)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{minValue: new CalendarDate(2019, 6, 2), maxValue: new CalendarDate(2019, 6, 8)}}
+ `('$Name should not move the focused date outside the valid range', async ({Calendar, props}) => {
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 2), 'ArrowLeft', 'Sunday, June 2, 2019 selected', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 8), 'ArrowRight', 'Saturday, June 8, 2019 selected', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'ArrowUp', 'Sunday, June 2, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'ArrowDown', 'Saturday, June 8, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'Home', 'Sunday, June 2, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'End', 'Saturday, June 8, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageUp', 'Sunday, June 2, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageDown', 'Saturday, June 8, 2019', 'June 2019', props);
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageUp', 'Sunday, June 2, 2019', 'June 2019', props, {shiftKey: true});
+ await testKeyboard(Calendar, new CalendarDate(2019, 6, 5), 'PageDown', 'Saturday, June 8, 2019', 'June 2019', props, {shiftKey: true});
+ });
+ });
+
+ // These tests only apply to v3
+ describe('internationalization', () => {
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{}}
+ `('$Name should change the week start day based on the locale', ({Calendar}) => {
+ let {getAllByRole, rerender} = render(
+
+
+
+ );
+
+ let headers = getAllByRole('columnheader', {hidden: true});
+ expect(headers[0]).toHaveTextContent('S');
+
+ rerender(
+
+
+
+ );
+
+ headers = getAllByRole('columnheader', {hidden: true});
+ expect(headers[0]).toHaveTextContent('M');
+ });
+
+ it.each`
+ Name | Calendar | props
+ ${'v3 Calendar'} | ${Calendar} | ${{defaultValue: new CalendarDate(2019, 6, 5)}}
+ ${'v3 RangeCalendar'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name should mirror arrow key movement in an RTL locale', async ({Calendar, props}) => {
+ // LTR
+ let {getByRole, getAllByRole, rerender} = render(
+
+
+
+ );
+
+ let grid = getByRole('grid');
+ let selected = getAllByRole('button').find(cell => cell.getAttribute('tabIndex') === '0');
+ expect(document.activeElement).toBe(selected);
+
+ await user.keyboard('{ArrowLeft}');
+ expect(document.activeElement).toBe(selected.parentNode.previousSibling.children[0]);
+
+ await user.keyboard('{ArrowRight}');
+ expect(document.activeElement).toBe(selected);
+
+ // RTL
+ rerender(
+
+
+
+ );
+
+ // make sure focused cell gets updated after rerender
+ fireEvent.blur(grid);
+ fireEvent.focus(grid);
+
+ selected = getAllByRole('button').find(cell => cell.getAttribute('tabIndex') === '0');
+ expect(document.activeElement).toBe(selected);
+
+ await user.keyboard('{ArrowLeft}');
+ expect(document.activeElement).toBe(selected.parentNode.nextSibling.children[0]);
+
+
+ await user.keyboard('{ArrowRight}');
+ expect(document.activeElement).toBe(selected);
+ });
+ });
+});
diff --git a/packages/@fds-design/calendar/test/RangeCalendar.test.js b/packages/@fds-design/calendar/test/RangeCalendar.test.js
new file mode 100644
index 0000000..21ea681
--- /dev/null
+++ b/packages/@fds-design/calendar/test/RangeCalendar.test.js
@@ -0,0 +1,1527 @@
+/*
+ * Copyright 2020 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.
+ */
+
+jest.mock('@react-aria/live-announcer');
+import {act, fireEvent, installPointerEvent, pointerMap, render} from '@react-spectrum/test-utils-internal';
+import {announce} from '@react-aria/live-announcer';
+import {CalendarDate, isWeekend} from '@internationalized/date';
+import {RangeCalendar} from '../';
+import React from 'react';
+import {useLocale} from '@react-aria/i18n';
+import userEvent from '@testing-library/user-event';
+
+let cellFormatter = new Intl.DateTimeFormat('en-US', {weekday: 'long', day: 'numeric', month: 'long', year: 'numeric'});
+
+describe('RangeCalendar', () => {
+ /** @type {ReturnType} */
+ let user;
+ beforeAll(() => {
+ user = userEvent.setup({delay: null, pointerMap});
+ jest.useFakeTimers();
+ });
+ afterEach(() => {
+ act(() => {
+ jest.runAllTimers();
+ });
+ });
+
+ describe('basics', () => {
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name should render a calendar with a defaultValue', ({RangeCalendar, props}) => {
+ let {getAllByLabelText, getByRole, getAllByRole} = render( );
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('June 2019');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+
+ let selectedDates = getAllByLabelText('Selected', {exact: false});
+ let labels = [
+ 'Selected Range: Wednesday, June 5 to Monday, June 10, 2019, Wednesday, June 5, 2019 selected',
+ 'Thursday, June 6, 2019 selected',
+ 'Friday, June 7, 2019 selected',
+ 'Saturday, June 8, 2019 selected',
+ 'Sunday, June 9, 2019 selected',
+ 'Selected Range: Wednesday, June 5 to Monday, June 10, 2019, Monday, June 10, 2019 selected'
+ ];
+ expect(selectedDates.length).toBe(6);
+
+ let i = 0;
+ for (let cell of selectedDates) {
+ expect(cell.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell).toHaveAttribute('aria-label', labels[i++]);
+ }
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{value: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name should render a calendar with a value', ({RangeCalendar, props}) => {
+ let {getAllByLabelText, getByRole, getAllByRole} = render( );
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('June 2019');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+
+ let selectedDates = getAllByLabelText('Selected', {exact: false});
+ let labels = [
+ 'Selected Range: Wednesday, June 5 to Monday, June 10, 2019, Wednesday, June 5, 2019 selected',
+ 'Thursday, June 6, 2019 selected',
+ 'Friday, June 7, 2019 selected',
+ 'Saturday, June 8, 2019 selected',
+ 'Sunday, June 9, 2019 selected',
+ 'Selected Range: Wednesday, June 5 to Monday, June 10, 2019, Monday, June 10, 2019 selected'
+ ];
+ expect(selectedDates.length).toBe(6);
+
+ let i = 0;
+ for (let cell of selectedDates) {
+ expect(cell.parentElement).toHaveAttribute('role', 'gridcell');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell).toHaveAttribute('aria-label', labels[i++]);
+ }
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{value: {start: new CalendarDate(2019, 2, 3), end: new CalendarDate(2019, 2, 18)}}}
+ `('$Name should focus the first selected date if autoFocus is set', ({RangeCalendar, props}) => {
+ let {getByRole, getAllByLabelText} = render( );
+
+ let cells = getAllByLabelText('selected', {exact: false});
+ let grid = getByRole('grid');
+
+ expect(cells[0].parentElement).toHaveAttribute('role', 'gridcell');
+ expect(cells[0].parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cells[0]).toHaveFocus();
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ });
+
+ it('should show selected dates across multiple months', async () => {
+ let {getByRole, getByLabelText, getAllByLabelText, getAllByRole} = render( );
+
+ let heading = getByRole('heading');
+ expect(heading).toHaveTextContent('June 2019');
+
+ let gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+
+ let selected = getAllByLabelText('selected', {exact: false}).filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(selected.length).toBe(11);
+ let juneLabels = [
+ 'Selected Range: Thursday, June 20 to Wednesday, July 10, 2019, Thursday, June 20, 2019 selected',
+ 'Friday, June 21, 2019 selected',
+ 'Saturday, June 22, 2019 selected',
+ 'Sunday, June 23, 2019 selected',
+ 'Monday, June 24, 2019 selected',
+ 'Tuesday, June 25, 2019 selected',
+ 'Wednesday, June 26, 2019 selected',
+ 'Thursday, June 27, 2019 selected',
+ 'Friday, June 28, 2019 selected',
+ 'Saturday, June 29, 2019 selected',
+ 'Sunday, June 30, 2019 selected'
+ ];
+
+ let i = 0;
+ for (let cell of selected) {
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell).toHaveAttribute('aria-label', juneLabels[i++]);
+ }
+
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+
+ selected = getAllByLabelText('selected', {exact: false}).filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(selected.length).toBe(10);
+ let julyLabels = [
+ 'Monday, July 1, 2019 selected',
+ 'Tuesday, July 2, 2019 selected',
+ 'Wednesday, July 3, 2019 selected',
+ 'Thursday, July 4, 2019 selected',
+ 'Friday, July 5, 2019 selected',
+ 'Saturday, July 6, 2019 selected',
+ 'Sunday, July 7, 2019 selected',
+ 'Monday, July 8, 2019 selected',
+ 'Tuesday, July 9, 2019 selected',
+ 'Selected Range: Thursday, June 20 to Wednesday, July 10, 2019, Wednesday, July 10, 2019 selected'
+ ];
+
+ i = 0;
+ for (let cell of selected) {
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell).toHaveAttribute('aria-label', julyLabels[i++]);
+ }
+
+ expect(heading).toHaveTextContent('July 2019');
+ gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(31);
+
+ expect(nextButton).toHaveFocus();
+
+ let prevButton = getByLabelText('Previous');
+ await user.click(prevButton);
+
+ expect(heading).toHaveTextContent('June 2019');
+ gridCells = getAllByRole('gridcell').filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(gridCells.length).toBe(30);
+
+ selected = getAllByLabelText('selected', {exact: false}).filter(cell => cell.getAttribute('aria-disabled') !== 'true');
+ expect(selected.length).toBe(11);
+ i = 0;
+ for (let cell of selected) {
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell).toHaveAttribute('aria-label', juneLabels[i++]);
+ }
+
+ expect(prevButton).toHaveFocus();
+ });
+
+ it('should center the selected range if multiple months are visible', () => {
+ let {getAllByRole, getAllByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+
+ let cells = getAllByLabelText('selected', {exact: false});
+ expect(cells.every(cell => grids[1].contains(cell))).toBe(true);
+ });
+
+ it('should constrain the visible region depending on the minValue', () => {
+ let {getAllByRole, getAllByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+
+ let cells = getAllByLabelText('selected', {exact: false});
+ expect(cells.every(cell => grids[0].contains(cell))).toBe(true);
+ });
+
+ it('should start align the selected range if it would go out of view when centered', () => {
+ let {getAllByRole, getAllByLabelText} = render( );
+
+ let grids = getAllByRole('grid');
+ expect(grids).toHaveLength(3);
+
+ let cells = getAllByLabelText('selected', {exact: false});
+ expect(grids[0].contains(cells[0])).toBe(true);
+ });
+
+ it('should show era for BC dates', () => {
+ let {getAllByLabelText} = render( );
+ let cell = getAllByLabelText('selected', {exact: false})[0];
+ expect(cell).toHaveAttribute('aria-label', 'Selected Range: Thursday, December 14, 1 BC to Monday, January 22, 1 AD, Thursday, December 14, 1 BC selected');
+ });
+ });
+
+ describe('selection', () => {
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{}}
+ `('$Name adds a range selection prompt to the focused cell', ({RangeCalendar, props}) => {
+ let {getByRole, getByLabelText} = render( );
+
+ let grid = getByRole('grid');
+ let cell = getByLabelText('today', {exact: false});
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(cell).toHaveAttribute('aria-label', `Today, ${cellFormatter.format(new Date())}`);
+ expect(cell).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(cell.getAttribute('aria-describedby'))).toHaveTextContent('Click to start selecting date range');
+
+ // enter selection mode
+ fireEvent.keyDown(grid, {key: 'Enter'});
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(cell.parentElement).toHaveAttribute('aria-selected');
+ expect(cell).toHaveAttribute('aria-label', `Today, ${cellFormatter.format(new Date())} selected`);
+ expect(cell).toHaveAttribute('aria-describedby');
+ expect(document.getElementById(cell.getAttribute('aria-describedby'))).toHaveTextContent('Click to finish selecting date range');
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name can select a range with the keyboard (uncontrolled)', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getAllByLabelText} = render(
+
+ );
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+
+ // Select a new date
+ await user.keyboard('{ArrowLeft}');
+
+ // Begin selecting
+ await user.keyboard('{Enter}');
+
+ // Auto advances by one day
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('4');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('5');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // Move focus
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('4');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('9');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // End selection
+ await user.keyboard('[Space]');
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('4'); // uncontrolled
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('9');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 4));
+ expect(end).toEqual(new CalendarDate(2019, 6, 9));
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{value: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name can select a range with the keyboard (controlled)', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getAllByLabelText} = render(
+
+ );
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+
+ // Select a new date
+ await user.keyboard('{ArrowLeft}');
+
+ // Begin selecting
+ await user.keyboard('{Enter}');
+
+ // Auto advances by one day
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('4');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('5');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // Move focus
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+ await user.keyboard('{ArrowRight}');
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('4');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('9');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // End selection
+ await user.keyboard('[Space]');
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5'); // controlled
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 4));
+ expect(end).toEqual(new CalendarDate(2019, 6, 9));
+ });
+
+ it('does not enter selection mode with the keyboard if isReadOnly', async () => {
+ let {getByRole, getByLabelText} = render( );
+
+ let grid = getByRole('grid');
+ let cell = getByLabelText('today', {exact: false});
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(cell).toHaveAttribute('aria-label', `Today, ${cellFormatter.format(new Date())}`);
+ expect(document.activeElement).toBe(cell);
+
+ // try to enter selection mode
+ await user.keyboard('{Enter}');
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(cell.parentElement).not.toHaveAttribute('aria-selected');
+ expect(cell).toHaveAttribute('aria-label', `Today, ${cellFormatter.format(new Date())}`);
+ expect(document.activeElement).toBe(cell);
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name selects a range with the mouse (uncontrolled)', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ await user.click(getByText('17'));
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('10').parentElement);
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('7').parentElement);
+ await user.click(getByText('7'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('7'); // uncontrolled
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 7));
+ expect(end).toEqual(new CalendarDate(2019, 6, 17));
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{value: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name selects a range with the mouse (controlled)', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ await user.click(getByText('17'));
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('10'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('7'));
+ await user.click(getByText('7'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5'); // controlled
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 7));
+ expect(end).toEqual(new CalendarDate(2019, 6, 17));
+ });
+
+ it('selects by dragging with the mouse', () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('17'), {detail: 1});
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // dragging updates the highlighted dates
+ fireEvent.pointerEnter(getByText('18'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('18');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('23'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.mouseUp(getByText('23'), {detail: 1});
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 17));
+ expect(end).toEqual(new CalendarDate(2019, 6, 23));
+ });
+
+ it('allows dragging the start of the highlighted range to modify it', () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('10'), {detail: 1});
+
+ // mouse down on a range end should not reset it
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // dragging updates the highlighted dates
+ fireEvent.pointerEnter(getByText('11'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('11');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('8'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('8');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.mouseUp(getByText('8'), {detail: 1});
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('8');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 8));
+ expect(end).toEqual(new CalendarDate(2019, 6, 20));
+ });
+
+ it('allows dragging the end of the highlighted range to modify it', () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('20'), {detail: 1});
+
+ // mouse down on a range end should not reset it
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // dragging updates the highlighted dates
+ fireEvent.pointerEnter(getByText('21'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('21');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('19'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('19');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.mouseUp(getByText('19'), {detail: 1});
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('19');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 10));
+ expect(end).toEqual(new CalendarDate(2019, 6, 19));
+ });
+
+ it('releasing drag outside calendar commits it', () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('22'), {detail: 1});
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('22');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // dragging updates the highlighted dates
+ fireEvent.pointerEnter(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerUp(document.body);
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 22));
+ expect(end).toEqual(new CalendarDate(2019, 6, 25));
+ });
+
+ describe('touch', () => {
+ installPointerEvent();
+
+ it('selects by dragging with touch', () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.pointerDown(getByText('17'), {pointerType: 'touch'});
+
+ // There is a delay to distinguish between dragging and scrolling
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates).toHaveLength(6);
+
+ act(() => jest.advanceTimersByTime(300));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates).toHaveLength(1);
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // dragging updates the highlighted dates
+ fireEvent.pointerEnter(getByText('18'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('18');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('23'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerUp(getByText('23'), {pointerType: 'touch'});
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 17));
+ expect(end).toEqual(new CalendarDate(2019, 6, 23));
+ });
+
+ it('does not allow dragging the end of an invalid range', async () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.pointerDown(getByText('20'), {pointerType: 'touch'});
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('21'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('19'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerUp(getByText('19'), {pointerType: 'touch', clientX: 100, clientY: 100});
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // Can click to select range
+ let cell15 = getByText('15');
+ // TODO: fix that this doesn't work with await user.click()
+ fireEvent.pointerDown(cell15, {detail: 1, pointerType: 'mouse'});
+ fireEvent.pointerUp(cell15, {detail: 1, pointerType: 'mouse'});
+ fireEvent.click(cell15, {detail: 1, pointerType: 'mouse'});
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('15');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('15');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ let cell20 = getByText('20');
+ fireEvent.pointerDown(cell20, {detail: 1, pointerType: 'mouse'});
+ fireEvent.pointerUp(cell20, {detail: 1, pointerType: 'mouse'});
+ fireEvent.click(cell20, {detail: 1, pointerType: 'mouse'});
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('15');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 15));
+ expect(end).toEqual(new CalendarDate(2019, 6, 20));
+ });
+
+ it('selection isn\'t prematurely finalized when touching a day cell to scroll through the calendar', async () => {
+ let onChange = jest.fn();
+
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ // start a range selection
+ await user.click(getByText('23'));
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // scroll through the calendar
+ // simulate touch scroll by touch-move on a day
+ let dayEl = getByText('10');
+ fireEvent.pointerDown(dayEl, {pointerType: 'touch'});
+ fireEvent.pointerCancel(dayEl, {pointerType: 'touch'});
+
+ // finalize selection
+ await user.click(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith({
+ start: new CalendarDate(2019, 6, 23),
+ end: new CalendarDate(2019, 6, 25)
+ });
+ });
+
+ it('selection isn\'t prematurely finalized when touching a disabled day cell to scroll through the calendar', async () => {
+ let onChange = jest.fn();
+
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ // start a range selection
+ await user.click(getByText('23'));
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // scroll through the calendar
+ // simulate touch scroll by touch-move on a disabled day (May 31)
+ let disabledDayEl = getByText('31');
+ fireEvent.pointerDown(disabledDayEl, {pointerType: 'touch'});
+ fireEvent.pointerCancel(disabledDayEl, {pointerType: 'touch'});
+
+ // finalize selection
+ await user.click(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith({
+ start: new CalendarDate(2019, 6, 23),
+ end: new CalendarDate(2019, 6, 25)
+ });
+ });
+
+ it('selection isn\'t prematurely finalized when touching a weekday header to scroll through the calendar', async () => {
+ let onChange = jest.fn();
+
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ // start a range selection
+ await user.click(getByText('23'));
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // scroll through the calendar
+ // simulate touch scroll by touch-move on a weekday
+ let weekdayEl = getByText('M');
+ fireEvent.pointerDown(weekdayEl, {pointerType: 'touch'});
+ fireEvent.pointerCancel(weekdayEl, {pointerType: 'touch'});
+
+ // finalize selection
+ await user.click(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith({
+ start: new CalendarDate(2019, 6, 23),
+ end: new CalendarDate(2019, 6, 25)
+ });
+ });
+
+ it('selection isn\'t prematurely finalized when touching the header to scroll through the calendar', async () => {
+ let onChange = jest.fn();
+
+ let {getAllByLabelText, getByText, getByRole} = render(
+
+ );
+
+ // start a range selection
+ await user.click(getByText('23'));
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('23');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // scroll through the calendar
+ // simulate touch scroll by touch-move on heading
+ let headingEl = getByRole('heading');
+ fireEvent.pointerDown(headingEl, {pointerType: 'touch'});
+ fireEvent.pointerCancel(headingEl, {pointerType: 'touch'});
+
+ // finalize selection
+ await user.click(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('23');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledWith({
+ start: new CalendarDate(2019, 6, 23),
+ end: new CalendarDate(2019, 6, 25)
+ });
+ });
+ });
+
+ it('clicking outside calendar commits selection', async () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ await user.click(getByText('22'));
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('22');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ await user.click(document.body);
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 22));
+ expect(end).toEqual(new CalendarDate(2019, 6, 25));
+ });
+
+ it('clicking on next/previous buttons does not commit selection', async () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ await user.click(getByText('22'));
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('22');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('25'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('22');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ let next = getAllByLabelText('Next')[0];
+ await user.click(next);
+
+ selectedDates = getAllByLabelText('selected', {exact: false}).filter(d => !d.hasAttribute('aria-disabled'));
+ expect(selectedDates[0].textContent).toBe('1');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('25');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('10'));
+ selectedDates = getAllByLabelText('selected', {exact: false}).filter(d => !d.hasAttribute('aria-disabled'));
+ expect(selectedDates[0].textContent).toBe('1');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ await user.click(getByText('10').parentElement);
+ selectedDates = getAllByLabelText('selected', {exact: false}).filter(d => !d.hasAttribute('aria-disabled'));
+ expect(selectedDates[0].textContent).toBe('1');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 22));
+ expect(end).toEqual(new CalendarDate(2019, 7, 10));
+ });
+
+ it('clicking on the start of the highlighted range starts a new selection', async () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('10'), {detail: 1});
+
+ // mouse down on a range end should not reset it
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // mouse up should
+ fireEvent.mouseUp(getByText('10'), {detail: 1});
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('11'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('11');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('12'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('12');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ await user.click(getByText('12'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('12');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 10));
+ expect(end).toEqual(new CalendarDate(2019, 6, 12));
+ });
+
+ it('clicking on the end of the highlighted range starts a new selection', async () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('20'), {detail: 1});
+
+ // mouse down on a range end should not reset it
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // mouse up should
+ fireEvent.mouseUp(getByText('20'), {detail: 1});
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('20');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('19'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('19');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('18'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('18');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ await user.click(getByText('18'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('18');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 18));
+ expect(end).toEqual(new CalendarDate(2019, 6, 20));
+ });
+
+ it('mouse down in the middle of the highlighted range starts a new selection', async () => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render( );
+
+ fireEvent.mouseDown(getByText('15'), {detail: 1});
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('15');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('15');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.mouseUp(getByText('15'), {detail: 1});
+
+ // hovering updates the highlighted dates
+ fireEvent.pointerEnter(getByText('16'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('15');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('16');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ fireEvent.pointerEnter(getByText('17'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('15');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(0);
+
+ await user.click(getByText('17'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('15');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).toHaveBeenCalledTimes(1);
+
+ let {start, end} = onChange.mock.calls[0][0];
+ expect(start).toEqual(new CalendarDate(2019, 6, 15));
+ expect(end).toEqual(new CalendarDate(2019, 6, 17));
+ });
+
+ it('does not enter selection mode with the mouse if isReadOnly', async () => {
+ let {getByRole, getByLabelText, getByText} = render( );
+
+ let grid = getByRole('grid');
+ let cell = getByLabelText('today', {exact: false});
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(document.activeElement).toBe(cell);
+
+ // try to enter selection mode
+ cell = getByText('17').closest('[role="button"]');
+ await user.click(cell);
+ expect(grid).not.toHaveAttribute('aria-activedescendant');
+ expect(cell.parentElement).not.toHaveAttribute('aria-selected');
+ });
+
+ it('does not enter selection mode with the mouse on range end if isReadOnly', async () => {
+ let {getAllByLabelText, getByText} = render( );
+
+ let cell = getByText('10').closest('[role="button"]');
+ expect(document.activeElement).toBe(cell);
+
+ // try to enter selection mode
+ await user.click(cell);
+ expect(document.activeElement).toBe(cell);
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+
+ cell = getByText('15').closest('[role="button"]');
+ await user.click(cell);
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('20');
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{isDisabled: true}}
+ `('$Name does not select a date on click if isDisabled', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getAllByLabelText, getByText} = render(
+
+ );
+
+ let newDate = getByText('17');
+ await user.click(newDate);
+
+ expect(() => {
+ getAllByLabelText('selected', {exact: false});
+ }).toThrow();
+ expect(onChange).not.toHaveBeenCalled();
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{defaultValue: {start: new CalendarDate(2019, 2, 8), end: new CalendarDate(2019, 2, 15)}, minValue: new CalendarDate(2019, 2, 5), maxValue: new CalendarDate(2019, 2, 15)}}
+ `('$Name does not select a date on click if outside the valid date range', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getByLabelText, getAllByLabelText} = render(
+
+ );
+
+ await user.click(getByLabelText('Sunday, February 3, 2019'));
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('8');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('15');
+ expect(onChange).not.toHaveBeenCalled();
+
+ await user.click(getByLabelText('Sunday, February 17, 2019'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('8');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('15');
+ expect(onChange).not.toHaveBeenCalled();
+
+ await user.click(getByLabelText('Tuesday, February 5, 2019, First available date'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('5');
+ expect(onChange).not.toHaveBeenCalled();
+
+ await user.click(getByLabelText('Friday, February 15, 2019, Last available date'));
+
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('15');
+ expect(onChange).toHaveBeenCalledTimes(1);
+ });
+
+ it.each`
+ Name | RangeCalendar | props
+ ${'v3'} | ${RangeCalendar} | ${{value: {start: new CalendarDate(2019, 6, 5), end: new CalendarDate(2019, 6, 10)}}}
+ `('$Name cancels the selection when the escape key is pressed', async ({RangeCalendar, props}) => {
+ let onChange = jest.fn();
+ let {getByText, getAllByLabelText} = render(
+
+ );
+
+ // start a selection
+ await user.click(getByText('17'));
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('17');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).not.toHaveBeenCalled();
+
+ // highlight some dates
+ fireEvent.pointerEnter(getByText('10'));
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('10');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('17');
+ expect(onChange).not.toHaveBeenCalled();
+
+ // Cancel
+ await user.keyboard('{Escape}');
+
+ // Should revert selection
+ selectedDates = getAllByLabelText('selected', {exact: false});
+ expect(selectedDates[0].textContent).toBe('5');
+ expect(selectedDates[selectedDates.length - 1].textContent).toBe('10');
+ expect(onChange).not.toHaveBeenCalled();
+ });
+
+ it('disables dates not reachable from start date if isDateUnavailable is provided', async () => {
+ const isDateUnavailable = (date) => {
+ const disabledIntervals = [[new CalendarDate(2021, 12, 6), new CalendarDate(2021, 12, 10)], [new CalendarDate(2021, 12, 22), new CalendarDate(2021, 12, 26)]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+ };
+
+ let {getByRole, getAllByLabelText} = render(
+
+ );
+
+ let cellBefore = getByRole('button', {name: 'Sunday, December 5, 2021'});
+ let cellAfter = getByRole('button', {name: 'Monday, December 27, 2021'});
+ expect(cellBefore).toHaveAttribute('tabIndex', '-1');
+ expect(cellBefore).not.toHaveAttribute('aria-disabled');
+ expect(cellAfter).toHaveAttribute('tabIndex', '-1');
+ expect(cellAfter).not.toHaveAttribute('aria-disabled');
+
+ let cell = getByRole('button', {name: 'Sunday, December 12, 2021'});
+ await user.click(cell);
+
+ expect(cellBefore).not.toHaveAttribute('tabIndex');
+ expect(cellBefore).toHaveAttribute('aria-disabled', 'true');
+ expect(cellAfter).not.toHaveAttribute('tabIndex');
+ expect(cellAfter).toHaveAttribute('aria-disabled', 'true');
+
+ let prevButton = getByRole('button', {name: 'Previous'});
+ expect(prevButton).toHaveAttribute('disabled');
+
+ let nextButton = getAllByLabelText('Next')[0];
+ expect(nextButton).toHaveAttribute('disabled');
+
+ cell = getByRole('button', {name: 'Tuesday, December 14, 2021'});
+ await user.click(cell);
+
+ expect(cellBefore).toHaveAttribute('tabIndex', '-1');
+ expect(cellBefore).not.toHaveAttribute('aria-disabled');
+ expect(cellAfter).toHaveAttribute('tabIndex', '-1');
+ expect(cellAfter).not.toHaveAttribute('aria-disabled');
+
+ expect(prevButton).not.toHaveAttribute('disabled');
+ expect(nextButton).not.toHaveAttribute('disabled');
+
+ // Clicking on one of the selected dates should also disable the dates outside the available range.
+ cell = getByRole('button', {name: 'Selected Range: Sunday, December 12 to Tuesday, December 14, 2021, Sunday, December 12, 2021 selected'});
+ await user.click(cell);
+
+ expect(cellBefore).not.toHaveAttribute('tabIndex');
+ expect(cellBefore).toHaveAttribute('aria-disabled', 'true');
+ expect(cellAfter).not.toHaveAttribute('tabIndex');
+ expect(cellAfter).toHaveAttribute('aria-disabled', 'true');
+ expect(prevButton).toHaveAttribute('disabled');
+ expect(nextButton).toHaveAttribute('disabled');
+ });
+
+ it('disables the previous button if the last day of the previous month is unavailable', async () => {
+ const isDateUnavailable = (date) => {
+ const disabledIntervals = [[new CalendarDate(2022, 4, 25), new CalendarDate(2022, 4, 30)]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+ };
+
+ let {getByRole, getAllByLabelText} = render(
+
+ );
+
+ let cell = getByRole('button', {name: /Wednesday, May 4, 2022/});
+ await user.click(cell);
+
+ let prevButton = getByRole('button', {name: 'Previous'});
+ expect(prevButton).toHaveAttribute('disabled');
+
+ for (let nextButton of getAllByLabelText('Next')) {
+ expect(nextButton).not.toHaveAttribute('disabled');
+ }
+ });
+
+ it('disables the next button if the first day of the next month is unavailable', async () => {
+ const isDateUnavailable = (date) => {
+ const disabledIntervals = [[new CalendarDate(2022, 5, 1), new CalendarDate(2022, 5, 4)]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+ };
+
+ let {getByRole, getAllByLabelText} = render(
+
+ );
+
+ let cell = getByRole('button', {name: /Thursday, April 28, 2022/});
+ await user.click(cell);
+
+ let prevButton = getByRole('button', {name: 'Previous'});
+ expect(prevButton).not.toHaveAttribute('disabled');
+
+ let nextButton = getAllByLabelText('Next')[0];
+ expect(nextButton).toHaveAttribute('disabled');
+ });
+
+ it('updates the unavailable dates when navigating', async () => {
+ const isDateUnavailable = (date) => {
+ const disabledIntervals = [[new CalendarDate(2022, 5, 2), new CalendarDate(2022, 5, 4)]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+ };
+
+ let {getByRole, getAllByLabelText} = render(
+
+ );
+
+ let cell = getByRole('button', {name: /Thursday, April 28, 2022/});
+ await user.click(cell);
+
+ let prevButton = getByRole('button', {name: 'Previous'});
+ expect(prevButton).not.toHaveAttribute('disabled');
+
+ for (let nextButton of getAllByLabelText('Next')) {
+ expect(nextButton).not.toHaveAttribute('disabled');
+ }
+
+ await user.click(getAllByLabelText('Next')[0]);
+
+ cell = getByRole('button', {name: 'Sunday, May 1, 2022 selected, Last available date'});
+ expect(cell).not.toHaveAttribute('aria-disabled');
+ expect(cell).toHaveAttribute('tabindex', '0');
+
+ cell = getByRole('button', {name: /Monday, May 2, 2022/});
+ expect(cell).toHaveAttribute('aria-disabled', 'true');
+ });
+
+ it('advances selection backwards when starting a selection at the end of an available range', async () => {
+ const isDateUnavailable = (date) => {
+ const disabledIntervals = [[new CalendarDate(2021, 12, 6), new CalendarDate(2021, 12, 10)], [new CalendarDate(2021, 12, 22), new CalendarDate(2021, 12, 26)]];
+ return disabledIntervals.some((interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0);
+ };
+
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Tuesday, December 21, 2021'});
+ act(() => cell.focus());
+ await user.keyboard('{Enter}');
+
+ let cell2 = getByRole('button', {name: /Monday, December 20, 2021/});
+ expect(document.activeElement).toBe(cell2);
+ expect(cell2.parentElement).toHaveAttribute('aria-selected', 'true');
+ });
+
+ it('does not disable dates not reachable from start date if allowsNonContiguousRanges is provider', async () => {
+ function Example() {
+ let {locale} = useLocale();
+ return (
+ isWeekend(date, locale)}
+ allowsNonContiguousRanges />
+ );
+ }
+
+ let {getByRole} = render( );
+
+ expect(getByRole('button', {name: 'Sunday, December 5, 2021'})).toHaveAttribute('aria-disabled', 'true');
+ expect(getByRole('button', {name: 'Monday, December 6, 2021'})).not.toHaveAttribute('aria-disabled');
+
+ let cell = getByRole('button', {name: 'Tuesday, December 7, 2021'});
+ await user.click(cell);
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+
+ expect(getByRole('button', {name: 'Monday, December 13, 2021'})).not.toHaveAttribute('aria-disabled');
+
+ cell = getByRole('button', {name: 'Tuesday, December 14, 2021'});
+ expect(cell).not.toHaveAttribute('aria-disabled');
+ await user.click(cell);
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+
+ expect(getByRole('button', {name: 'Sunday, December 5, 2021'}).parentElement).not.toHaveAttribute('aria-selected', 'true');
+ });
+
+ it('selects the nearest available date when blurring the calendar', async () => {
+ let onChange = jest.fn();
+ function Example() {
+ let {locale} = useLocale();
+ return (
+ isWeekend(date, locale)}
+ allowsNonContiguousRanges
+ onChange={onChange} />
+ );
+ }
+
+ let {getByRole} = render( );
+
+ let cell = getByRole('button', {name: 'Wednesday, March 9, 2022'});
+ await user.click(cell);
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+
+ await user.keyboard('{PageDown}');
+
+ cell = getByRole('button', {name: 'Saturday, April 9, 2022'});
+ expect(document.activeElement).toBe(cell);
+ expect(cell).toHaveAttribute('aria-disabled', 'true');
+ expect(cell.parentElement).not.toHaveAttribute('aria-selected');
+
+ act(() => cell.blur());
+
+ expect(onChange).toHaveBeenCalledWith({start: new CalendarDate(2022, 3, 9), end: new CalendarDate(2022, 4, 8)});
+ });
+
+ it('should support invalid state', () => {
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Friday, March 11, 2022 selected'});
+ expect(cell).toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-invalid', 'true');
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selected dates unavailable.');
+
+ act(() => cell.focus());
+
+ description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selected dates unavailable. Click to start selecting date range');
+ });
+
+ it('should support a custom errorMessage', () => {
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Friday, March 11, 2022 selected'});
+ expect(cell).toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-invalid', 'true');
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selection dates cannot include weekends.');
+
+ act(() => cell.focus());
+
+ description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selection dates cannot include weekends. Click to start selecting date range');
+ });
+
+ it('does not show error message without isInvalid', () => {
+ let {getByRole} = render(
+
+ );
+
+ let cell = getByRole('button', {name: 'Friday, March 11, 2022 selected'});
+ expect(cell).not.toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).not.toHaveAttribute('aria-invalid', 'true');
+
+ expect(cell).not.toHaveAttribute('aria-describedby');
+ act(() => cell.focus());
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Click to start selecting date range');
+ });
+
+ it('automatically marks selection as invalid using isDateUnavailable', () => {
+ function Example() {
+ let {locale} = useLocale();
+ return (
+ isWeekend(date, locale)}
+ allowsNonContiguousRanges />
+ );
+ }
+
+ let {getByRole} = render( );
+
+ let cell = getByRole('button', {name: 'Friday, March 4, 2022 selected'});
+ expect(cell).toHaveAttribute('aria-invalid', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-selected', 'true');
+ expect(cell.parentElement).toHaveAttribute('aria-invalid', 'true');
+
+ let description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selected dates unavailable.');
+
+ act(() => cell.focus());
+
+ description = cell.getAttribute('aria-describedby').split(' ').map(id => document.getElementById(id).textContent).join(' ');
+ expect(description).toBe('Selected dates unavailable. Click to start selecting date range');
+ });
+ });
+
+ // These tests only work against v3
+ describe('announcing', () => {
+ it('announces when the current month changes', async () => {
+ let {getAllByLabelText} = render( );
+
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('July 2019');
+ });
+
+ it('announces when the selected date range changes', async () => {
+ let {getByText} = render( );
+
+ await user.click(getByText('17'));
+ await user.click(getByText('10'));
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('Selected Range: Monday, June 10 to Monday, June 17, 2019', 'polite', 4000);
+ });
+
+ it('ensures that the active descendant is announced when the focused date changes', async () => {
+ let {getAllByLabelText} = render( );
+
+ let selectedDates = getAllByLabelText('selected', {exact: false});
+
+ expect(selectedDates[0]).toHaveFocus();
+ await user.keyboard('{ArrowRight}');
+
+ expect(selectedDates[1]).toHaveFocus();
+ });
+
+ it('includes era in BC dates', async () => {
+ let {getByText, getAllByLabelText} = render( );
+
+ await user.click(getByText('17'));
+ await user.click(getByText('23'));
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('Selected Range: Saturday, February 17 to Friday, February 23, 5 BC', 'polite', 4000);
+
+ announce.mockReset();
+ let nextButton = getAllByLabelText('Next')[0];
+ await user.click(nextButton);
+
+ expect(announce).toHaveBeenCalledTimes(1);
+ expect(announce).toHaveBeenCalledWith('March 5 BC');
+ });
+ });
+});
diff --git a/packages/@fds-design/card/README.md b/packages/@fds-design/card/README.md
new file mode 100644
index 0000000..9044fd8
--- /dev/null
+++ b/packages/@fds-design/card/README.md
@@ -0,0 +1,3 @@
+# @react-spectrum/card
+
+This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details.
diff --git a/packages/@fds-design/card/chromatic-fc/Card.stories.tsx b/packages/@fds-design/card/chromatic-fc/Card.stories.tsx
new file mode 100644
index 0000000..4ea85d9
--- /dev/null
+++ b/packages/@fds-design/card/chromatic-fc/Card.stories.tsx
@@ -0,0 +1,38 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Card} from '..';
+import {
+ CardStory,
+ WithColorfulIllustration as WithColorfulIllustrationStory,
+ WithIllustration as WithIllustrationStory
+} from '../chromatic/Card.stories';
+import {ComponentMeta} from '@storybook/react';
+import {
+ Default as DefaultCard,
+ Selected as SelectedStory
+} from '../stories/Card.stories';
+
+export default {
+ title: 'Card/default',
+ component: Card,
+ excludeStories: ['WithColorfulIllustratedMessage']
+} as ComponentMeta;
+
+export const Default: CardStory = DefaultCard;
+
+export const WithIllustration: CardStory = WithIllustrationStory;
+
+export const WithColorfulIllustration: CardStory = WithColorfulIllustrationStory;
+
+export const Selected: CardStory = SelectedStory;
diff --git a/packages/@fds-design/card/chromatic-fc/CardView.stories.tsx b/packages/@fds-design/card/chromatic-fc/CardView.stories.tsx
new file mode 100644
index 0000000..394c4ad
--- /dev/null
+++ b/packages/@fds-design/card/chromatic-fc/CardView.stories.tsx
@@ -0,0 +1,24 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {DefaultGrid as DefaultGridStory} from '../chromatic/CardView.stories';
+import {Meta} from '@storybook/react';
+import {SpectrumCardViewProps} from '@react-types/card';
+
+const meta: Meta> = {
+ title: 'CardView'
+};
+
+export default meta;
+
+export const DefaultGrid = DefaultGridStory;
diff --git a/packages/@fds-design/card/chromatic-fc/QuietCard.stories.tsx b/packages/@fds-design/card/chromatic-fc/QuietCard.stories.tsx
new file mode 100644
index 0000000..4f3f26f
--- /dev/null
+++ b/packages/@fds-design/card/chromatic-fc/QuietCard.stories.tsx
@@ -0,0 +1,37 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Card} from '../index';
+import {
+ CardStory,
+ Default,
+ Selected
+} from '../chromatic/Card.stories';
+import {ComponentMeta} from '@storybook/react';
+
+export default {
+ title: 'Card/quiet',
+ component: Card,
+ args: {
+ isQuiet: true
+ }
+} as ComponentMeta;
+
+export const Quiet: CardStory = {
+ ...Default
+};
+
+export const QuietSelected = {
+ ...Selected,
+ name: 'Selected'
+};
diff --git a/packages/@fds-design/card/chromatic/Card.stories.tsx b/packages/@fds-design/card/chromatic/Card.stories.tsx
new file mode 100644
index 0000000..04ebd6e
--- /dev/null
+++ b/packages/@fds-design/card/chromatic/Card.stories.tsx
@@ -0,0 +1,714 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import assetStyles from '@adobe/spectrum-css-temp/components/asset/vars.css';
+import {Card} from '..';
+import {classNames, useSlotProps, useStyleProps} from '@react-spectrum/utils';
+import {ComponentMeta, ComponentStoryObj} from '@storybook/react';
+import {Content} from '@react-spectrum/view';
+import {Default as DefaultCard, Selected as SelectedStory} from '../stories/Card.stories';
+import {Heading, Text} from '@react-spectrum/text';
+import {IllustratedMessage} from '@react-spectrum/illustratedmessage';
+import {Image} from '@react-spectrum/image';
+import React from 'react';
+
+export default {
+ title: 'Card/default',
+ component: Card,
+ excludeStories: ['WithColorfulIllustratedMessage']
+} as ComponentMeta;
+
+export type CardStory = ComponentStoryObj;
+
+export const Default = DefaultCard;
+
+export const DefaultSquare: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ Description
+ >
+ )
+ }
+};
+
+export const DefaultTall: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ Description
+ >
+ )
+ }
+};
+
+export const DefaultPreviewAlt: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ Description
+ >
+ )
+ }
+};
+
+export const LongContent: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ This is the description that never ends, it goes on and on my friends. Someone started typing without knowing what it was.
+ >
+ )
+ }
+};
+
+export const LongContentSquare: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ This is the description that never ends, it goes on and on my friends. Someone started typing without knowing what it was.
+ >
+ )
+ }
+};
+
+export const LongContentPoorWordSize: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ Rechtsschutzversicherungsgesellschaften Nahrungsmittelunverträglichkeit Unabhängigkeitserklärungen Freundschaftsbeziehungen
+ >
+ )
+ }
+};
+
+export const NoDescription: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ >
+ )
+ }
+};
+
+export const NoDescriptionSquare: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ >
+ )
+ }
+};
+
+export const NoImage: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+ Title
+ PNG
+ >
+ )
+ }
+};
+
+export const WithIllustration: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ >
+ )
+ }
+};
+
+export const WithColorfulIllustration: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ >
+ )
+ },
+ parameters: {description: {data: 'ignore the no white background, the svg just has a transparent background'}}
+};
+
+// doesn't work right now, Illustrated Message messes with the styles and has some other interference
+export const WithColorfulIllustratedMessage: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ PNG
+ >
+ )
+ },
+ parameters: {description: {data: 'does not work right now, Illustrated Message messes with the styles and has some other interference. We may not even want to support it this way.'}}
+};
+
+export const LongTitle: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ This is a long title about how dinosaurs used to rule the earth before a meteor came and wiped them all out
+ PNG
+ Description
+ >
+ )
+ }
+};
+
+export const LongDescription: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+ {/* TODO: what to do about image requiring an alt in TS, Card provides an empty alt so this is fine */}
+
+ Title
+ PNG
+ This is a long description about the Pterodactyl, a pterosaur of the late Jurassic period, with a long slender head and neck and a very short tail.
+ >
+ )
+ }
+};
+
+export const LongDetail: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Title
+ Stats: Genus: Pterodactylus; Rafinesque, 1815 Order: Pterosauria Kingdom: Animalia Phylum: Chordata
+ Description
+ >
+ )
+ }
+};
+
+export const LongEverything: CardStory = {
+ ...Default,
+ args: {
+ children: (
+ <>
+
+ Rechtsschutzversicherungsgesellschaften Nahrungsmittelunverträglichkeit Unabhängigkeitserklärungen Freundschaftsbeziehungen
+ Rechtsschutzversicherungsgesellschaften Nahrungsmittelunverträglichkeit Unabhängigkeitserklärungen Freundschaftsbeziehungen
+ Rechtsschutzversicherungsgesellschaften Nahrungsmittelunverträglichkeit Unabhängigkeitserklärungen Freundschaftsbeziehungen
+ >
+ )
+ }
+};
+
+export const Selected: CardStory = SelectedStory;
+
+// actually use Illustration???
+// where to get the three asset svgs to use with Illustration
+export function File(props) {
+ props = useSlotProps(props, 'asset');
+ let {styleProps} = useStyleProps(props);
+ return (
+
+ );
+}
+
+function IllustrationContainer(props) {
+ props = useSlotProps(props, 'illustration');
+ let {styleProps} = useStyleProps(props);
+ return (
+
+ {props.children}
+
+ );
+}
+
+// disable the rest, it's for show
+/* eslint-disable */
+function ColorfulIllustration(props) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {'DON’T @HERE ME'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {'DON’T @HERE ME'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/@fds-design/card/chromatic/CardView.stories.tsx b/packages/@fds-design/card/chromatic/CardView.stories.tsx
new file mode 100644
index 0000000..804d825
--- /dev/null
+++ b/packages/@fds-design/card/chromatic/CardView.stories.tsx
@@ -0,0 +1,92 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Card, CardView, GalleryLayout, GridLayout, WaterfallLayout} from '..';
+import {Content} from '@react-spectrum/view';
+import {Heading, Text} from '@react-spectrum/text';
+import {Image} from '@react-spectrum/image';
+import {Meta} from '@storybook/react';
+import React, {useMemo} from 'react';
+import {SpectrumCardViewProps} from '@react-types/card';
+import {useCollator} from '@react-aria/i18n';
+
+const meta: Meta> = {
+ title: 'CardView'
+};
+
+export default meta;
+
+let itemsLowVariance = [
+ {width: 1001, height: 381, src: 'https://i.imgur.com/Z7AzH2c.jpg', id: 1, title: 'Bob 1'},
+ {width: 640, height: 640, src: 'https://i.imgur.com/DhygPot.jpg', id: 2, title: 'Joe 1'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 3, title: 'Jane 1'},
+ {width: 1516, height: 1009, src: 'https://i.imgur.com/1nScMIH.jpg', id: 4, title: 'Bob 2'},
+ {width: 640, height: 640, src: 'https://i.imgur.com/DhygPot.jpg', id: 5, title: 'Joe 2'},
+ {width: 1516, height: 1009, src: 'https://i.imgur.com/1nScMIH.jpg', id: 6, title: 'Jane 2'},
+ {width: 1001, height: 381, src: 'https://i.imgur.com/Z7AzH2c.jpg', id: 7, title: 'Bob 3'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 8, title: 'Joe 3'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 9, title: 'Jane 3'},
+ {width: 1516, height: 1009, src: 'https://i.imgur.com/1nScMIH.jpg', id: 10, title: 'Bob 4'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 11, title: 'Joe 4'},
+ {width: 1001, height: 381, src: 'https://i.imgur.com/Z7AzH2c.jpg', id: 12, title: 'Jane 4'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 13, title: 'Bob 5'},
+ {width: 1516, height: 1009, src: 'https://i.imgur.com/1nScMIH.jpg', id: 14, title: 'Joe 5'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 15, title: 'Jane 5'},
+ {width: 1516, height: 1009, src: 'https://i.imgur.com/1nScMIH.jpg', id: 16, title: 'Bob 6'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 17, title: 'Joe 6'},
+ {width: 640, height: 640, src: 'https://i.imgur.com/DhygPot.jpg', id: 18, title: 'Jane 6'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 19, title: 'Bob 7'},
+ {width: 1001, height: 381, src: 'https://i.imgur.com/Z7AzH2c.jpg', id: 20, title: 'Joe 7'},
+ {width: 1516, height: 1009, src: 'https://i.imgur.com/1nScMIH.jpg', id: 21, title: 'Jane 7'},
+ {width: 314, height: 1009, src: 'https://i.imgur.com/3lzeoK7.jpg', id: 22, title: 'Bob 8'}
+];
+
+function DynamicCardView(props: SpectrumCardViewProps) {
+ let collator = useCollator({usage: 'search', sensitivity: 'base'});
+ let gridLayout = useMemo(() => new GridLayout({collator}), [collator]);
+ let {
+ layout = gridLayout,
+ items
+ } = props;
+
+ return (
+
+ {(item: any) => (
+
+
+ {item.title}
+ PNG
+ Description
+
+ )}
+
+ );
+}
+
+const Template = (props) =>
+ ;
+
+export const DefaultGrid = {
+ render: Template,
+ args: {items: itemsLowVariance}
+};
+
+export const DefaultGallery = {
+ render: Template,
+ args: {items: itemsLowVariance, layout: GalleryLayout}
+};
+
+export const DefaultWaterfall = {
+ render: Template,
+ args: {items: itemsLowVariance, layout: WaterfallLayout}
+};
diff --git a/packages/@fds-design/card/chromatic/HorizontalCard.stories.tsx b/packages/@fds-design/card/chromatic/HorizontalCard.stories.tsx
new file mode 100644
index 0000000..838c89b
--- /dev/null
+++ b/packages/@fds-design/card/chromatic/HorizontalCard.stories.tsx
@@ -0,0 +1,95 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Card} from '../index';
+import {
+ CardStory,
+ Default,
+ DefaultSquare,
+ DefaultTall,
+ LongContent,
+ LongDetail,
+ LongTitle,
+ NoDescription,
+ NoDescriptionSquare,
+ WithIllustration
+} from './Card.stories';
+import {ComponentMeta} from '@storybook/react';
+import React from 'react';
+
+export default {
+ title: 'Card/horizontal',
+ component: Card,
+ args: {
+ orientation: 'horizontal'
+ }
+} as ComponentMeta;
+
+export const Horizontal: CardStory = {
+ ...Default,
+ decorators: [
+ (Story) => (
+
+
+
+ )
+ ]
+};
+
+export const HorizontalSquare: CardStory = {
+ ...DefaultSquare,
+ ...Horizontal,
+ args: {...DefaultSquare.args}
+};
+
+export const HorizontalTall: CardStory = {
+ ...DefaultTall,
+ ...Horizontal,
+ args: {...DefaultTall.args}
+};
+
+export const HorizontalNoDescription: CardStory = {
+ ...NoDescription,
+ ...Horizontal,
+ args: {...NoDescription.args}
+};
+
+export const HorizontalNoDescriptionSquare: CardStory = {
+ ...NoDescriptionSquare,
+ ...Horizontal,
+ args: {...NoDescriptionSquare.args}
+};
+
+export const HorizontalWithIllustration: CardStory = {
+ ...WithIllustration,
+ ...Horizontal,
+ args: {...WithIllustration.args}
+};
+
+export const HorizontalLongTitle: CardStory = {
+ ...LongTitle,
+ ...Horizontal,
+ args: {...LongTitle.args}
+};
+
+export const HorizontalLongDescription: CardStory = {
+ ...LongContent,
+ ...Horizontal,
+ args: {...LongContent.args}
+};
+
+export const HorizontalLongDetail: CardStory = {
+ ...LongDetail,
+ ...Horizontal,
+ args: {...LongDetail.args}
+};
diff --git a/packages/@fds-design/card/chromatic/QuietCard.stories.tsx b/packages/@fds-design/card/chromatic/QuietCard.stories.tsx
new file mode 100644
index 0000000..abc9390
--- /dev/null
+++ b/packages/@fds-design/card/chromatic/QuietCard.stories.tsx
@@ -0,0 +1,87 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Card} from '../index';
+import {
+ CardStory,
+ Default,
+ DefaultSquare,
+ DefaultTall,
+ LongContentPoorWordSize,
+ LongDescription,
+ LongDetail,
+ LongEverything,
+ LongTitle,
+ NoDescription,
+ NoDescriptionSquare,
+ Selected,
+ WithIllustration
+} from './Card.stories';
+import {ComponentMeta} from '@storybook/react';
+
+export default {
+ title: 'Card/quiet',
+ component: Card,
+ args: {
+ isQuiet: true
+ }
+} as ComponentMeta;
+
+export const Quiet: CardStory = {
+ ...Default
+};
+
+export const QuietSquare = {
+ ...DefaultSquare
+};
+
+export const QuietTall = {
+ ...DefaultTall
+};
+
+export const QuietNoDescription = {
+ ...NoDescription
+};
+
+export const QuietNoDescriptionSquare = {
+ ...NoDescriptionSquare
+};
+
+export const QuietWithIllustration = {
+ ...WithIllustration
+};
+
+export const QuietLongTitle = {
+ ...LongTitle
+};
+
+export const QuietLongDescription = {
+ ...LongDescription
+};
+
+export const QuietLongContentPoorWordSize = {
+ ...LongContentPoorWordSize
+};
+
+export const QuietLongDetail = {
+ ...LongDetail
+};
+
+export const QuietLongEverything = {
+ ...LongEverything
+};
+
+export const QuietSelected = {
+ ...Selected,
+ name: 'Selected'
+};
diff --git a/packages/@fds-design/card/docs/Card.mdx.placeholder b/packages/@fds-design/card/docs/Card.mdx.placeholder
new file mode 100644
index 0000000..e69de29
diff --git a/packages/@fds-design/card/index.ts b/packages/@fds-design/card/index.ts
new file mode 100644
index 0000000..b1a5da0
--- /dev/null
+++ b/packages/@fds-design/card/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2021 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.
+ */
+
+export * from './src';
diff --git a/packages/@fds-design/card/intl/ar-AE.json b/packages/@fds-design/card/intl/ar-AE.json
new file mode 100644
index 0000000..73f8c69
--- /dev/null
+++ b/packages/@fds-design/card/intl/ar-AE.json
@@ -0,0 +1,4 @@
+{
+ "loading": "جارٍ التحميل...",
+ "loadingMore": "جارٍ تحميل المزيد..."
+}
diff --git a/packages/@fds-design/card/intl/bg-BG.json b/packages/@fds-design/card/intl/bg-BG.json
new file mode 100644
index 0000000..087cb32
--- /dev/null
+++ b/packages/@fds-design/card/intl/bg-BG.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Зареждане...",
+ "loadingMore": "Зареждане на още..."
+}
diff --git a/packages/@fds-design/card/intl/cs-CZ.json b/packages/@fds-design/card/intl/cs-CZ.json
new file mode 100644
index 0000000..294f05b
--- /dev/null
+++ b/packages/@fds-design/card/intl/cs-CZ.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Načítání...",
+ "loadingMore": "Načítání dalších..."
+}
diff --git a/packages/@fds-design/card/intl/da-DK.json b/packages/@fds-design/card/intl/da-DK.json
new file mode 100644
index 0000000..ede7725
--- /dev/null
+++ b/packages/@fds-design/card/intl/da-DK.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Indlæser...",
+ "loadingMore": "Indlæser flere..."
+}
diff --git a/packages/@fds-design/card/intl/de-DE.json b/packages/@fds-design/card/intl/de-DE.json
new file mode 100644
index 0000000..e581256
--- /dev/null
+++ b/packages/@fds-design/card/intl/de-DE.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Wird geladen...",
+ "loadingMore": "Noch mehr wird geladen..."
+}
diff --git a/packages/@fds-design/card/intl/el-GR.json b/packages/@fds-design/card/intl/el-GR.json
new file mode 100644
index 0000000..95be06c
--- /dev/null
+++ b/packages/@fds-design/card/intl/el-GR.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Φόρτωση...",
+ "loadingMore": "Φόρτωση περισσότερων..."
+}
diff --git a/packages/@fds-design/card/intl/en-US.json b/packages/@fds-design/card/intl/en-US.json
new file mode 100644
index 0000000..00097c8
--- /dev/null
+++ b/packages/@fds-design/card/intl/en-US.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Loading…",
+ "loadingMore": "Loading more…"
+}
diff --git a/packages/@fds-design/card/intl/es-ES.json b/packages/@fds-design/card/intl/es-ES.json
new file mode 100644
index 0000000..b145a80
--- /dev/null
+++ b/packages/@fds-design/card/intl/es-ES.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Cargando…",
+ "loadingMore": "Cargando más…"
+}
diff --git a/packages/@fds-design/card/intl/et-EE.json b/packages/@fds-design/card/intl/et-EE.json
new file mode 100644
index 0000000..cec4743
--- /dev/null
+++ b/packages/@fds-design/card/intl/et-EE.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Laadimine...",
+ "loadingMore": "Laadi rohkem..."
+}
diff --git a/packages/@fds-design/card/intl/fi-FI.json b/packages/@fds-design/card/intl/fi-FI.json
new file mode 100644
index 0000000..c616e00
--- /dev/null
+++ b/packages/@fds-design/card/intl/fi-FI.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Ladataan…",
+ "loadingMore": "Ladataan lisää…"
+}
diff --git a/packages/@fds-design/card/intl/fr-FR.json b/packages/@fds-design/card/intl/fr-FR.json
new file mode 100644
index 0000000..7cb0de8
--- /dev/null
+++ b/packages/@fds-design/card/intl/fr-FR.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Chargement en cours…",
+ "loadingMore": "Chargement d’autres d’éléments…"
+}
diff --git a/packages/@fds-design/card/intl/he-IL.json b/packages/@fds-design/card/intl/he-IL.json
new file mode 100644
index 0000000..659bb62
--- /dev/null
+++ b/packages/@fds-design/card/intl/he-IL.json
@@ -0,0 +1,4 @@
+{
+ "loading": "טוען...",
+ "loadingMore": "טוען עוד..."
+}
diff --git a/packages/@fds-design/card/intl/hr-HR.json b/packages/@fds-design/card/intl/hr-HR.json
new file mode 100644
index 0000000..9a7af2e
--- /dev/null
+++ b/packages/@fds-design/card/intl/hr-HR.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Učitavam...",
+ "loadingMore": "Učitavam još..."
+}
diff --git a/packages/@fds-design/card/intl/hu-HU.json b/packages/@fds-design/card/intl/hu-HU.json
new file mode 100644
index 0000000..d2944b2
--- /dev/null
+++ b/packages/@fds-design/card/intl/hu-HU.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Betöltés folyamatban…",
+ "loadingMore": "Továbbiak betöltése folyamatban…"
+}
diff --git a/packages/@fds-design/card/intl/it-IT.json b/packages/@fds-design/card/intl/it-IT.json
new file mode 100644
index 0000000..ac98cb0
--- /dev/null
+++ b/packages/@fds-design/card/intl/it-IT.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Caricamento...",
+ "loadingMore": "Caricamento altri..."
+}
diff --git a/packages/@fds-design/card/intl/ja-JP.json b/packages/@fds-design/card/intl/ja-JP.json
new file mode 100644
index 0000000..496f4b0
--- /dev/null
+++ b/packages/@fds-design/card/intl/ja-JP.json
@@ -0,0 +1,4 @@
+{
+ "loading": "読み込み中...",
+ "loadingMore": "さらに読み込み中..."
+}
diff --git a/packages/@fds-design/card/intl/ko-KR.json b/packages/@fds-design/card/intl/ko-KR.json
new file mode 100644
index 0000000..2237c62
--- /dev/null
+++ b/packages/@fds-design/card/intl/ko-KR.json
@@ -0,0 +1,4 @@
+{
+ "loading": "로드 중…",
+ "loadingMore": "추가 로드 중…"
+}
diff --git a/packages/@fds-design/card/intl/lt-LT.json b/packages/@fds-design/card/intl/lt-LT.json
new file mode 100644
index 0000000..e65798d
--- /dev/null
+++ b/packages/@fds-design/card/intl/lt-LT.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Įkeliama…",
+ "loadingMore": "Įkeliama daugiau…"
+}
diff --git a/packages/@fds-design/card/intl/lv-LV.json b/packages/@fds-design/card/intl/lv-LV.json
new file mode 100644
index 0000000..bd55205
--- /dev/null
+++ b/packages/@fds-design/card/intl/lv-LV.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Notiek ielāde…",
+ "loadingMore": "Tiek ielādēts vēl..."
+}
diff --git a/packages/@fds-design/card/intl/nb-NO.json b/packages/@fds-design/card/intl/nb-NO.json
new file mode 100644
index 0000000..a4e1880
--- /dev/null
+++ b/packages/@fds-design/card/intl/nb-NO.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Laster inn...",
+ "loadingMore": "Laster inn flere..."
+}
diff --git a/packages/@fds-design/card/intl/nl-NL.json b/packages/@fds-design/card/intl/nl-NL.json
new file mode 100644
index 0000000..ea41fb1
--- /dev/null
+++ b/packages/@fds-design/card/intl/nl-NL.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Laden...",
+ "loadingMore": "Meer laden..."
+}
diff --git a/packages/@fds-design/card/intl/pl-PL.json b/packages/@fds-design/card/intl/pl-PL.json
new file mode 100644
index 0000000..a1ded10
--- /dev/null
+++ b/packages/@fds-design/card/intl/pl-PL.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Wczytywanie...",
+ "loadingMore": "Wczytywanie większej liczby..."
+}
diff --git a/packages/@fds-design/card/intl/pt-BR.json b/packages/@fds-design/card/intl/pt-BR.json
new file mode 100644
index 0000000..2332235
--- /dev/null
+++ b/packages/@fds-design/card/intl/pt-BR.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Carregando...",
+ "loadingMore": "Carregando mais..."
+}
diff --git a/packages/@fds-design/card/intl/pt-PT.json b/packages/@fds-design/card/intl/pt-PT.json
new file mode 100644
index 0000000..bda4e82
--- /dev/null
+++ b/packages/@fds-design/card/intl/pt-PT.json
@@ -0,0 +1,4 @@
+{
+ "loading": "A carregar...",
+ "loadingMore": "A carregar mais..."
+}
diff --git a/packages/@fds-design/card/intl/ro-RO.json b/packages/@fds-design/card/intl/ro-RO.json
new file mode 100644
index 0000000..82518d7
--- /dev/null
+++ b/packages/@fds-design/card/intl/ro-RO.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Se încarcă...",
+ "loadingMore": "Se încarcă mai multe..."
+}
diff --git a/packages/@fds-design/card/intl/ru-RU.json b/packages/@fds-design/card/intl/ru-RU.json
new file mode 100644
index 0000000..fbb6757
--- /dev/null
+++ b/packages/@fds-design/card/intl/ru-RU.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Загрузка...",
+ "loadingMore": "Дополнительная загрузка..."
+}
diff --git a/packages/@fds-design/card/intl/sk-SK.json b/packages/@fds-design/card/intl/sk-SK.json
new file mode 100644
index 0000000..f710481
--- /dev/null
+++ b/packages/@fds-design/card/intl/sk-SK.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Načítava sa...",
+ "loadingMore": "Načítava sa viac..."
+}
diff --git a/packages/@fds-design/card/intl/sl-SI.json b/packages/@fds-design/card/intl/sl-SI.json
new file mode 100644
index 0000000..bdfe54a
--- /dev/null
+++ b/packages/@fds-design/card/intl/sl-SI.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Nalaganje...",
+ "loadingMore": "Nalaganje dodatne vsebine..."
+}
diff --git a/packages/@fds-design/card/intl/sr-SP.json b/packages/@fds-design/card/intl/sr-SP.json
new file mode 100644
index 0000000..9a7af2e
--- /dev/null
+++ b/packages/@fds-design/card/intl/sr-SP.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Učitavam...",
+ "loadingMore": "Učitavam još..."
+}
diff --git a/packages/@fds-design/card/intl/sv-SE.json b/packages/@fds-design/card/intl/sv-SE.json
new file mode 100644
index 0000000..ccd30ee
--- /dev/null
+++ b/packages/@fds-design/card/intl/sv-SE.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Läser in...",
+ "loadingMore": "Läser in mer..."
+}
diff --git a/packages/@fds-design/card/intl/tr-TR.json b/packages/@fds-design/card/intl/tr-TR.json
new file mode 100644
index 0000000..b69e4b4
--- /dev/null
+++ b/packages/@fds-design/card/intl/tr-TR.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Yükleniyor...",
+ "loadingMore": "Daha fazla yükleniyor..."
+}
diff --git a/packages/@fds-design/card/intl/uk-UA.json b/packages/@fds-design/card/intl/uk-UA.json
new file mode 100644
index 0000000..bc50fbe
--- /dev/null
+++ b/packages/@fds-design/card/intl/uk-UA.json
@@ -0,0 +1,4 @@
+{
+ "loading": "Завантаження…",
+ "loadingMore": "Завантаження інших об’єктів..."
+}
diff --git a/packages/@fds-design/card/intl/zh-CN.json b/packages/@fds-design/card/intl/zh-CN.json
new file mode 100644
index 0000000..a9c683b
--- /dev/null
+++ b/packages/@fds-design/card/intl/zh-CN.json
@@ -0,0 +1,4 @@
+{
+ "loading": "正在加载...",
+ "loadingMore": "正在加载更多..."
+}
diff --git a/packages/@fds-design/card/intl/zh-TW.json b/packages/@fds-design/card/intl/zh-TW.json
new file mode 100644
index 0000000..85b3fee
--- /dev/null
+++ b/packages/@fds-design/card/intl/zh-TW.json
@@ -0,0 +1,4 @@
+{
+ "loading": "載入中…",
+ "loadingMore": "正在載入更多…"
+}
diff --git a/packages/@fds-design/card/package.json b/packages/@fds-design/card/package.json
new file mode 100644
index 0000000..be59114
--- /dev/null
+++ b/packages/@fds-design/card/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "@fds-design/card",
+ "version": "3.0.0-alpha.38",
+ "description": "Spectrum UI components in React",
+ "license": "Apache-2.0",
+ "main": "dist/main.js",
+ "module": "dist/module.js",
+ "exports": {
+ "types": "./dist/types.d.ts",
+ "import": "./dist/import.mjs",
+ "require": "./dist/main.js"
+ },
+ "types": "dist/types.d.ts",
+ "source": "src/index.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "sideEffects": [
+ "*.css"
+ ],
+ "targets": {
+ "targets": {
+ "main": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ },
+ "module": {
+ "includeNodeModules": [
+ "file:../../fds-css"
+ ]
+ }
+}
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/bcgov/fds-design"
+ },
+ "dependencies": {
+ "@react-aria/focus": "^3.19.0",
+ "@react-aria/grid": "^3.11.0",
+ "@react-aria/i18n": "^3.12.4",
+ "@react-aria/interactions": "^3.22.5",
+ "@react-aria/utils": "^3.26.0",
+ "@react-aria/virtualizer": "^4.1.0",
+ "@react-spectrum/checkbox": "file:../../checkbox",
+ "@react-spectrum/progress": "file:../../progress",
+ "@react-spectrum/utils": "file:../../utils",
+ "@react-stately/collections": "^3.12.0",
+ "@react-stately/grid": "^3.10.0",
+ "@react-stately/list": "^3.11.1",
+ "@react-stately/virtualizer": "^4.2.0",
+ "@react-types/card": "3.0.0-alpha.31",
+ "@react-types/provider": "^3.8.5",
+ "@react-types/shared": "^3.26.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "devDependencies": {
+ "@adobe/spectrum-css-temp": "3.0.0-alpha.1"
+ },
+ "peerDependencies": {
+ "@react-spectrum/provider": "file:../../provider",
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/@fds-design/card/src/BaseLayout.tsx b/packages/@fds-design/card/src/BaseLayout.tsx
new file mode 100644
index 0000000..d2ce334
--- /dev/null
+++ b/packages/@fds-design/card/src/BaseLayout.tsx
@@ -0,0 +1,290 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {Direction, Key, KeyboardDelegate, Node} from '@react-types/shared';
+import {getChildNodes, getFirstItem} from '@react-stately/collections';
+import {GridCollection} from '@react-stately/grid';
+import {InvalidationContext, Layout, LayoutInfo, Rect, Size} from '@react-stately/virtualizer';
+import {Scale} from '@react-types/provider';
+
+export interface BaseLayoutOptions {
+ collator?: Intl.Collator,
+ // TODO: is this valid or is scale a spectrum specific thing that should be left out of the layouts?
+ scale?: Scale,
+ /**
+ * The margin around the grid view between the edges and the items.
+ * @default 24
+ */
+ margin?: number
+}
+
+interface CardViewLayoutOptions {
+ isLoading: boolean,
+ direction: Direction
+}
+
+export class BaseLayout extends Layout, CardViewLayoutOptions> implements KeyboardDelegate {
+ protected contentSize: Size;
+ protected layoutInfos: Map;
+ protected collator: Intl.Collator;
+ protected lastCollection: GridCollection;
+ collection: GridCollection;
+ isLoading: boolean;
+ disabledKeys: Set = new Set();
+ direction: Direction;
+ scale: Scale;
+ margin: number;
+
+ constructor(options: BaseLayoutOptions = {}) {
+ super();
+ this.layoutInfos = new Map();
+ this.collator = options.collator;
+ this.lastCollection = null;
+ this.scale = options.scale || 'medium';
+ this.margin = options.margin || 24;
+ }
+
+ update(invalidationContext: InvalidationContext) {
+ this.collection = this.virtualizer.collection as GridCollection;
+ this.isLoading = invalidationContext.layoutOptions?.isLoading || false;
+ this.direction = invalidationContext.layoutOptions?.direction || 'ltr';
+ this.buildCollection(invalidationContext);
+
+ // Remove layout info that doesn't exist in new collection
+ if (this.lastCollection) {
+ for (let key of this.lastCollection.getKeys()) {
+ if (!this.collection.getItem(key)) {
+ this.layoutInfos.delete(key);
+ }
+ }
+
+ if (!this.isLoading) {
+ this.layoutInfos.delete('loader');
+ }
+
+ if (this.collection.size > 0) {
+ this.layoutInfos.delete('placeholder');
+ }
+ }
+
+ this.lastCollection = this.collection;
+ }
+
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ buildCollection(invalidationContext?: InvalidationContext) {}
+
+ getContentSize() {
+ return this.contentSize;
+ }
+
+ getLayoutInfo(key: Key) {
+ return this.layoutInfos.get(key)!;
+ }
+
+ getVisibleLayoutInfos(rect: Rect, excludePersistedKeys = false) {
+ let res: LayoutInfo[] = [];
+
+ for (let layoutInfo of this.layoutInfos.values()) {
+ if (this.isVisible(layoutInfo, rect, excludePersistedKeys)) {
+ res.push(layoutInfo);
+ }
+ }
+
+ return res;
+ }
+
+ isVisible(layoutInfo: LayoutInfo, rect: Rect, excludePersistedKeys: boolean) {
+ if (layoutInfo.rect.intersects(rect)) {
+ return true;
+ }
+
+ if (!excludePersistedKeys) {
+ return this.virtualizer.isPersistedKey(layoutInfo.key);
+ }
+
+ return false;
+ }
+
+ _findClosestLayoutInfo(target: Rect, rect: Rect) {
+ let layoutInfos = this.getVisibleLayoutInfos(rect, true);
+ let best = null;
+ let bestDistance = Infinity;
+
+ // Calculates distance as the distance between the center of 2 rects.
+ for (let cur of layoutInfos) {
+ if (cur.type === 'item') {
+ let curRect = cur.rect;
+ let targetMidX = (target.x + target.maxX) / 2;
+ let targetMidY = (target.y + target.maxY) / 2;
+ let curMidX = (curRect.x + curRect.maxX) / 2;
+ let curMidY = (curRect.y + curRect.maxY) / 2;
+ let dist = Math.pow(targetMidX - curMidX, 2) + Math.pow(targetMidY - curMidY, 2);
+ if (dist < bestDistance) {
+ best = cur;
+ bestDistance = dist;
+ }
+ }
+ }
+
+ return best;
+ }
+
+ _findClosest(target: Rect, rect: Rect) {
+ let best = this._findClosestLayoutInfo(target, rect);
+ return best || null;
+ }
+
+ getKeyBelow(key: Key) {
+ // Expected key is the currently focused cell so we need the parent row key
+ let parentRowKey = this.collection.getItem(key).parentKey;
+ let layoutInfo = this.getLayoutInfo(parentRowKey);
+ let rect = new Rect(layoutInfo.rect.x, layoutInfo.rect.maxY + 1, layoutInfo.rect.width, this.virtualizer.visibleRect.height);
+ let closestRow = this.collection.getItem(this._findClosest(layoutInfo.rect, rect)?.key);
+ return getFirstItem(getChildNodes(closestRow, this.collection))?.key;
+ }
+
+ getKeyAbove(key: Key) {
+ // Expected key is the currently focused cell so we need the parent row key
+ let parentRowKey = this.collection.getItem(key).parentKey;
+ let layoutInfo = this.getLayoutInfo(parentRowKey);
+ let rect = new Rect(layoutInfo.rect.x, 0, layoutInfo.rect.width, layoutInfo.rect.y - 1);
+ let closestRow = this.collection.getItem(this._findClosest(layoutInfo.rect, rect)?.key);
+ return getFirstItem(getChildNodes(closestRow, this.collection))?.key;
+ }
+
+ getKeyRightOf(key: Key) {
+ // Expected key is the currently focused cell so we need the parent row key
+ let parentRowKey = this.collection.getItem(key).parentKey;
+ key = this.direction === 'rtl' ? this.collection.getKeyBefore(parentRowKey) : this.collection.getKeyAfter(parentRowKey);
+
+ while (key != null) {
+ let item = this.collection.getItem(key);
+ // Don't check if item is disabled because we want to be able to focus disabled items in a grid (double check this)
+ if (item.type === 'item') {
+ return getFirstItem(getChildNodes(item, this.collection))?.key;
+ }
+ key = this.direction === 'rtl' ? this.collection.getKeyBefore(key) : this.collection.getKeyAfter(key);
+ }
+ }
+
+ getKeyLeftOf(key: Key) {
+ // Expected key is the currently focused cell so we need the parent row key
+ let parentRowKey = this.collection.getItem(key).parentKey;
+ key = this.direction === 'rtl' ? this.collection.getKeyAfter(parentRowKey) : this.collection.getKeyBefore(parentRowKey);
+ while (key != null) {
+ let item = this.collection.getItem(key);
+ // Don't check if item is disabled because we want to be able to focus disabled items in a grid (double check this)
+ if (item.type === 'item') {
+ return getFirstItem(getChildNodes(item, this.collection))?.key;
+ }
+
+ key = this.direction === 'rtl' ? this.collection.getKeyAfter(key) : this.collection.getKeyBefore(key);
+ }
+ }
+
+ getFirstKey() {
+ let firstRow = this.collection.getItem(this.collection.getFirstKey());
+ return getFirstItem(getChildNodes(firstRow, this.collection))?.key;
+ }
+
+ getLastKey() {
+ let lastRow = this.collection.getItem(this.collection.getLastKey());
+ return getFirstItem(getChildNodes(lastRow, this.collection))?.key;
+ }
+
+ // TODO: pretty unwieldy because it needs to bounce back and forth between the parent key and the child key
+ // Perhaps have layoutInfo store childKey as well so we don't need to do this? Or maybe make the layoutInfos be the cells instead of the rows?
+ getKeyPageAbove(key: Key) {
+ // Expected key is the currently focused cell so we need the parent row key
+ let parentRowKey = this.collection.getItem(key).parentKey;
+ let layoutInfo = this.getLayoutInfo(parentRowKey);
+
+ if (layoutInfo) {
+ let pageY = Math.max(0, layoutInfo.rect.y + layoutInfo.rect.height - this.virtualizer.visibleRect.height);
+ // If the node is so large that it spans multiple page heights, return the key of the item immediately above
+ // Otherwise keep going up until we exceed a single page height worth of nodes
+ let keyAbove = this.collection.getItem(this.getKeyAbove(key))?.parentKey;
+ layoutInfo = this.getLayoutInfo(keyAbove);
+
+ if (layoutInfo && layoutInfo.rect.y > pageY) {
+ while (layoutInfo && layoutInfo.rect.y > pageY) {
+ let childKey = getFirstItem(getChildNodes(this.collection.getItem(layoutInfo.key), this.collection))?.key;
+ let keyAbove = this.collection.getItem(this.getKeyAbove(childKey))?.parentKey;
+ layoutInfo = this.getLayoutInfo(keyAbove);
+ }
+ }
+
+ if (layoutInfo) {
+ let childKey = getFirstItem(getChildNodes(this.collection.getItem(layoutInfo.key), this.collection))?.key;
+ return childKey;
+ }
+ }
+
+ return this.getFirstKey();
+ }
+
+ // TODO: pretty unwieldy because it needs to bounce back and forth between the parent key and the child key
+ // Perhaps have layoutInfo store childKey as well so we don't need to do this?
+ getKeyPageBelow(key: Key) {
+ // Expected key is the currently focused cell so we need the parent row key
+ let parentRowKey = this.collection.getItem(key).parentKey;
+ let layoutInfo = this.getLayoutInfo(parentRowKey);
+ if (layoutInfo) {
+ let pageY = Math.min(this.virtualizer.contentSize.height, layoutInfo.rect.y - layoutInfo.rect.height + this.virtualizer.visibleRect.height);
+ // If the node is so large that it spans multiple page heights, return the key of the item immediately below
+ // Otherwise keep going up until we exceed a single page height worth of nodes
+ let keyBelow = this.collection.getItem(this.getKeyBelow(key))?.parentKey;
+ layoutInfo = this.getLayoutInfo(keyBelow);
+ if (layoutInfo && layoutInfo.rect.y < pageY) {
+ while (layoutInfo && layoutInfo.rect.y < pageY) {
+ let childKey = getFirstItem(getChildNodes(this.collection.getItem(layoutInfo.key), this.collection))?.key;
+ let keyBelow = this.collection.getItem(this.getKeyBelow(childKey))?.parentKey;
+ layoutInfo = this.getLayoutInfo(keyBelow);
+ }
+ }
+
+ if (layoutInfo) {
+ let childKey = getFirstItem(getChildNodes(this.collection.getItem(layoutInfo.key), this.collection))?.key;
+ return childKey;
+ }
+ }
+
+ return this.getLastKey();
+ }
+
+ getKeyForSearch(search: string, fromKey?: Key) {
+ if (!this.collator) {
+ return null;
+ }
+
+ let collection = this.collection;
+ let key = fromKey ?? this.getFirstKey();
+
+ let startItem = collection.getItem(key);
+ key = startItem.parentKey;
+
+ while (key != null) {
+ let item = collection.getItem(key);
+ if (item.textValue) {
+ let substring = item.textValue.slice(0, search.length);
+ if (this.collator.compare(substring, search) === 0) {
+ return getFirstItem(getChildNodes(item, this.collection))?.key;
+ }
+ }
+
+ key = this.collection.getKeyAfter(key);
+ }
+
+ return null;
+ }
+}
diff --git a/packages/@fds-design/card/src/Card.tsx b/packages/@fds-design/card/src/Card.tsx
new file mode 100644
index 0000000..bfe6b3d
--- /dev/null
+++ b/packages/@fds-design/card/src/Card.tsx
@@ -0,0 +1,48 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {CardBase} from './CardBase';
+import {DOMRef, DOMRefValue, ItemProps} from '@react-types/shared';
+import {PartialNode} from '@react-stately/collections';
+import React, {forwardRef, ForwardRefExoticComponent, PropsWithoutRef, RefAttributes} from 'react';
+import {SpectrumCardProps} from '@react-types/card';
+import {useCardViewContext} from './CardViewContext';
+
+
+let Card = forwardRef((props: SpectrumCardProps, ref: DOMRef) => {
+ let context = useCardViewContext();
+ if (context !== null) {
+ return null;
+ } else {
+ return (
+
+ );
+ }
+});
+
+// @ts-ignore
+Card.getCollectionNode = function* getCollectionNode(props: any): Generator> {
+ let {children, textValue} = props;
+
+ yield {
+ type: 'item',
+ props: props,
+ rendered: children,
+ 'aria-label': props['aria-label'],
+ hasChildNodes: false,
+ textValue
+ };
+};
+
+let _Card = Card as ForwardRefExoticComponent & PropsWithoutRef & RefAttributes>>;
+export {_Card as Card};
diff --git a/packages/@fds-design/card/src/CardBase.tsx b/packages/@fds-design/card/src/CardBase.tsx
new file mode 100644
index 0000000..fc74f00
--- /dev/null
+++ b/packages/@fds-design/card/src/CardBase.tsx
@@ -0,0 +1,188 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {AriaCardProps, SpectrumCardProps} from '@react-types/card';
+import {Checkbox} from '../../checkbox';
+import {classNames, SlotProvider, useDOMRef, useHasChild, useStyleProps} from '../../utils';
+import {DOMRef, Node} from '@react-types/shared';
+import {filterDOMProps, mergeProps, useLayoutEffect, useResizeObserver, useSlotId} from '@react-aria/utils';
+import {FocusRing, getFocusableTreeWalker} from '@react-aria/focus';
+import React, {HTMLAttributes, useCallback, useMemo, useRef, useState} from 'react';
+import styles from '@adobe/spectrum-css-temp/components/card/vars.css';
+import {useCardViewContext} from './CardViewContext';
+import {useFocusWithin, useHover} from '@react-aria/interactions';
+import {useProviderProps} from '../../provider';
+
+interface CardBaseProps extends SpectrumCardProps {
+ articleProps?: HTMLAttributes,
+ item?: Node
+}
+
+/**
+ * TODO: Add description of component here.
+ */
+export const CardBase = React.forwardRef(function CardBase(props: CardBaseProps, ref: DOMRef) {
+ props = useProviderProps(props);
+ let context = useCardViewContext() || {}; // we can call again here, won't change from Card.tsx
+ let {state} = context;
+ let manager = state?.selectionManager;
+ let {
+ isQuiet,
+ orientation = 'vertical',
+ articleProps = {},
+ item,
+ layout,
+ children
+ } = props;
+
+ let key = item?.key;
+ let isSelected = manager?.isSelected(key);
+ let isDisabled = state?.disabledKeys.has(key);
+ let onChange = () => manager?.select(key);
+
+ let {styleProps} = useStyleProps(props);
+ let {cardProps, titleProps, contentProps} = useCard(props);
+ let domRef = useDOMRef(ref);
+ let gridRef = useRef(undefined);
+ let checkboxRef = useRef(null);
+
+ // cards are only interactive if there is a selection manager and it allows selection
+ let {hoverProps, isHovered} = useHover({isDisabled: manager === undefined || manager?.selectionMode === 'none' || isDisabled});
+ let [isFocused, setIsFocused] = useState(false);
+ let {focusWithinProps} = useFocusWithin({
+ onFocusWithinChange: setIsFocused,
+ isDisabled
+ });
+
+ // ToDo: see css for comment about avatar under selector .spectrum-Card--noLayout.spectrum-Card--default
+ let hasPreviewImage = useHasChild(`.${styles['spectrum-Card-image']}`, gridRef);
+ let hasPreviewIllustration = useHasChild(`.${styles['spectrum-Card-illustration']}`, gridRef);
+ let hasPreview = hasPreviewImage || hasPreviewIllustration;
+
+ // this is for horizontal cards
+ let [height, setHeight] = useState(NaN);
+ let updateHeight = useCallback(() => {
+ if (orientation !== 'horizontal') {
+ return;
+ }
+
+ let cardHeight = gridRef.current.getBoundingClientRect().height;
+ setHeight(cardHeight);
+ }, [orientation, gridRef, setHeight]);
+ useResizeObserver({ref: gridRef, onResize: updateHeight});
+
+ let aspectRatioEnforce = undefined;
+ if (orientation === 'horizontal' && !isNaN(height)) {
+ aspectRatioEnforce = {
+ height: `${height}px`,
+ width: `${height}px`
+ };
+ }
+
+ let slots = useMemo(() => ({
+ image: {UNSAFE_className: classNames(styles, 'spectrum-Card-image'), objectFit: orientation === 'horizontal' ? 'cover' : 'contain', alt: '', ...aspectRatioEnforce},
+ illustration: {UNSAFE_className: classNames(styles, 'spectrum-Card-illustration'), ...aspectRatioEnforce},
+ avatar: {UNSAFE_className: classNames(styles, 'spectrum-Card-avatar'), size: 'avatar-size-400'},
+ heading: {UNSAFE_className: classNames(styles, 'spectrum-Card-heading'), ...titleProps},
+ content: {UNSAFE_className: classNames(styles, 'spectrum-Card-content'), ...contentProps},
+ detail: {UNSAFE_className: classNames(styles, 'spectrum-Card-detail')}
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }), [titleProps, contentProps, height, isQuiet, orientation]);
+
+ useLayoutEffect(() => {
+ if (gridRef?.current) {
+ let walker = getFocusableTreeWalker(gridRef.current);
+ let nextNode = walker.nextNode();
+ while (nextNode != null) {
+ if (checkboxRef.current && !checkboxRef.current.UNSAFE_getDOMNode().contains(nextNode)) {
+ console.warn('Card does not support focusable elements, please contact the team regarding your use case.');
+ break;
+ }
+ nextNode = walker.nextNode();
+ }
+ }
+ }, [children]);
+
+ return (
+
+
+
+ {manager && manager.selectionMode !== 'none' && (
+
+
+
+ )}
+
+ {children}
+
+
+
+
+
+ );
+});
+
+interface AriaCardOptions extends AriaCardProps {
+}
+
+interface CardAria {
+ cardProps: HTMLAttributes,
+ titleProps: HTMLAttributes,
+ contentProps: HTMLAttributes
+}
+
+function useCard(props: AriaCardOptions): CardAria {
+ let titleId = useSlotId();
+ let descriptionId = useSlotId();
+ let titleProps = useMemo(() => ({
+ id: titleId
+ }), [titleId]);
+ let contentProps = useMemo(() => ({
+ id: descriptionId
+ }), [descriptionId]);
+
+ return {
+ cardProps: {
+ ...filterDOMProps(props),
+ 'aria-labelledby': titleId,
+ 'aria-describedby': descriptionId,
+ tabIndex: 0
+ },
+ titleProps,
+ contentProps
+ };
+}
diff --git a/packages/@fds-design/card/src/CardView.tsx b/packages/@fds-design/card/src/CardView.tsx
new file mode 100644
index 0000000..64a87d8
--- /dev/null
+++ b/packages/@fds-design/card/src/CardView.tsx
@@ -0,0 +1,250 @@
+// @ts-nocheck
+/*
+ * Copyright 2021 Adobe. All rights reserved.
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+import {CardBase} from './CardBase';
+import {CardViewContext, useCardViewContext} from './CardViewContext';
+import {classNames, useDOMRef, useStyleProps, useUnwrapDOMRef} from '../../utils';
+import {DOMRef, DOMRefValue, Node} from '@react-types/shared';
+import {GridCollection, useGridState} from '@react-stately/grid';
+// @ts-ignore
+import intlMessages from '../intl/*.json';
+import {mergeProps} from '@react-aria/utils';
+import {ProgressCircle} from '../../progress';
+import React, {ReactElement, ReactNode, useCallback, useMemo, useRef} from 'react';
+import {ReusableView} from '@react-stately/virtualizer';
+import {SpectrumCardViewProps} from '@react-types/card';
+import styles from '@adobe/spectrum-css-temp/components/card/vars.css';
+import {useCollator, useLocale, useLocalizedStringFormatter} from '@react-aria/i18n';
+import {useGrid, useGridCell, useGridRow} from '@react-aria/grid';
+import {useListState} from '@react-stately/list';
+import {useProvider} from '../../provider';
+import {Virtualizer, VirtualizerItem} from '@react-aria/virtualizer';
+
+/**
+ * TODO: Add description of component here.
+ */
+export const CardView = React.forwardRef(function CardView(props: SpectrumCardViewProps, ref: DOMRef) {
+ let {scale} = useProvider();
+ let {styleProps} = useStyleProps(props);
+ let domRef = useDOMRef(ref);
+ let {
+ isQuiet,
+ renderEmptyState,
+ layout,
+ loadingState,
+ onLoadMore,
+ cardOrientation = 'vertical'
+ } = props;
+
+ let collator = useCollator({usage: 'search', sensitivity: 'base'});
+ let isLoading = loadingState === 'loading' || loadingState === 'loadingMore';
+ let cardViewLayout = useMemo(() => typeof layout === 'function' ? new layout({collator, cardOrientation, scale}) : layout, [layout, collator, cardOrientation, scale]);
+ let layoutType = cardViewLayout.layoutType;
+
+ let {direction} = useLocale();
+ let {collection} = useListState(props);
+
+ let gridCollection = useMemo(() => new GridCollection({
+ columnCount: 1,
+ items: [...collection].map(item => ({
+ // Makes the Grid row use the keys the user provides to the cards so that selection change via interactions returns the card keys
+ ...item,
+ hasChildNodes: true,
+ childNodes: [{
+ key: `cell-${item.key}`,
+ type: 'cell',
+ value: null,
+ level: 0,
+ rendered: null,
+ textValue: item.textValue,
+ hasChildNodes: false,
+ childNodes: []
+ }]
+ }))
+ }), [collection]);
+
+ let state = useGridState({
+ ...props,
+ selectionMode: cardOrientation === 'horizontal' && layoutType === 'grid' ? 'none' : props.selectionMode,
+ collection: gridCollection,
+ focusMode: 'cell'
+ });
+
+ cardViewLayout.collection = gridCollection;
+ cardViewLayout.disabledKeys = state.disabledKeys;
+
+ let {gridProps} = useGrid({
+ ...props,
+ isVirtualized: true,
+ keyboardDelegate: cardViewLayout
+ }, state, domRef);
+
+ type View = ReusableView, ReactNode>;
+ let renderWrapper = useCallback((parent: View, reusableView: View) => (
+
+ {reusableView.rendered}
+
+ ), []);
+
+ let focusedKey = state.selectionManager.focusedKey;
+ let focusedItem = gridCollection.getItem(state.selectionManager.focusedKey);
+ if (focusedItem?.parentKey != null) {
+ focusedKey = focusedItem.parentKey;
+ }
+
+ let persistedKeys = useMemo(() => focusedKey != null ? new Set([focusedKey]) : null, [focusedKey]);
+
+ // TODO: does aria-row count and aria-col count need to be modified? Perhaps aria-col count needs to be omitted
+ return (
+
+ ({isLoading, direction}), [isLoading, direction])}
+ renderWrapper={renderWrapper}
+ style={{
+ ...styleProps.style,
+ scrollPaddingTop: cardViewLayout.margin || 0
+ }}>
+ {useCallback((type, item) => {
+ if (type === 'item') {
+ return (
+
+ );
+ } else if (type === 'loader') {
+ return ;
+ } else if (type === 'placeholder') {
+ return ;
+ }
+ }, [])}
+
+
+
+ );
+}) as (props: SpectrumCardViewProps & {ref?: DOMRef}) => ReactElement;
+
+function LoadingState() {
+ let {state} = useCardViewContext();
+ let stringFormatter = useLocalizedStringFormatter(intlMessages, '../../card');
+ return (
+