diff --git a/.circleci/config.yml b/.circleci/config.yml index 04ef5634826e..6db12bf41959 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -560,27 +560,27 @@ workflows: requires: - unit-tests - create-sandboxes: - parallelism: 23 + parallelism: 21 requires: - build - build-sandboxes: - parallelism: 23 + parallelism: 21 requires: - create-sandboxes - chromatic-sandboxes: - parallelism: 20 + parallelism: 18 requires: - build-sandboxes - e2e-production: - parallelism: 18 + parallelism: 16 requires: - build-sandboxes - e2e-dev: - parallelism: 4 + parallelism: 2 requires: - create-sandboxes - test-runner-production: - parallelism: 18 + parallelism: 16 requires: - build-sandboxes - bench: @@ -614,30 +614,30 @@ workflows: requires: - build - create-sandboxes: - parallelism: 38 + parallelism: 36 requires: - build # - smoke-test-sandboxes: # disabled for now # requires: # - create-sandboxes - build-sandboxes: - parallelism: 38 + parallelism: 36 requires: - create-sandboxes - chromatic-sandboxes: - parallelism: 35 + parallelism: 33 requires: - build-sandboxes - e2e-production: - parallelism: 33 + parallelism: 31 requires: - build-sandboxes - e2e-dev: - parallelism: 4 + parallelism: 2 requires: - create-sandboxes - test-runner-production: - parallelism: 33 + parallelism: 31 requires: - build-sandboxes # TODO: reenable once we find out the source of flakyness diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ba472744a8f1..954092e8d2e2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,11 +4,10 @@ Closes # - ## What I did diff --git a/.vscode/settings.json b/.vscode/settings.json index 1737faa78f27..2eaa07fec3cd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,7 +16,7 @@ "editor.formatOnSave": true }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "editor.tabSize": 2, "editor.formatOnSave": true, diff --git a/CHANGELOG.md b/CHANGELOG.md index e424acc666c1..28d18cedd4ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,108 @@ +## 7.6.0 + +Storybook 7.6 is here with increased performance and much more! + +- 🔥 Improved SWC support +- 🧪 New test utilities and fast build mode +- 🔼 NextJS SWC + avif support & fixes +- 🤡 SvelteKit page and navigation mocking +- ⚛️ React-docgen upgrade +- 🎨 Controls a11y, background theming, and viewports +- 🩺 CLI: The doctor is in! +- 🚫 Addons: Remove React as a peer dependency +- 🪦 Storyshots and Vue2 deprecated + +
+ + List of all updates + + + - Actions: Attach spies on actions across stories when defined in meta - [#24451](https://github.com/storybookjs/storybook/pull/24451), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Actions: Fix `@storybook/core-events/preview-errors` dependency missing for Yarn PnP - [#24973](https://github.com/storybookjs/storybook/pull/24973), thanks [@JReinhold](https://github.com/JReinhold)! + - Actions: Fix missing crypto module crashing React Native - [#24546](https://github.com/storybookjs/storybook/pull/24546), thanks [@dannyhw](https://github.com/dannyhw)! + - Actions: Warn on implicit actions - [#24856](https://github.com/storybookjs/storybook/pull/24856), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Addon A11y: Avoid CSP issue - [#24477](https://github.com/storybookjs/storybook/pull/24477), thanks [@Marklb](https://github.com/Marklb)! + - Addon: Move Visual Test addon to the code directory - [#24771](https://github.com/storybookjs/storybook/pull/24771), thanks [@cdedreuille](https://github.com/cdedreuille)! + - Addons, core: Make `react` and Storybook packages `devDependencies` where possible - [#24676](https://github.com/storybookjs/storybook/pull/24676), thanks [@JReinhold](https://github.com/JReinhold)! + - Addons, core: Make `react` and Storybook packages `devDependencies` where possible - ATTEMPT 2 - [#24834](https://github.com/storybookjs/storybook/pull/24834), thanks [@JReinhold](https://github.com/JReinhold)! + - Angular: Add source-map option to builder - [#24466](https://github.com/storybookjs/storybook/pull/24466), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Angular: Handle nested module metadata - [#24798](https://github.com/storybookjs/storybook/pull/24798), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Angular: Include object configured styles - [#24768](https://github.com/storybookjs/storybook/pull/24768), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Babel: Update all @babel/* dependencies - [#24610](https://github.com/storybookjs/storybook/pull/24610), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - CLI: Add "doctor" command - [#22236](https://github.com/storybookjs/storybook/pull/22236), thanks [@yannbf](https://github.com/yannbf)! + - CLI: Add @storybook/addon-designs to non-core list - [#24507](https://github.com/storybookjs/storybook/pull/24507), thanks [@yannbf](https://github.com/yannbf)! + - CLI: Ensure errors with opening the browser are caught - [#24668](https://github.com/storybookjs/storybook/pull/24668), thanks [@xueyawei](https://github.com/xueyawei)! + - CLI: Ignore `addon-onboarding` when checking versions - [#24634](https://github.com/storybookjs/storybook/pull/24634), thanks [@JReinhold](https://github.com/JReinhold)! + - CLI: Use @storybook/test in template stories - [#24393](https://github.com/storybookjs/storybook/pull/24393), thanks [@yannbf](https://github.com/yannbf)! + - Controls: Improve accessibility of BooleanControl for screen readers - [#24418](https://github.com/storybookjs/storybook/pull/24418), thanks [@danielmarcano](https://github.com/danielmarcano)! + - Core-Server: Ignore all node_module folders for watchpack - [#24553](https://github.com/storybookjs/storybook/pull/24553), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Core: Add deprecation notice for Vite + CommonJS - [#23950](https://github.com/storybookjs/storybook/pull/23950), thanks [@JReinhold](https://github.com/JReinhold)! + - Core: Detect no matching export error in storybook start and build - [#24877](https://github.com/storybookjs/storybook/pull/24877), thanks [@yannbf](https://github.com/yannbf)! + - Core: Fix `useStoryPrepared` hook failing with `undefined` data - [#22631](https://github.com/storybookjs/storybook/pull/22631), thanks [@SpookyJelly](https://github.com/SpookyJelly)! + - Core: Fix pnp support when cache dir is outside working dir - [#24572](https://github.com/storybookjs/storybook/pull/24572), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Core: Fix post message channel location.search access for React Native - [#24545](https://github.com/storybookjs/storybook/pull/24545), thanks [@dannyhw](https://github.com/dannyhw)! + - Core: Gracefully handle error when parsing preview.js file - [#24858](https://github.com/storybookjs/storybook/pull/24858), thanks [@yannbf](https://github.com/yannbf)! + - Core: Make warnOnIncompatibleAddons fault-tolerant - [#24880](https://github.com/storybookjs/storybook/pull/24880), thanks [@taozhou-glean](https://github.com/taozhou-glean)! + - Dependencies: Fix Yarn 4 failing to install due to jscodeshift dependency issue - [#24914](https://github.com/storybookjs/storybook/pull/24914), thanks [@samvv](https://github.com/samvv)! + - Dependencies: Update @babel/traverse and @babel/core to fix vulnerability - [#24670](https://github.com/storybookjs/storybook/pull/24670), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Dependencies: Update browserify-sign transitive dependency - [#24674](https://github.com/storybookjs/storybook/pull/24674), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Dependencies: Update jscodeshift to v0.15.1 - [#24882](https://github.com/storybookjs/storybook/pull/24882), thanks [@epreston](https://github.com/epreston)! + - Dependencies: Update nx dependencies to v17 - [#24671](https://github.com/storybookjs/storybook/pull/24671), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Doc Blocks: Add support for `of` prop to `Primary` block - [#23849](https://github.com/storybookjs/storybook/pull/23849), thanks [@Wilson2k](https://github.com/Wilson2k)! + - Doc Blocks: Remove `defaultProps` in `Stories` block - [#24506](https://github.com/storybookjs/storybook/pull/24506), thanks [@WouterK12](https://github.com/WouterK12)! + - Docs: Changes corresponding to docs design updates - [#24925](https://github.com/storybookjs/storybook/pull/24925), thanks [@kylegach](https://github.com/kylegach)! + - Maintenance: Split renderers preview entrypoints - [#24623](https://github.com/storybookjs/storybook/pull/24623), thanks [@ndelangen](https://github.com/ndelangen)! + - Manager: Update `store.settings.lastTrackedStoryId` - [#24115](https://github.com/storybookjs/storybook/pull/24115), thanks [@rashidshamloo](https://github.com/rashidshamloo)! + - ManagerAPI: Fix setting status without index, crashes storybook - [#24866](https://github.com/storybookjs/storybook/pull/24866), thanks [@ndelangen](https://github.com/ndelangen)! + - ManagerBuilder: Fix `"type": "commonjs"` compatibility - [#24534](https://github.com/storybookjs/storybook/pull/24534), thanks [@ndelangen](https://github.com/ndelangen)! + - Next.js: Add avif support - [#24611](https://github.com/storybookjs/storybook/pull/24611), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Next.js: Add back image context CommonJS export - [#24885](https://github.com/storybookjs/storybook/pull/24885), thanks [@martinnabhan](https://github.com/martinnabhan)! + - Next.js: Add experimental SWC support - [#24852](https://github.com/storybookjs/storybook/pull/24852), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Next.js: Fix Fast Refresh config for SWC mode - [#24991](https://github.com/storybookjs/storybook/pull/24991), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Next.js: Fix forwarding ref for Image component - [#24648](https://github.com/storybookjs/storybook/pull/24648), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Next.js: Fix import path in swc loader - [#24922](https://github.com/storybookjs/storybook/pull/24922), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Next.js: Fix react-docgen usage with preset-env settings - [#24993](https://github.com/storybookjs/storybook/pull/24993), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Next.js: Remove duplicate Fast Refresh plugin init - [#24963](https://github.com/storybookjs/storybook/pull/24963), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - React: Upgrade `react-docgen` to v7 - [#24530](https://github.com/storybookjs/storybook/pull/24530), thanks [@shilman](https://github.com/shilman)! + - ReactNative: Fix missing assert dep in docs-tools - [#24732](https://github.com/storybookjs/storybook/pull/24732), thanks [@dannyhw](https://github.com/dannyhw)! + - Svelte: Fix decorators always running twice - [#24921](https://github.com/storybookjs/storybook/pull/24921), thanks [@paoloricciuti](https://github.com/paoloricciuti)! + - Svelte: Fix source with decorators always showing the `SlotDecorator` component - [#24800](https://github.com/storybookjs/storybook/pull/24800), thanks [@JReinhold](https://github.com/JReinhold)! + - SvelteKit: Add experimental page and navigation mocking - [#24795](https://github.com/storybookjs/storybook/pull/24795), thanks [@paoloricciuti](https://github.com/paoloricciuti)! + - SvelteKit: Default to log an action for `goto`, `invalidate` and `invalidateAll` - [#24955](https://github.com/storybookjs/storybook/pull/24955), thanks [@paoloricciuti](https://github.com/paoloricciuti)! + - SWC: Add settings for react and preact - [#24805](https://github.com/storybookjs/storybook/pull/24805), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Test Build: Add env-variable support to `--test` CLI-flag - [#24862](https://github.com/storybookjs/storybook/pull/24862), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Add tests and rename to camelCase - [#24911](https://github.com/storybookjs/storybook/pull/24911), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Disable composition when `--test` is `true` - [#24799](https://github.com/storybookjs/storybook/pull/24799), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Disable docs related stuff for test builds - [#24691](https://github.com/storybookjs/storybook/pull/24691), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Disable telemetry for test builds - [#24706](https://github.com/storybookjs/storybook/pull/24706), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Test Build: Disable warnOnIncompatibleAddons - [#24797](https://github.com/storybookjs/storybook/pull/24797), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Filter out addon-docs from essentials in the test build - [#24994](https://github.com/storybookjs/storybook/pull/24994), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Test Build: Fix disabledAddons filter - [#24924](https://github.com/storybookjs/storybook/pull/24924), thanks [@IanVS](https://github.com/IanVS)! + - Test Build: Fix indexer bug - [#24890](https://github.com/storybookjs/storybook/pull/24890), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Globalize `@storybook/blocks` if `build.test.emptyBlocks` is `true` - [#24650](https://github.com/storybookjs/storybook/pull/24650), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Implement builder options for test build - [#24826](https://github.com/storybookjs/storybook/pull/24826), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Test Build: Improve config loading & naming - [#24837](https://github.com/storybookjs/storybook/pull/24837), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: No sourcemaps for test builds - [#24804](https://github.com/storybookjs/storybook/pull/24804), thanks [@ndelangen](https://github.com/ndelangen)! + - Test Build: Revert defaulting to SWC in test build, but keep using esbuild for minification - [#24843](https://github.com/storybookjs/storybook/pull/24843), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Test: Create @storybook/test package based on vitest - [#24392](https://github.com/storybookjs/storybook/pull/24392), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Test: Don\'t attach action to function mock if action was added already - [#24966](https://github.com/storybookjs/storybook/pull/24966), thanks [@tmeasday](https://github.com/tmeasday)! + - Test: Model loaders as before each and restore mocks properly - [#24948](https://github.com/storybookjs/storybook/pull/24948), thanks [@kasperpeulen](https://github.com/kasperpeulen)! + - Theming: Add theme variable to set the preview background color - [#24575](https://github.com/storybookjs/storybook/pull/24575), thanks [@JReinhold](https://github.com/JReinhold)! + - Typescript: Add \'skipCompiler\' option to TypeScript presets - [#24847](https://github.com/storybookjs/storybook/pull/24847), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - UI: Fix horizontal scroll bar in Canvas hidden by styling - [#24408](https://github.com/storybookjs/storybook/pull/24408), thanks [@yoshi2no](https://github.com/yoshi2no)! + - UI: improve A11Y remove redundant styling rules, update icon color - [#24402](https://github.com/storybookjs/storybook/pull/24402), thanks [@tolkadot](https://github.com/tolkadot)! + - UI: Logo fixed value - [#24726](https://github.com/storybookjs/storybook/pull/24726), thanks [@black-arm](https://github.com/black-arm)! + - UI: Update zIndex on NotificationList to fix the notification not being clickable in certain cases - [#24602](https://github.com/storybookjs/storybook/pull/24602), thanks [@yoshi2no](https://github.com/yoshi2no)! + - Viewport: Add newer device viewports - [#24777](https://github.com/storybookjs/storybook/pull/24777), thanks [@Tomo5524](https://github.com/Tomo5524)! + - Vite: Prevent non-deterministic build output - [#24833](https://github.com/storybookjs/storybook/pull/24833), thanks [@henkerik](https://github.com/henkerik)! + - Webpack: Add export-order-loader and remove babel-plugin-named-exports-order - [#24749](https://github.com/storybookjs/storybook/pull/24749), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Webpack: Add react-docgen loader and remove babel-plugin-react-docgen - [#24762](https://github.com/storybookjs/storybook/pull/24762), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Webpack: Fix race condition for export-order loader - [#24817](https://github.com/storybookjs/storybook/pull/24817), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Webpack: Hide critical dependency warning - [#24784](https://github.com/storybookjs/storybook/pull/24784), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Webpack: Only load babel config when babel-loader is used - [#25002](https://github.com/storybookjs/storybook/pull/25002), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! + - Webpack: Resolve circular dependency and fix HMR - [#24974](https://github.com/storybookjs/storybook/pull/24974), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! +
+ ## 7.5.2 - Addon-themes: Fix globals not being set when using absolute path - [#24596](https://github.com/storybookjs/storybook/pull/24596), thanks [@JReinhold](https://github.com/JReinhold)! diff --git a/CHANGELOG.prerelease.md b/CHANGELOG.prerelease.md index d389bce1cfb6..5ef41fa93384 100644 --- a/CHANGELOG.prerelease.md +++ b/CHANGELOG.prerelease.md @@ -1,3 +1,33 @@ +## 8.0.0-alpha.0 + +- Addon Viewport: Expose types for user parameter validation - [#24896](https://github.com/storybookjs/storybook/pull/24896), thanks [@piratetaco](https://github.com/piratetaco)! +- Packages: Remove unused/deprecated packages - [#24528](https://github.com/storybookjs/storybook/pull/24528), thanks [@ndelangen](https://github.com/ndelangen)! +- Vite: use user's `build.target` - [#23123](https://github.com/storybookjs/storybook/pull/23123), thanks [@Hoishin](https://github.com/Hoishin)! +- CLI: Remove `sb extract` command - [#24653](https://github.com/storybookjs/storybook/pull/24653), thanks [@ndelangen](https://github.com/ndelangen)! +- Core: Improve project root detection logic - [#20791](https://github.com/storybookjs/storybook/pull/20791), thanks [@dobesv](https://github.com/dobesv)! +- Core: Prebundling globalize the core-event sub paths - [#24976](https://github.com/storybookjs/storybook/pull/24976), thanks [@ndelangen](https://github.com/ndelangen)! +- Core: Remove `storiesOf`-API - [#24655](https://github.com/storybookjs/storybook/pull/24655), thanks [@ndelangen](https://github.com/ndelangen)! +- Core: `StorybookConfig` `stories`-field support type async function - [#21555](https://github.com/storybookjs/storybook/pull/21555), thanks [@imccausl](https://github.com/imccausl)! +- Dependencies: Update Typescript - [#24970](https://github.com/storybookjs/storybook/pull/24970), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)! +- Dependencies: Upgrade monorepo to TS5 - [#24440](https://github.com/storybookjs/storybook/pull/24440), thanks [@ndelangen](https://github.com/ndelangen)! +- TypeScript: Migrate `@storybook/preset-create-react-app` to strict TS - [#22395](https://github.com/storybookjs/storybook/pull/22395), thanks [@kuriacka](https://github.com/kuriacka)! +- Manager: Enable refs filtered via `experimental_setFilter` - [#24211](https://github.com/storybookjs/storybook/pull/24211), thanks [@ndelangen](https://github.com/ndelangen)! +- MDX: Theme `fontCode` not applied consistently when writing MDX - [#23110](https://github.com/storybookjs/storybook/pull/23110), thanks [@gitstart-storybook](https://github.com/gitstart-storybook)! +- UI: Bring back role main - [#24411](https://github.com/storybookjs/storybook/pull/24411), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Fix `IconButton` not being aligned correctly in blocks - [#24529](https://github.com/storybookjs/storybook/pull/24529), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Fix button size on controls - [#24737](https://github.com/storybookjs/storybook/pull/24737), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Fix layout height - [#24370](https://github.com/storybookjs/storybook/pull/24370), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Fix notifications not appearing in new layout - [#24281](https://github.com/storybookjs/storybook/pull/24281), thanks [@jreinhold](https://github.com/jreinhold)! +- UI: Fix theming not updating - [#24399](https://github.com/storybookjs/storybook/pull/24399), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Improved `Button` and `IconButton` - [#24266](https://github.com/storybookjs/storybook/pull/24266), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Keep mobile drawer open on component selection - [#24258](https://github.com/storybookjs/storybook/pull/24258), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Mobile truncate story name - [#24372](https://github.com/storybookjs/storybook/pull/24372), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: New icon library - [#24433](https://github.com/storybookjs/storybook/pull/24433), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Replace `Form.Button` with the new `Button` component - [#24360](https://github.com/storybookjs/storybook/pull/24360), thanks [@cdedreuille](https://github.com/cdedreuille)! +- UI: Screen reader announcing changes for expand/collapse button - [#24984](https://github.com/storybookjs/storybook/pull/24984), thanks [@wjdtjdgns](https://github.com/wjdtjdgns)! +- UI: Upgrade manager to React v18 - [#24514](https://github.com/storybookjs/storybook/pull/24514), thanks [@ndelangen](https://github.com/ndelangen)! +- UI: sidebar UI updates - [#24707](https://github.com/storybookjs/storybook/pull/24707), thanks [@cdedreuille](https://github.com/cdedreuille)! + ## 7.6.0-beta.2 - Actions: Fix `@storybook/core-events/preview-errors` dependency missing for Yarn PnP - [#24973](https://github.com/storybookjs/storybook/pull/24973), thanks [@JReinhold](https://github.com/JReinhold)! diff --git a/CHANGELOG.v6.md b/CHANGELOG.v6.md index 391f14fed6ed..8501b232d289 100644 --- a/CHANGELOG.v6.md +++ b/CHANGELOG.v6.md @@ -4942,7 +4942,7 @@ Storybook 6.0 is here! - 🧬 [Args: Next-generation, dynamic story format](https://medium.com/storybookjs/introducing-storybook-args-2dadcdb777cc) - 🎛 [Controls: Live edit component examples](https://medium.com/storybookjs/storybook-controls-ce82af93e430) - 🌐 [Composition: Combine multiple Storybooks](https://medium.com/storybookjs/storybook-composition-af0da9084fba) -- 📚 [Documentation: Complete project overhaul](https://storybook.js.org/docs/react/get-started/introduction) +- 📚 [Documentation: Complete project overhaul](https://storybook.js.org/docs/react/get-started) 6.0 contains hundreds more fixes, features, and tweaks. Browse the changelogs matching `6.0.0-alpha.*`, `6.0.0-beta.*`, and `6.0.0-rc.*` for the full list of changes. See [MIGRATION.md](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md) to upgrade from `5.3` or earlier. diff --git a/CODEOWNERS b/CODEOWNERS index b0e8ad0575d4..2e23565e1f5a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -26,8 +26,6 @@ /code/addons/links/ @yannbf @JReinhold /code/addons/measure/ @yannbf @valentinpalkovic /code/addons/outline/ @yannbf @valentinpalkovic -/code/addons/storyshots-core/ @ndelangen -/code/addons/storyshots-puppeteer/ @ndelangen /code/addons/storysource/ @ndelangen /code/addons/themes/ @JReinhold @Integrayshaun /code/addons/toolbars/ @ndelangen @JReinhold diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 78993afd8386..d90fef7e5ee5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,4 +55,4 @@ yarn task --task dev --template --start-from=publish # Contributing to Storybook -For further advice on how to contribute, please refer to our [NEW contributing guide on the Storybook website](https://storybook.js.org/docs/react/contribute/how-to-contribute). +For further advice on how to contribute, please refer to our [NEW contributing guide on the Storybook website](https://storybook.js.org/docs/contribute). diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 191dc42d5b90..e7640a31d10e 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -25,7 +25,7 @@ This document outlines some of the processes that the maintainers should adhere | compatibility with other tools | Issue, bug, or pull request between Storybook and other tools (e.g., [Nuxt](https://nuxtjs.org/)) | | components | Issue, bug, or pull request related to Storybook's internal components | | composition | Issue, bug, or pull request related to Storybook [Composition](/docs/sharing/storybook-composition.md) | -| configuration | Issue, bug, or pull request related to Storybook [configuration](/docs/configure/overview.md) | +| configuration | Issue, bug, or pull request related to Storybook [configuration](/docs/configure/index.md) | | core | Issue, bug, or pull request related to Storybook's Core | | cra | Issue, bug, or pull request that affects Storybook's compatibility with Create React APP ([CRA](https://create-react-app.dev/docs/getting-started/)) | | CSF | Issue, bug, or pull request related to Storybook's [Component Story Format (CSF)](/docs/api/csf.md) | diff --git a/MIGRATION.md b/MIGRATION.md index 4495d71096a8..d116de268ec3 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,5 +1,13 @@

Migration

+- [From version 7.x to 8.0.0](#from-version-7x-to-800) + - [Implicit actions can not be used during rendering (for example in the play function)](#implicit-actions-can-not-be-used-during-rendering-for-example-in-the-play-function) + - [Core changes](#core-changes) + - [React v18 in the manager UI (including addons)](#react-v18-in-the-manager-ui-including-addons) + - [Storyshots has been removed](#storyshots-has-been-removed) + - [UI layout state has changed shape](#ui-layout-state-has-changed-shape) + - [New UI and props for Button and IconButton components](#new-ui-and-props-for-button-and-iconbutton-components) + - [Icons is deprecated](#icons-is-deprecated) - [From version 7.5.0 to 7.6.0](#from-version-750-to-760) - [CommonJS with Vite is deprecated](#commonjs-with-vite-is-deprecated) - [Using implicit actions during rendering is deprecated](#using-implicit-actions-during-rendering-is-deprecated) @@ -41,6 +49,7 @@ - [7.0 feature flags removed](#70-feature-flags-removed) - [Story context is prepared before for supporting fine grained updates](#story-context-is-prepared-before-for-supporting-fine-grained-updates) - [Changed decorator order between preview.js and addons/frameworks](#changed-decorator-order-between-previewjs-and-addonsframeworks) + - [Dark mode detection](#dark-mode-detection) - [7.0 core addons changes](#70-core-addons-changes) - [Removed auto injection of @storybook/addon-actions decorator](#removed-auto-injection-of-storybookaddon-actions-decorator) - [Addon-backgrounds: Removed deprecated grid parameter](#addon-backgrounds-removed-deprecated-grid-parameter) @@ -311,6 +320,115 @@ - [Packages renaming](#packages-renaming) - [Deprecated embedded addons](#deprecated-embedded-addons) +## From version 7.x to 8.0.0 + +### Implicit actions can not be used during rendering (for example in the play function) + +In Storybook 7, we inferred if the component accepts any action props, +by checking if it starts with `onX` (for example `onClick`), or as configured by `actions.argTypesRegex`. +If that was the case, we would fill in jest spies for those args automatically. + +```ts +export default { + component: Button, +}; + +export const ButtonClick = { + play: async ({ args, canvasElement }) => { + await userEvent.click(within(canvasElement).getByRole('button')); + // args.onClick is a jest spy in 7.0 + await expect(args.onClick).toHaveBeenCalled(); + }, +}; +``` + +In Storybook 8 this feature is removed, and spies have to added explicitly: + +```ts +import { fn } from '@storybook/test'; + +export default { + component: Button, + args: { + onClick: fn(), + }, +}; + +export const ButtonClick = { + play: async ({ args, canvasElement }) => { + await userEvent.click(within(canvasElement).getByRole('button')); + await expect(args.onClick).toHaveBeenCalled(); + }, +}; +``` + +For more context, see this RFC: +https://github.com/storybookjs/storybook/discussions/23649 + +To summarize: + +- This makes CSF files less magical and more portable, so that CSF files will render the same in a test environment where docgen is not available. +- This allows users and (test) integrators to run or build storybook without docgen, boosting the user performance and allows tools to give quicker feedback. +- This will make sure that we can one day lazy load docgen, without changing how stories are rendered. + +### Core changes + +#### React v18 in the manager UI (including addons) + +Storybook 7 used React 16 in the manager. In Storybook 8 this is upgraded to react v18. +Addons that inject UI into panels, tools, etc. are possibly affected by this. + +Addon authors are advised to upgrade to react v18. + +##### Storyshots has been removed + +Storyshots was an addon for storybook which allowed users to turn their stories into automated snapshot-tests. + +Every story would automatically be taken into account and created a snapshot-file for. + +Snapshot-testing has since fallen out of favor and is no longer recommended. + +In addition to it's limited use, and high chance of false-positives, storyshots ran code developed to run in the browser in NodeJS via JSDOM. +JSDOM has limitations and is not a perfect emulation of the browser environment; therefore storyshots was always a pain to setup and maintain. + +The storybook team has build the test-runner as a direct replacement, which utilizes playwright to connect to an actual browser where storybook runs the code. + +In addition CSF has expanded to allow for play-function to be defined on stories, which allows for more complex testing scenarios, fully integrated within storybook itself (and supported by the test-runner, and not storyshots). + +Finally `storyStoreV7: true` (the default and only options in storybook 8), was not supported by storyshots. + +By removing storyshots, the storybook team was unblocked from moving (eventually) to an ESM-only storybook, which is a big step towards a more modern storybook. + +#### UI layout state has changed shape + +In Storybook 7 it was possible to use `addons.setConfig({...});` to configure Storybook UI features and behavior as documented [here (v7)](https://storybook.js.org/docs/7.3/react/configure/features-and-behavior), [(latest)](https://storybook.js.org/docs/react/configure/features-and-behavior). The state and API for the UI layout has changed: + +- `showNav: boolean` is now `navSize: number`, where the number represents the size of the sidebar in pixels. +- `showPanel: boolean` is now split into `bottomPanelHeight: number` and `rightPanelWidth: number`, where the numbers represents the size of the panel in pixels. +- `isFullscreen: boolean` is no longer supported, but can be achieved by setting a combination of the above. + +#### New UI and props for Button and IconButton components + +We used to have a lot of different buttons in `@storybook/components` that were not used anywhere. In Storybook 8.0 we are deprecating `Form.Button` and added a new `Button` component that can be used in all places. The `IconButton` component has also been updated to use the new `Button` component under the hood. Going forward addon creators and Storybook maintainers should use the new `Button` component instead of `Form.Button`. + +For the `Button` component, the following props are now deprecated: + +- `isLink` - Please use the `asChild` prop instead like this: `` +- `primary` - Please use the `variant` prop instead. +- `secondary` - Please use the `variant` prop instead. +- `tertiary` - Please use the `variant` prop instead. +- `gray` - Please use the `variant` prop instead. +- `inForm` - Please use the `variant` prop instead. +- `small` - Please use the `size` prop instead. +- `outline` - Please use the `variant` prop instead. +- `containsIcon`. Please add your icon as a child directly. No need for this prop anymore. + +The `IconButton` doesn't have any deprecated props but it now uses the new `Button` component under the hood so all props for `IconButton` will be the same as `Button`. + +#### Icons is deprecated + +In Storybook 8.0 we are introducing a new icon library available with `@storybook/icons`. We are deprecating the `Icons` component in `@storybook/components` and recommend that addon creators and Storybook maintainers use the new `@storybook/icons` component instead. + ## From version 7.5.0 to 7.6.0 #### CommonJS with Vite is deprecated @@ -988,7 +1106,7 @@ import ReadMe from './README.md?raw'; #### Stories field in .storybook/main.js is mandatory In 6.x, the `stories` key field in `.storybook/main.js` was optional. In 7.0, it is mandatory. -Please follow up the [Configure your Storybook project](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project) section to configure your Storybook project. +Please follow up the [Configure your Storybook project](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project) section to configure your Storybook project. #### Stricter global types @@ -1089,6 +1207,14 @@ export default { }; ``` +#### Dark mode detection + +Storybook 7 uses `prefers-color-scheme` to detects your system's dark mode preference if a theme is not set. + +Earlier versions used the light theme by default, so if you don't set a theme and your system's settings are in dark mode, this could surprise you. + +To learn more about theming, read our [documentation](https://storybook.js.org/docs/react/configure/theming). + ### 7.0 core addons changes #### Removed auto injection of @storybook/addon-actions decorator diff --git a/code/.eslintrc.js b/code/.eslintrc.js index 953ccaf79d25..d298ea5a9f68 100644 --- a/code/.eslintrc.js +++ b/code/.eslintrc.js @@ -28,6 +28,7 @@ module.exports = { 'react-hooks/rules-of-hooks': 'off', 'import/extensions': 'off', // for mjs, we sometimes need extensions 'jest/no-done-callback': 'off', + 'jsx-a11y/control-has-associated-label': 'off', '@typescript-eslint/dot-notation': [ 'error', { @@ -140,13 +141,7 @@ module.exports = { }, })), { - files: [ - '**/__tests__/**', - '**/__testfixtures__/**', - '**/*.test.*', - '**/*.stories.*', - '**/storyshots-*/**/stories/**', - ], + files: ['**/__tests__/**', '**/__testfixtures__/**', '**/*.test.*', '**/*.stories.*'], rules: { '@typescript-eslint/no-empty-function': 'off', 'import/no-extraneous-dependencies': 'off', diff --git a/code/.yarnrc.yml b/code/.yarnrc.yml index 360474b5bcc8..2cee4e0d364c 100644 --- a/code/.yarnrc.yml +++ b/code/.yarnrc.yml @@ -7,8 +7,6 @@ logFilters: level: discard - code: YN0076 level: discard - - level: discard - pattern: '@workspace:addons/storyshots-*/' nodeLinker: node-modules @@ -27,3 +25,5 @@ unsafeHttpWhitelist: yarnPath: ../.yarn/releases/yarn-4.0.0.cjs installStatePath: '../.yarn/code-install-state.gz' +# Sometimes you get a "The remote archive doesn't match the expected checksum" error, uncommenting this line will fix it +# checksumBehavior: 'update' diff --git a/code/addons/a11y/package.json b/code/addons/a11y/package.json index 9b0cbad18636..8410e7675f90 100644 --- a/code/addons/a11y/package.json +++ b/code/addons/a11y/package.json @@ -60,17 +60,18 @@ "@storybook/client-logger": "workspace:*", "@storybook/components": "workspace:*", "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", - "@testing-library/react": "^11.2.2", + "@testing-library/react": "^14.0.0", "lodash": "^4.17.21", - "react": "^16.8.0", - "react-dom": "^16.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-resize-detector": "^7.1.2", "resize-observer-polyfill": "^1.5.1", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/a11y/src/components/A11YPanel.tsx b/code/addons/a11y/src/components/A11YPanel.tsx index 7855cd9396ac..9552b7951e9d 100644 --- a/code/addons/a11y/src/components/A11YPanel.tsx +++ b/code/addons/a11y/src/components/A11YPanel.tsx @@ -2,7 +2,8 @@ import React, { useCallback, useMemo, useState } from 'react'; import { styled } from '@storybook/theming'; -import { ActionBar, Icons, ScrollArea } from '@storybook/components'; +import { ActionBar, ScrollArea } from '@storybook/components'; +import { SyncIcon, CheckIcon } from '@storybook/icons'; import type { AxeResults } from 'axe-core'; import { useChannel, useParameter, useStorybookState } from '@storybook/manager-api'; @@ -21,9 +22,7 @@ export enum RuleType { INCOMPLETION, } -const Icon = styled(Icons)({ - height: 12, - width: 12, +const Icon = styled(SyncIcon)({ marginRight: 4, }); @@ -108,7 +107,7 @@ export const A11YPanel: React.FC = () => { 'Rerun tests' ) : ( <> - Tests completed + Tests completed ), onClick: handleManual, @@ -164,7 +163,7 @@ export const A11YPanel: React.FC = () => { )} {status === 'running' && ( - Please wait while the accessibility scan is running ... + Please wait while the accessibility scan is running ... )} {(status === 'ready' || status === 'ran') && ( diff --git a/code/addons/a11y/src/components/A11yContext.tsx b/code/addons/a11y/src/components/A11yContext.tsx index fcd2523164bd..8410a646ce65 100644 --- a/code/addons/a11y/src/components/A11yContext.tsx +++ b/code/addons/a11y/src/components/A11yContext.tsx @@ -52,7 +52,10 @@ const defaultResult = { violations: [], }; -export const A11yContextProvider: React.FC = ({ active, ...props }) => { +export const A11yContextProvider: React.FC> = ({ + active, + ...props +}) => { const [results, setResults] = useAddonState(ADDON_ID, defaultResult); const [tab, setTab] = React.useState(0); const [highlighted, setHighlighted] = React.useState([]); diff --git a/code/addons/a11y/src/components/Tabs.tsx b/code/addons/a11y/src/components/Tabs.tsx index ba4a1fb8689a..a3b85809b084 100644 --- a/code/addons/a11y/src/components/Tabs.tsx +++ b/code/addons/a11y/src/components/Tabs.tsx @@ -87,8 +87,8 @@ const List = styled.div(({ theme }) => ({ interface TabsProps { tabs: { - label: JSX.Element; - panel: JSX.Element; + label: React.ReactElement; + panel: React.ReactElement; items: Result[]; type: RuleType; }[]; diff --git a/code/addons/a11y/src/components/VisionSimulator.tsx b/code/addons/a11y/src/components/VisionSimulator.tsx index b66f8eef297d..f604bef57161 100644 --- a/code/addons/a11y/src/components/VisionSimulator.tsx +++ b/code/addons/a11y/src/components/VisionSimulator.tsx @@ -1,8 +1,9 @@ import type { ReactNode } from 'react'; import React, { useState } from 'react'; import { Global, styled } from '@storybook/theming'; -import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { AccessibilityIcon } from '@storybook/icons'; import { Filters } from './ColorFilters'; const iframeId = 'storybook-preview-iframe'; @@ -144,7 +145,7 @@ export const VisionSimulator = () => { onDoubleClick={() => setFilter(null)} > - + diff --git a/code/addons/actions/README.md b/code/addons/actions/README.md index 71bf4a2f53d6..80d2bd5d746c 100644 --- a/code/addons/actions/README.md +++ b/code/addons/actions/README.md @@ -8,13 +8,13 @@ Storybook Addon Actions can be used to display data received by event handlers i ## Installation -Actions is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +Actions is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-actions ``` -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/actions/package.json b/code/addons/actions/package.json index 059a6f210cc3..840c7481df18 100644 --- a/code/addons/actions/package.json +++ b/code/addons/actions/package.json @@ -77,11 +77,11 @@ "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-inspector": "^6.0.0", "telejson": "^7.2.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/actions/src/components/ActionLogger/index.tsx b/code/addons/actions/src/components/ActionLogger/index.tsx index f4231a8474ff..a3e48337107f 100644 --- a/code/addons/actions/src/components/ActionLogger/index.tsx +++ b/code/addons/actions/src/components/ActionLogger/index.tsx @@ -1,4 +1,4 @@ -import type { FC } from 'react'; +import type { FC, PropsWithChildren } from 'react'; import React, { Fragment } from 'react'; import { styled, withTheme } from '@storybook/theming'; import type { Theme } from '@storybook/theming'; @@ -9,7 +9,10 @@ import { ActionBar, ScrollArea } from '@storybook/components'; import { Action, InspectorContainer, Counter } from './style'; import type { ActionDisplay } from '../../models'; -const UnstyledWrapped: FC<{ className?: string }> = ({ children, className }) => ( +const UnstyledWrapped: FC> = ({ + children, + className, +}) => ( {children} diff --git a/code/addons/actions/src/typings.d.ts b/code/addons/actions/src/typings.d.ts index fba51cec4ab6..4ae6735dbc30 100644 --- a/code/addons/actions/src/typings.d.ts +++ b/code/addons/actions/src/typings.d.ts @@ -1 +1 @@ -declare var FEATURES: import('@storybook/types').StorybookConfig['features']; +declare var FEATURES: import('@storybook/types').StorybookConfigRaw['features']; diff --git a/code/addons/backgrounds/README.md b/code/addons/backgrounds/README.md index 62c88e19a7e7..481ba54bcd2f 100644 --- a/code/addons/backgrounds/README.md +++ b/code/addons/backgrounds/README.md @@ -8,7 +8,7 @@ Storybook Addon Backgrounds can be used to change background colors inside the p ## Installation -Backgrounds is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +Backgrounds is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-backgrounds @@ -16,7 +16,7 @@ npm i -D @storybook/addon-backgrounds ## Configuration -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/backgrounds/package.json b/code/addons/backgrounds/package.json index 28fe642a9c23..88479d56d2bd 100644 --- a/code/addons/backgrounds/package.json +++ b/code/addons/backgrounds/package.json @@ -53,6 +53,7 @@ }, "dependencies": { "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -63,9 +64,9 @@ "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/backgrounds/src/containers/BackgroundSelector.tsx b/code/addons/backgrounds/src/containers/BackgroundSelector.tsx index d941f178b788..87bf6e84f133 100644 --- a/code/addons/backgrounds/src/containers/BackgroundSelector.tsx +++ b/code/addons/backgrounds/src/containers/BackgroundSelector.tsx @@ -4,8 +4,9 @@ import memoize from 'memoizerific'; import { useParameter, useGlobals } from '@storybook/manager-api'; import { logger } from '@storybook/client-logger'; -import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { PhotoIcon } from '@storybook/icons'; import { PARAM_KEY as BACKGROUNDS_PARAM_KEY } from '../constants'; import { ColorIcon } from '../components/ColorIcon'; import type { @@ -140,7 +141,7 @@ export const BackgroundSelector: FC = memo(function BackgroundSelector() { title="Change the background of the preview" active={selectedBackgroundColor !== 'transparent' || isTooltipVisible} > - + diff --git a/code/addons/backgrounds/src/containers/GridSelector.tsx b/code/addons/backgrounds/src/containers/GridSelector.tsx index 80d6477884b4..64ac3cf9c4aa 100644 --- a/code/addons/backgrounds/src/containers/GridSelector.tsx +++ b/code/addons/backgrounds/src/containers/GridSelector.tsx @@ -2,8 +2,9 @@ import type { FC } from 'react'; import React, { memo } from 'react'; import { useGlobals, useParameter } from '@storybook/manager-api'; -import { Icons, IconButton } from '@storybook/components'; +import { IconButton } from '@storybook/components'; +import { GridIcon } from '@storybook/icons'; import { PARAM_KEY as BACKGROUNDS_PARAM_KEY } from '../constants'; export const GridSelector: FC = memo(function GridSelector() { @@ -30,7 +31,7 @@ export const GridSelector: FC = memo(function GridSelector() { }) } > - + ); }); diff --git a/code/addons/controls/README.md b/code/addons/controls/README.md index cb37957a0766..0622e23a302c 100644 --- a/code/addons/controls/README.md +++ b/code/addons/controls/README.md @@ -8,13 +8,13 @@ ## Installation -Controls is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +Controls is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-controls ``` -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/controls/package.json b/code/addons/controls/package.json index cdac72d747b6..90ea2642a762 100644 --- a/code/addons/controls/package.json +++ b/code/addons/controls/package.json @@ -64,8 +64,8 @@ "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "publishConfig": { "access": "public" diff --git a/code/addons/controls/template/stories/basics.stories.ts b/code/addons/controls/template/stories/basics.stories.ts index 812f66ebc0e3..b1d636d2a790 100644 --- a/code/addons/controls/template/stories/basics.stories.ts +++ b/code/addons/controls/template/stories/basics.stories.ts @@ -78,6 +78,5 @@ export const Defined = { // parameters: { // docs: { disable: true }, // chromatic: { disable: true }, -// storyshots: { disable: true }, // }, // }; diff --git a/code/addons/docs/package.json b/code/addons/docs/package.json index 3dc510919b18..87122e127f54 100644 --- a/code/addons/docs/package.json +++ b/code/addons/docs/package.json @@ -120,9 +120,9 @@ }, "devDependencies": { "@rollup/pluginutils": "^5.0.2", - "react": "^16.14.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2", "vite": "^4.0.4" }, "peerDependencies": { diff --git a/code/addons/docs/src/DocsRenderer.tsx b/code/addons/docs/src/DocsRenderer.tsx index 42d8d279b749..f87aac472f68 100644 --- a/code/addons/docs/src/DocsRenderer.tsx +++ b/code/addons/docs/src/DocsRenderer.tsx @@ -1,3 +1,4 @@ +import type { PropsWithChildren } from 'react'; import React, { Component } from 'react'; import { renderElement, unmountElement } from '@storybook/react-dom-shim'; import type { Renderer, Parameters, DocsContextProps, DocsRenderFunction } from '@storybook/types'; @@ -10,9 +11,11 @@ export const defaultComponents: Record = { ...HeadersMdx, }; -class ErrorBoundary extends Component<{ - showException: (err: Error) => void; -}> { +class ErrorBoundary extends Component< + PropsWithChildren<{ + showException: (err: Error) => void; + }> +> { state = { hasError: false }; static getDerivedStateFromError() { diff --git a/code/addons/docs/src/preset.ts b/code/addons/docs/src/preset.ts index c716775bdfa9..2ead78d53ac6 100644 --- a/code/addons/docs/src/preset.ts +++ b/code/addons/docs/src/preset.ts @@ -4,7 +4,7 @@ import remarkSlug from 'remark-slug'; import remarkExternalLinks from 'remark-external-links'; import { dedent } from 'ts-dedent'; -import type { DocsOptions, Indexer, Options, StorybookConfig } from '@storybook/types'; +import type { DocsOptions, Indexer, Options, PresetProperty } from '@storybook/types'; import type { CsfPluginOptions } from '@storybook/csf-plugin'; import type { JSXOptions, CompileOptions } from '@storybook/mdx2-csf'; import { global } from '@storybook/global'; @@ -160,7 +160,7 @@ export const createStoriesMdxIndexer = (legacyMdx1?: boolean): Indexer => ({ }, }); -const indexers: StorybookConfig['experimental_indexers'] = (existingIndexers) => +const indexers: PresetProperty<'experimental_indexers'> = (existingIndexers) => [createStoriesMdxIndexer(global.FEATURES?.legacyMdx1)].concat(existingIndexers || []); const docs = (docsOptions: DocsOptions) => { @@ -171,7 +171,7 @@ const docs = (docsOptions: DocsOptions) => { }; }; -export const addons: StorybookConfig['addons'] = [ +export const addons: PresetProperty<'addons'> = [ require.resolve('@storybook/react-dom-shim/dist/preset'), ]; diff --git a/code/addons/docs/src/typings.d.ts b/code/addons/docs/src/typings.d.ts index 79397caba109..04846593c045 100644 --- a/code/addons/docs/src/typings.d.ts +++ b/code/addons/docs/src/typings.d.ts @@ -9,6 +9,6 @@ declare module 'sveltedoc-parser' { export function parse(options: any): Promise; } -declare var FEATURES: import('@storybook/types').StorybookConfig['features']; +declare var FEATURES: import('@storybook/types').StorybookConfigRaw['features']; declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/addons/essentials/package.json b/code/addons/essentials/package.json index f0430f0c75ad..3a47f5855578 100644 --- a/code/addons/essentials/package.json +++ b/code/addons/essentials/package.json @@ -77,7 +77,7 @@ }, "devDependencies": { "@storybook/vue": "workspace:*", - "typescript": "^4.9.3" + "typescript": "^5.3.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0", diff --git a/code/addons/essentials/src/index.ts b/code/addons/essentials/src/index.ts index 358cf796a579..b2d879c2d794 100644 --- a/code/addons/essentials/src/index.ts +++ b/code/addons/essentials/src/index.ts @@ -3,15 +3,55 @@ import { logger } from '@storybook/node-logger'; import { serverRequire } from '@storybook/core-common'; interface PresetOptions { + /** + * Allow to use @storybook/addon-actions + * @see https://storybook.js.org/addons/@storybook/addon-actions + * @default true + */ actions?: boolean; + /** + * Allow to use @storybook/addon-backgrounds + * @see https://storybook.js.org/addons/@storybook/addon-backgrounds + * @default true + */ backgrounds?: boolean; configDir: string; + /** + * Allow to use @storybook/addon-controls + * @see https://storybook.js.org/addons/@storybook/addon-controls + * @default true + */ controls?: boolean; + /** + * Allow to use @storybook/addon-docs + * @see https://storybook.js.org/addons/@storybook/addon-docs + * @default true + */ docs?: boolean; + /** + * Allow to use @storybook/addon-measure + * @see https://storybook.js.org/addons/@storybook/addon-measure + * @default true + */ measure?: boolean; + /** + * Allow to use @storybook/addon-outline + * @see https://storybook.js.org/addons/@storybook/addon-outline + * @default true + */ outline?: boolean; themes?: boolean; + /** + * Allow to use @storybook/addon-toolbars + * @see https://storybook.js.org/addons/@storybook/addon-toolbars + * @default true + */ toolbars?: boolean; + /** + * Allow to use @storybook/addon-viewport + * @see https://storybook.js.org/addons/@storybook/addon-viewport + * @default true + */ viewport?: boolean; } diff --git a/code/addons/gfm/package.json b/code/addons/gfm/package.json index 1803127eab5f..f3eeb90b0501 100644 --- a/code/addons/gfm/package.json +++ b/code/addons/gfm/package.json @@ -49,7 +49,7 @@ "ts-dedent": "^2.0.0" }, "devDependencies": { - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/highlight/README.md b/code/addons/highlight/README.md index e4b245acc5fd..5f7ffbe0c3a9 100644 --- a/code/addons/highlight/README.md +++ b/code/addons/highlight/README.md @@ -8,7 +8,7 @@ Use it to call attention to particular parts of the story. Or use it to enhance ## Usage -This addon requires Storybook 6.5 or later. Highlight is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run the following command: +This addon requires Storybook 6.5 or later. Highlight is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run the following command: yarn: diff --git a/code/addons/highlight/package.json b/code/addons/highlight/package.json index 10fdafc7c9af..120613f19673 100644 --- a/code/addons/highlight/package.json +++ b/code/addons/highlight/package.json @@ -54,7 +54,7 @@ "@storybook/core-events": "workspace:*", "@storybook/preview-api": "workspace:*", "@types/webpack-env": "^1.16.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/interactions/README.md b/code/addons/interactions/README.md index 6167242008f9..815a83b1804d 100644 --- a/code/addons/interactions/README.md +++ b/code/addons/interactions/README.md @@ -9,7 +9,7 @@ Storybook Addon Interactions enables visual debugging of interactions and tests Install this addon by adding the `@storybook/addon-interactions` dependency: ```sh -yarn add -D @storybook/addon-interactions @storybook/jest @storybook/testing-library +yarn add -D @storybook/addon-interactions @storybook/test ``` within `.storybook/main.js`: @@ -24,19 +24,17 @@ Note that `@storybook/addon-interactions` must be listed **after** `@storybook/a ## Usage -Interactions relies on "instrumented" versions of Jest and Testing Library, that you import from `@storybook/jest` and -`@storybook/testing-library` instead of their original package. You can then use these libraries in your `play` function. +Interactions relies on "instrumented" versions of Vitest and Testing Library, that you import from `@storybook/test` instead of their original package. You can then use these libraries in your `play` function. ```js import { Button } from './Button'; -import { expect } from '@storybook/jest'; -import { within, userEvent } from '@storybook/testing-library'; +import { within, userEvent, expect, fn } from '@storybook/test'; export default { title: 'Button', component: Button, - argTypes: { - onClick: { action: true }, + args: { + onClick: fn(), }, }; @@ -50,12 +48,10 @@ Demo.play = async ({ args, canvasElement }) => { }; ``` -In order to enable step-through debugging, calls to `userEvent.*`, `fireEvent`, `findBy*`, `waitFor*` and `expect` have to +In order to enable step-through debugging in the addon panel, calls to `userEvent.*`, `fireEvent`, `findBy*`, `waitFor*` and `expect` have to be `await`-ed. While debugging, these functions return a Promise that won't resolve until you continue to the next step. While you can technically use `screen`, it's recommended to use `within(canvasElement)`. Besides giving you a better error message when a DOM element can't be found, it will also ensure your play function is compatible with Storybook Docs. -Any `args` that are marked as an `action` (typically via `argTypes` or `argTypesRegex`) will be automatically wrapped in -a [Jest mock function](https://jestjs.io/docs/jest-object#jestfnimplementation) so you can assert invocations. See -[addon-actions](https://storybook.js.org/docs/react/essentials/actions) for how to setup actions. +Note that the `fn` function will assign a spy to your arg, so that you can assert invocations. diff --git a/code/addons/interactions/package.json b/code/addons/interactions/package.json index 4c69b33816f9..b5e9140bbdc4 100644 --- a/code/addons/interactions/package.json +++ b/code/addons/interactions/package.json @@ -49,6 +49,7 @@ }, "dependencies": { "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "@storybook/types": "workspace:*", "jest-mock": "^27.0.6", "polished": "^4.2.2", @@ -68,9 +69,9 @@ "@storybook/theming": "workspace:*", "@types/node": "^18.0.0", "formik": "^2.2.9", - "react": "^16.8.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/interactions/src/Panel.tsx b/code/addons/interactions/src/Panel.tsx index 0bf1111fca01..3d5733710d19 100644 --- a/code/addons/interactions/src/Panel.tsx +++ b/code/addons/interactions/src/Panel.tsx @@ -148,32 +148,33 @@ export const Panel = memo<{ storyId: string }>(function PanelMemoized({ storyId }, [STORY_RENDER_PHASE_CHANGED]: (event) => { if (event.newPhase === 'preparing') { - set((s) => ({ + set({ controlStates: INITIAL_CONTROL_STATES, isErrored: false, pausedAt: undefined, interactions: [], isPlaying: false, - isRerunAnimating: false, - scrollTarget, - collapsed: new Set() as Set, hasException: false, caughtException: undefined, interactionsCount: 0, - })); + }); return; } - set((s) => ({ - ...s, - isPlaying: event.newPhase === 'playing', - pausedAt: undefined, - ...(event.newPhase === 'rendering' - ? { - isErrored: false, - caughtException: undefined, - } - : {}), - })); + set((s) => { + const newState: typeof s = { + ...s, + isPlaying: event.newPhase === 'playing', + pausedAt: undefined, + ...(event.newPhase === 'rendering' + ? { + isErrored: false, + caughtException: undefined, + } + : {}), + }; + + return newState; + }); }, [STORY_THREW_EXCEPTION]: () => { set((s) => ({ ...s, isErrored: true })); diff --git a/code/addons/interactions/src/components/Interaction.tsx b/code/addons/interactions/src/components/Interaction.tsx index af2bea6bd20b..5c817e71a0aa 100644 --- a/code/addons/interactions/src/components/Interaction.tsx +++ b/code/addons/interactions/src/components/Interaction.tsx @@ -1,9 +1,10 @@ import * as React from 'react'; -import { IconButton, Icons, TooltipNote, WithTooltip } from '@storybook/components'; +import { IconButton, TooltipNote, WithTooltip } from '@storybook/components'; import { type Call, CallStates, type ControlStates } from '@storybook/instrumenter'; import { styled, typography } from '@storybook/theming'; import { transparentize } from 'polished'; +import { ListUnorderedIcon } from '@storybook/icons'; import { Expected, MatcherResult, Received } from './MatcherResult'; import { MethodCall } from './MethodCall'; import { StatusIcon } from './StatusIcon'; @@ -197,7 +198,7 @@ export const Interaction = ({ tooltip={} > - + )} diff --git a/code/addons/interactions/src/components/MethodCall.tsx b/code/addons/interactions/src/components/MethodCall.tsx index a12aaa4f1a29..d45efa646813 100644 --- a/code/addons/interactions/src/components/MethodCall.tsx +++ b/code/addons/interactions/src/components/MethodCall.tsx @@ -431,7 +431,7 @@ export const MethodCall = ({ callId ? ( ) : ( - {elem} + {elem as any} ), , ., diff --git a/code/addons/interactions/src/components/Subnav.tsx b/code/addons/interactions/src/components/Subnav.tsx index 3d2e5c41d1a3..4a9dda73a28a 100644 --- a/code/addons/interactions/src/components/Subnav.tsx +++ b/code/addons/interactions/src/components/Subnav.tsx @@ -3,7 +3,6 @@ import React from 'react'; import { Button, IconButton, - Icons, Separator, P, TooltipNote, @@ -14,6 +13,13 @@ import type { Call, ControlStates } from '@storybook/instrumenter'; import { CallStates } from '@storybook/instrumenter'; import { styled } from '@storybook/theming'; +import { + FastForwardIcon, + PlayBackIcon, + PlayNextIcon, + RewindIcon, + SyncIcon, +} from '@storybook/icons'; import { StatusBadge } from './StatusBadge'; import type { Controls } from './InteractionsPanel'; @@ -135,7 +141,7 @@ export const Subnav: React.FC = ({ onClick={controls.start} disabled={!controlStates.start} > - + @@ -146,7 +152,7 @@ export const Subnav: React.FC = ({ onClick={controls.back} disabled={!controlStates.back} > - + @@ -157,7 +163,7 @@ export const Subnav: React.FC = ({ onClick={controls.next} disabled={!controlStates.next} > - + @@ -168,13 +174,13 @@ export const Subnav: React.FC = ({ onClick={controls.end} disabled={!controlStates.end} > - + }> - + diff --git a/code/addons/jest/README.md b/code/addons/jest/README.md index 50678d636094..ec2cc8a34c6c 100644 --- a/code/addons/jest/README.md +++ b/code/addons/jest/README.md @@ -20,7 +20,7 @@ Or if you're using yarn as a package manager: ## Configuration -Register the addon in your [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Register the addon in your [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { @@ -133,7 +133,7 @@ Default.parameters = { ### Global level To avoid importing the results of the tests in each story, you can update -your [`.storybook/preview.js`](https://storybook.js.org/docs/react/configure/overview#configure-story-rendering) and include a decorator allowing you to display the results only for the stories that have the `jest` parameter defined: +your [`.storybook/preview.js`](https://storybook.js.org/docs/react/configure/#configure-story-rendering) and include a decorator allowing you to display the results only for the stories that have the `jest` parameter defined: ```js // .storybook/preview.js diff --git a/code/addons/jest/package.json b/code/addons/jest/package.json index 249bd810a2f8..9a32eabe1c98 100644 --- a/code/addons/jest/package.json +++ b/code/addons/jest/package.json @@ -65,10 +65,10 @@ "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-resize-detector": "^7.1.2", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/jest/src/components/Message.tsx b/code/addons/jest/src/components/Message.tsx index 96aa5ed30262..9245e66bc0fb 100644 --- a/code/addons/jest/src/components/Message.tsx +++ b/code/addons/jest/src/components/Message.tsx @@ -1,4 +1,4 @@ -import type { FC } from 'react'; +import type { FC, ReactElement } from 'react'; import React, { Fragment } from 'react'; import { styled } from '@storybook/theming'; @@ -12,7 +12,7 @@ const passStartToken = '[32m'; const stackTraceStartToken = 'at'; const titleEndToken = ':'; -type MsgElement = string | JSX.Element; +type MsgElement = string | ReactElement; class TestDetail { description!: MsgElement[]; diff --git a/code/addons/links/package.json b/code/addons/links/package.json index 28c509559a72..565ef44f6f80 100644 --- a/code/addons/links/package.json +++ b/code/addons/links/package.json @@ -75,7 +75,7 @@ "@storybook/router": "workspace:*", "@storybook/types": "workspace:*", "fs-extra": "^11.1.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" diff --git a/code/addons/links/src/react/components/link.test.tsx b/code/addons/links/src/react/components/link.test.tsx index dd19a2eab69f..43538b927aeb 100644 --- a/code/addons/links/src/react/components/link.test.tsx +++ b/code/addons/links/src/react/components/link.test.tsx @@ -61,11 +61,8 @@ describe('LinkTo', () => { }); describe('events', () => { - it('should select the kind and story on click', () => { - const channel = { - emit: jest.fn(), - on: jest.fn(), - } as any; + it('should select the kind and story on click', async () => { + const channel = mockChannel() as any; mockAddons.getChannel.mockReturnValue(channel); render( @@ -74,7 +71,15 @@ describe('LinkTo', () => { link ); - userEvent.click(screen.getByText('link')); + + await waitFor(() => { + expect(screen.getByText('link')).toHaveAttribute( + 'href', + 'originpathname?path=/story/foo--bar' + ); + }); + + await userEvent.click(screen.getByText('link')); expect(channel.emit).toHaveBeenLastCalledWith( SELECT_STORY, diff --git a/code/addons/measure/README.md b/code/addons/measure/README.md index ca1387d474c8..8e280f150124 100644 --- a/code/addons/measure/README.md +++ b/code/addons/measure/README.md @@ -12,7 +12,7 @@ Storybook addon for inspecting layouts and visualizing the box model. ## Usage -This addon requires Storybook 6.3 or later. Measure is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +This addon requires Storybook 6.3 or later. Measure is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-measure diff --git a/code/addons/measure/package.json b/code/addons/measure/package.json index cd563ea34ed3..e1e256d5863a 100644 --- a/code/addons/measure/package.json +++ b/code/addons/measure/package.json @@ -65,6 +65,7 @@ }, "dependencies": { "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "tiny-invariant": "^1.3.1" }, "devDependencies": { @@ -74,9 +75,9 @@ "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/types": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/measure/src/Tool.tsx b/code/addons/measure/src/Tool.tsx index 2e68078aa06b..16af4de9af96 100644 --- a/code/addons/measure/src/Tool.tsx +++ b/code/addons/measure/src/Tool.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useEffect } from 'react'; import { useGlobals, useStorybookApi } from '@storybook/manager-api'; -import { Icons, IconButton } from '@storybook/components'; +import { IconButton } from '@storybook/components'; +import { RulerIcon } from '@storybook/icons'; import { TOOL_ID, ADDON_ID } from './constants'; export const Tool = () => { @@ -33,7 +34,7 @@ export const Tool = () => { title="Enable measure" onClick={toggleMeasure} > - + ); }; diff --git a/code/addons/outline/README.md b/code/addons/outline/README.md index 301c140c3cff..e73da501a3f6 100644 --- a/code/addons/outline/README.md +++ b/code/addons/outline/README.md @@ -6,13 +6,13 @@ Storybook Addon Outline can be used for visually debugging CSS layout and alignm ## Usage -Requires Storybook 6.1 or later. Outline is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +Requires Storybook 6.1 or later. Outline is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-outline ``` -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/outline/package.json b/code/addons/outline/package.json index 8f25fabfd51d..c3027f76585b 100644 --- a/code/addons/outline/package.json +++ b/code/addons/outline/package.json @@ -55,6 +55,7 @@ }, "dependencies": { "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "ts-dedent": "^2.0.0" }, "devDependencies": { @@ -64,9 +65,9 @@ "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/types": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/outline/src/OutlineSelector.tsx b/code/addons/outline/src/OutlineSelector.tsx index 93bdf321df07..012477bae60c 100644 --- a/code/addons/outline/src/OutlineSelector.tsx +++ b/code/addons/outline/src/OutlineSelector.tsx @@ -1,6 +1,7 @@ import React, { memo, useCallback, useEffect } from 'react'; import { useGlobals, useStorybookApi } from '@storybook/manager-api'; -import { Icons, IconButton } from '@storybook/components'; +import { IconButton } from '@storybook/components'; +import { OutlineIcon } from '@storybook/icons'; import { ADDON_ID, PARAM_KEY } from './constants'; export const OutlineSelector = memo(function OutlineSelector() { @@ -34,7 +35,7 @@ export const OutlineSelector = memo(function OutlineSelector() { title="Apply outlines to the preview" onClick={toggleOutline} > - + ); }); diff --git a/code/addons/storyshots-core/.eslintrc.js b/code/addons/storyshots-core/.eslintrc.js deleted file mode 100644 index 79e820da0d30..000000000000 --- a/code/addons/storyshots-core/.eslintrc.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - settings: { - 'import/core-modules': [ - '@storybook/angular', - '@storybook/html', - '@storybook/react', - '@storybook/preact', - '@storybook/vue', - '@storybook/svelte', - ], - }, -}; diff --git a/code/addons/storyshots-core/README.md b/code/addons/storyshots-core/README.md deleted file mode 100644 index 8a20edd2c7f3..000000000000 --- a/code/addons/storyshots-core/README.md +++ /dev/null @@ -1,795 +0,0 @@ -# StoryShots - -StoryShots adds automatic Jest Snapshot Testing for [Storybook](https://storybook.js.org/). - -[Framework Support](https://storybook.js.org/docs/react/api/frameworks-feature-support) - -![StoryShots In Action](https://raw.githubusercontent.com/storybookjs/storybook/next/code/addons/storyshots/storyshots-core/docs/storyshots-fail.png) - -To use StoryShots, you must use your existing Storybook stories as the input for Jest Snapshot Testing. - -## Getting Started - -Add the following module into your app. - -```sh -yarn add @storybook/addon-storyshots --dev -``` - -## Configure Storyshots for HTML snapshots - -Create a new test file with the name `Storyshots.test.js`. (Or whatever the name you prefer, as long as it matches Jest's config [`testMatch`](http://facebook.github.io/jest/docs/en/configuration.html#testmatch-array-string)). -Then add following content to it: - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots(); -``` - -That's all. - -Now run your Jest test command. (Usually, `npm test`.) Then you can see all of your stories are converted as Jest snapshot tests. - -![Screenshot](https://raw.githubusercontent.com/storybookjs/storybook/next/code/addons/storyshots/storyshots-core/docs/storyshots.png) - -### Testing stories that rely on addon-added decorators - -If you have stories in your Storybook that can only render inside a decorator (for instance the [`apollo-storybook-decorator`](https://github.com/abhiaiyer91/apollo-storybook-decorator)), you'll need to ensure those decorators are applied in Storyshots. - -If you export those decorators from your `.storybook/preview.js` then Storyshots will apply those decorators for you in the same way that Storybook does. However if the addon _automatically_ adds the decorator for you (which is a new feature in Storybook 6.0), you will find the decorator does not get added in Storyshots. This is a limitation in Storyshots currently. - -To ensure such decorators get added, export them from `.storybook/preview.js`: - -```js -import addonDecorator from 'some-addon'; - -export const decorators = [addonDecorator]; -``` - -## Configure your app for Jest - -In many cases, for example Create React App, it's already configured for Jest. You need to create a filename with the extension `.test.js`. - -If you still need to configure jest you can use the resources mentioned below: - -- [Getting Started - Jest Official Documentation](https://facebook.github.io/jest/docs/en/getting-started.html) -- [Javascript Testing with Jest - Egghead](https://egghead.io/lessons/javascript-test-javascript-with-jest). **_paid content_** - -> Note: If you use React 16, you'll need to follow [these additional instructions](https://github.com/facebook/react/issues/9102#issuecomment-283873039). -> -> Note: Make sure you have added the `json` extension to `moduleFileExtensions` in `jest.config.json`. If this is missing it leads to the [following error](https://github.com/storybookjs/storybook/issues/3728): `Cannot find module 'spdx-license-ids' from 'scan.js'`. -> -> Note: Please make sure you are using `jsdom` as the testEnvironment on your jest config file. - -### Configure Jest to work with Webpack's [require.context()](https://webpack.js.org/guides/dependency-management/#require-context) - -**NOTE**: if you are using Storybook 5.3's `main.js` to list story files, this is no longer needed. - -Sometimes it's useful to configure Storybook with Webpack's require.context feature. You could be loading stories [one of two ways](https://github.com/storybookjs/storybook/blob/release/5.3/docs/src/pages/basics/writing-stories/index.md#loading-stories). - -1. If you're using the `storiesOf` API, you can integrate it this way: - -```js -import { configure } from '@storybook/react'; - -const req = require.context('../stories', true, /\.stories\.js$/); // <- import all the stories at once - -function loadStories() { - req.keys().forEach((filename) => req(filename)); -} - -configure(loadStories, module); -``` - -2. If you're using Component Story Format (CSF), you'll integrate it like so: - -```js -import { configure } from '@storybook/react'; - -const req = require.context('../stories', true, /\.stories\.js$/); // <- import all the stories at once - -configure(req, module); -``` - -The problem here is that it will work only during the build with webpack, -other tools may lack this feature. Since Storyshot is running under Jest, -we need to polyfill this functionality to work with Jest. The easiest -way is to integrate it to babel. - -You can do this with a Babel [plugin](https://github.com/smrq/babel-plugin-require-context-hook) or [macro](https://github.com/storybookjs/require-context.macro). If you're using `create-react-app` (v2 or above), use the macro. - -#### Option 1: Plugin - -First, install it: - -```sh -yarn add babel-plugin-require-context-hook --dev -``` - -Next, it needs to be registered and loaded before each test. To register it, create a file with the following register function `.jest/register-context.js`: - -```js -import registerRequireContextHook from 'babel-plugin-require-context-hook/register'; -registerRequireContextHook(); -``` - -That file needs to be added as a setup file for Jest. To do that, add (or create) a property in Jest's config called [`setupFiles`](https://jestjs.io/docs/en/configuration.html#setupfiles-array). Add the file name and path to this array. - -```json -setupFiles: ['/.jest/register-context.js'] -``` - -Finally, add the plugin to `.babelrc`: - -```json -{ - "presets": ["..."], - "plugins": ["..."], - "env": { - "test": { - "plugins": ["require-context-hook"] - } - } -} -``` - -The plugin is only added to the test environment otherwise it could replace webpack's version of it. - -#### Option 2: Macro - -First, install it: - -```sh -yarn add require-context.macro --dev -``` - -Now, inside of your Storybook config file, import the macro and run it in place of `require.context`, like so: - -```javascript -import requireContext from 'require-context.macro'; - -// const req = require.context('../stories', true, /\.stories\.js$/); <-- replaced -const req = requireContext('../stories', true, /\.stories\.js$/); -``` - -### Configure Jest for React - -StoryShots addon for React is dependent on [react-test-renderer](https://github.com/facebook/react/tree/master/packages/react-test-renderer), but -[doesn't](#deps-issue) install it, so you need to install it separately. - -```sh -yarn add react-test-renderer --dev -``` - -### Configure Jest for Angular - -StoryShots addon for Angular is dependent on [jest-preset-angular](https://github.com/thymikee/jest-preset-angular), but -[doesn't](#deps-issue) install it, so you need to install it separately. - -```sh -yarn add jest-preset-angular -``` - -If you already use Jest for testing your angular app - probably you already have the needed jest configuration. -Anyway you can add these lines to your jest config: - -```js -module.exports = { - globals: { - __TRANSFORM_HTML__: true, - }, - transform: { - '^.+\\.jsx?$': 'babel-jest', - '^.+\\.(ts|html)$': '/node_modules/jest-preset-angular/preprocessor.js', - }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node', '.html'], -}; -``` - -### Configure Jest for Vue - -StoryShots addon for Vue is dependent on [jest-vue-preprocessor](https://github.com/vire/jest-vue-preprocessor), but -[doesn't](#deps-issue) install it, so you need to install it separately. - -```sh -yarn add jest-vue-preprocessor -``` - -If you already use Jest for testing your vue app - probably you already have the needed jest configuration. -Anyway you can add these lines to your jest config: - -```js -module.exports = { - transform: { - '^.+\\.jsx?$': 'babel-jest', - '.*\\.(vue)$': '/node_modules/jest-vue-preprocessor', - }, - transformIgnorePatterns: ['/node_modules/(?!(@storybook/.*\\.vue$))'], - moduleFileExtensions: ['vue', 'js', 'jsx', 'json', 'node'], -}; -``` - -### Configure Jest for Vue 3 - -StoryShots addon for Vue is dependent on [vue-jest v5](https://www.npmjs.com/package/vue-jest/v/5.0.0-alpha.8), but -[doesn't](#deps-issue) install it, so you need to install it separately. - -```sh -yarn add vue-jest@5.0.0-alpha.8 -``` - -If you already use Jest for testing your vue app - probably you already have the needed jest configuration. -Anyway you can add these lines to your jest config: - -```js -module.exports = { - transform: { - '^.+\\.jsx?$': 'babel-jest', - '.*\\.(vue)$': '/node_modules/vue-jest', - }, - transformIgnorePatterns: ['/node_modules/(?!(@storybook/.*\\.vue$))'], - moduleFileExtensions: ['vue', 'js', 'jsx', 'json', 'node'], -}; -``` - -### Configure Jest for Preact - -StoryShots addon for Preact is dependent on [preact-render-to-string](https://github.com/preactjs/preact-render-to-string), but -[doesn't](#deps-issue) install it, so you need to install it separately. - -```sh -yarn add preact-render-to-string --dev -``` - -### Configure Jest for Web Components - -StoryShots addon for Web Components requires [jsdom](https://github.com/jsdom/jsdom) 16 or later to fully support the -web component shadow dom. To use jsdom 16 or later you can set the Jest `testEnvironment` configuration key to -`jest-environment-jsdom-sixteen`. This should work back to Jest 24 and is the default in Jest 26 and later. - -### Configure Jest for MDX Docs Add-On Stories - -If using the [Docs add-on](../../docs/README.md) with -[MDX stories](../../docs/docs/mdx.md) you will need -to configure Jest to transform MDX stories into something Storyshots can understand: - -Add the following to your Jest configuration: - -```json -{ - "transform": { - "^.+\\.[tj]sx?$": "babel-jest", - "^.+\\.mdx?$": "@storybook/addon-docs/jest-transform-mdx" - } -} -``` - -### Why don't we install dependencies of each framework ? - -Storyshots addon is currently supporting React, Angular and Vue. Each framework needs its own packages to be integrated with Jest. We don't want people that use only React will need to bring other dependencies that do not make sense for them. - -`dependencies` - will installed an exact version of the particular dep - Storyshots can work with different versions of the same framework (let's say React v16 and React v15), that have to be compatible with a version of its plugin (react-test-renderer). - -`optionalDependencies` - behaves like a regular dependency, but do not fail the installation in case there is a problem to bring the dep. - -`peerDependencies` - listing all the deps in peer will trigger warnings during the installation - we don't want users to install unneeded deps by hand. - -`optionalPeerDependencies` - unfortunately there is nothing like this =( - -For more information read npm [docs](https://docs.npmjs.com/files/package.json#dependencies) - -### Using `createNodeMock` to mock refs - -`react-test-renderer` doesn't provide refs for rendered components. By -default, it returns null when the refs are referenced. In order to mock -out elements that rely on refs, you will have to use the -`createNodeMock` option [added to React](https://reactjs.org/blog/2016/11/16/react-v15.4.0.html#mocking-refs-for-snapshot-testing) starting with version 15.4.0. - -Here is an example of how to specify the `createNodeMock` option in Storyshots: - -```js -import initStoryshots, { snapshotWithOptions } from '@storybook/addon-storyshots'; -import TextareaThatUsesRefs from '../component/TextareaThatUsesRefs'; - -initStoryshots({ - test: snapshotWithOptions({ - createNodeMock: (element) => { - if (element.type === TextareaThatUsesRefs) { - return document.createElement('textarea'); - } - }, - }), -}); -``` - -Provide a function to have story-specific options: - -```js -initStoryshots({ - test: snapshotWithOptions((story) => ({ - createNodeMock: (element) => { - if (story.name == 'foobar') { - return null; - } - return element; - }, - })), -}); -``` - -### Using a custom renderer - -By design, [`react-test-renderer` doesn't use a browser environment or JSDOM](https://github.com/facebook/react/issues/20589). Because of this difference, some stories might render in your browser, but not in Storyshots. If you encounter this problem, you may want to switch for an higher level renderer such as `mount` from Enzyme or `render` from React Testing Library. - -#### Example with React Testing Library - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { render } from '@testing-library/react'; - -const reactTestingLibrarySerializer = { - print: (val, serialize, indent) => serialize(val.container.firstChild), - test: (val) => val && val.hasOwnProperty('container'), -}; - -initStoryshots({ - renderer: render, - snapshotSerializers: [reactTestingLibrarySerializer], -}); -``` - -#### Example with Enzyme - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { mount } from 'enzyme'; - -initStoryshots({ - renderer: mount, -}); -``` - -If you are using enzyme, you need to make sure jest knows how to serialize rendered components. -For that, you can pass an enzyme-compatible snapshotSerializer (like [enzyme-to-json](https://github.com/adriantoine/enzyme-to-json), [jest-serializer-enzyme](https://github.com/rogeliog/jest-serializer-enzyme) etc.) with the `snapshotSerializer` option (see below). - -### StoryShots for async rendered components - -You can make use of [Jest done callback](https://jestjs.io/docs/en/asynchronous) to test components that render asynchronously. This callback is passed as param to test method passed to `initStoryshots(...)` when the `asyncJest` option is given as true. - -#### Example - -The following example shows how we can use the **done callback** to take StoryShots of a [Relay](http://facebook.github.io/relay/) component. Each kind of story is written into its own snapshot file with the use of `getSnapshotFileName`. - -Add _stories of UserForm_ in the file: UserForm.story.jsx - -```jsx -/* global module */ -import React from 'react'; -import { QueryRenderer } from 'react-relay'; -import { storiesOf } from '@storybook/react'; - -// Use the same queries used in YOUR app routes -import { newUserFormQuery, editUserFormQuery } from 'app/routes'; -import UserFormContainer from 'app/users/UserForm'; - -// YOUR function to generate a Relay Environment mock. -// See https://github.com/1stdibs/relay-mock-network-layer for more info -import getEnvironment from 'test/support/relay-environment-mock'; - -// User test data YOU generated for your tests -import { user } from 'test/support/data/index'; - -// Use this function to return a new Environment for each story -const Environment = () => - getEnvironment({ - mocks: { - Node: () => ({ __typename: 'User' }), - User: () => user, - }, - }); - -/** - - NOTICE that the QueryRenderer render its children via its render props. - - If we don't take the StoryShot async then we will only see the QueryRenderer in the StoryShot. - - The following QueryRenderer returns null in the first render (it can be a loading indicator instead in real file) and then when it gets the data to respond to query, it renders again with props containing the data for the Component - */ -const renderStory = (query, environment, variables = {}) => ( - { - if (error) { - console.error(error); - } else if (props) { - return ; - } - return null; - }} - /> -); - -storiesOf('users/UserForm', module) - .add('New User', () => { - const environment = new Environment(); - return renderStory(newUserFormQuery, environment); - }) - .add('Editing User', () => { - const environment = new Environment(); - return renderStory(editUserFormQuery, environment, { id: user.id }); - }); -``` - -Then, init Storyshots for async component in the file: StoryShots.test.js - -```jsx -import initStoryshots, { Stories2SnapsConverter } from '@storybook/addon-storyshots'; -import { mount } from 'enzyme'; -import toJson from 'enzyme-to-json'; - -// Runner -initStoryshots({ - asyncJest: true, // this is the option that activates the async behaviour - test: ({ - story, - context, - done, // --> callback passed to test method when asyncJest option is true - }) => { - const converter = new Stories2SnapsConverter(); - const snapshotFilename = converter.getSnapshotFileName(context); - const storyElement = story.render(); - - // mount the story - const tree = mount(storyElement); - - // wait until the mount is updated, in our app mostly by Relay - // but maybe something else updating the state of the component - // somewhere - const waitTime = 1; - setTimeout(() => { - if (snapshotFilename) { - expect(toJson(tree.update())).toMatchSpecificSnapshot(snapshotFilename); - } - - done(); - }, waitTime); - }, - // other options here -}); -``` - -NOTICE that When using the `asyncJest: true` option, you also must specify a `test` method that calls the `done()` callback. - -This is a really powerful technique to write stories of Relay components because it integrates data fetching with component rendering. So instead of passing data props manually, we can let Relay do the job for us as it does in our application. - -Whenever you change your data requirements by adding (and rendering) or (accidentally) deleting fields in your graphql query fragments, you'll get a different snapshot and thus an error in the StoryShot test. - -## Using a custom directory - -Depending on your project's needs, you can configure the `@storybook/addon-storyshots` to use a custom directory for the snapshots. You can read more about it in the [official docs](https://storybook.js.org/docs/react/writing-tests/snapshot-testing). - -## Options - -### `config` - -The `config` parameter must be a function that helps to configure storybook like the `preview.js` does. -If it's not specified, storyshots will try to use [configPath](#configPath) parameter. - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - config: ({ configure }) => - configure(() => { - require('../stories/Button.story.js'); - }, module), -}); -``` - -### `configPath` - -By default, Storyshots assumes the config directory path for your project as below: - -- Storybook for React: `.storybook` -- Storybook for React Native: `storybook` - -If you are using a different config directory path, you could change it like this: - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - configPath: '.my-storybook-config-dir', -}); -``` - -Or, as a more complex example, if we have a package in our `lerna` project called `app` with the path `./packages/app/src/__tests__/storyshots.js` and the storybook config directory `./packages/app/.storybook`: - -```js -import path from 'path'; -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ configPath: path.resolve(__dirname, '../../.storybook') }); -``` - -`configPath` can also specify path to the `preview.js` itself. In this case, config directory will be -a base directory of the `configPath`. It may be useful when the `preview.js` for test should differ from the -original one. It also may be useful for separating tests to different test configs: - -```js -initStoryshots({ - configPath: '.my-storybook-config-dir/testConfig1.js', -}); - -initStoryshots({ - configPath: '.my-storybook-config-dir/testConfig2.js', -}); -``` - -### `suite` - -By default, Storyshots groups stories inside a Jest test suite called "Storyshots". You could change it like this: - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - suite: 'MyStoryshots', -}); -``` - -### `storyKindRegex` - -If you'd like to only run a subset of the stories for your snapshot tests based on the story's kind: - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - storyKindRegex: /^MyComponent$/, -}); -``` - -This can be useful if you want to separate the snapshots in directories next to each component. See an example [here](https://github.com/storybookjs/storybook/issues/892). - -If you want to run all stories except stories of a specific kind, you can write an inverse regex which is true for all kinds except those with a specific word such as `DontTest` - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - storyKindRegex: /^((?!.*?DontTest).)*$/, -}); -``` - -This can be useful while testing react components which make use of the findDomNode API since they always fail with snapshot testing -while using react-test-renderer see [here](https://github.com/facebook/react/issues/8324) - -### `storyNameRegex` - -If you'd like to only run a subset of the stories for your snapshot tests based on the story's name: - -```js -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - storyNameRegex: /buttons/, -}); -``` - -### `framework` - -If you are running tests from outside of your app's directory, storyshots' detection of which framework you are using may fail. Pass `"react"` or `"react-native"` to short-circuit this. - -For example: - -```js -// storybook.test.js - -import path from 'path'; -import initStoryshots from '@storybook/addon-storyshots'; - -initStoryshots({ - framework: 'react', // Manually specify the project's framework - configPath: path.join(__dirname, '.storybook'), - integrityOptions: { cwd: path.join(__dirname, 'src', 'stories') }, - // Other configurations -}); -``` - -Use this table as a reference for manually specifying the framework. - -| angular | html | preact | -| ------- | ------------ | -------------- | -| react | react-native | vue3 | -| svelte | vue | web-components | - -### `test` - -Run a custom test function for each story, rather than the default (a vanilla snapshot test). -Setting `test` will take precedence over the `renderer` option. -You can still overwrite what renderer is used for the test function: - -```js -import initStoryshots, { renderWithOptions } from '@storybook/addon-storyshots'; -import { mount } from 'enzyme'; - -initStoryshots({ - test: renderWithOptions({ - renderer: mount, - }), -}); -``` - -### `renderer` - -Pass a custom renderer (such as enzymes `mount`) to record snapshots. -This may be necessary if you want to use React features that are not supported by the default test renderer, -such as **ref** or **Portals**. -Note that setting `test` overrides `renderer`. - -### `snapshotSerializers` - -Pass an array of snapshotSerializers to the jest runtime that serializes your story (such as enzyme-to-json). - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { createSerializer } from 'enzyme-to-json'; - -initStoryshots({ - renderer: mount, - snapshotSerializers: [createSerializer()], -}); -``` - -This option needs to be set if either: - -- the multiSnapshot function is used to create multiple snapshot files (i.e. one per story), since it ignores any serializers specified in your jest config. -- serializers not specified in your jest config should be used when snapshotting stories. - -### `serializer` (deprecated) - -Pass a custom serializer (such as enzyme-to-json) to serialize components to snapshot-comparable data. The functionality of this option is completely covered by [snapshotSerializers](#snapshotserializers) which should be used instead. - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import toJSON from 'enzyme-to-json'; - -initStoryshots({ - renderer: mount, - serializer: toJSON, -}); -``` - -This option only needs to be set if the default `snapshotSerializers` is not set in your jest config. - -### `stories2snapsConverter` - -This parameter should be an instance of the [`Stories2SnapsConverter`](src/Stories2SnapsConverter.js) (or a derived from it) Class that is used to convert story-file name to snapshot-file name and vice versa. - -By default, the instance of this class is created with these default options: - -```js -{ - snapshotsDirName: '__snapshots__', - snapshotExtension: '.storyshot', - storiesExtensions: ['.js', '.jsx', '.ts', '.tsx'], -} -``` - -This class might be overridden to extend the existing conversion functionality or instantiated to provide different options: - -```js -import initStoryshots, { Stories2SnapsConverter } from '@storybook/addon-storyshots'; - -initStoryshots({ - stories2snapsConverter: new Stories2SnapsConverter({ - snapshotExtension: '.storypuke', - storiesExtensions: ['.foo'], - }), -}); -``` - -## Exports - -Apart from the default export (`initStoryshots`), Storyshots also exports some named test functions (see the `test` option above): - -### `snapshot` - -The default, render the story as normal and take a Jest snapshot. - -### `renderOnly` - -Just render the story, don't check the output at all. This is useful as a low-effort way of smoke testing your -components to ensure they do not error. - -### `snapshotWithOptions(options)` - -Like the default, but allows you to specify a set of options for the test renderer. [See for example here](https://github.com/storybookjs/storybook/blob/b915b5439786e0edb17d7f5ab404bba9f7919381/examples/test-cra/src/storyshots.test.js#L14-L16). - -### `renderWithOptions(options)` - -Like the default, but allows you to specify a set of options for the renderer, just like `snapshotWithOptions`. - -### `multiSnapshotWithOptions(options)` - -Like `snapshotWithOptions`, but generate a separate snapshot file for each stories file rather than a single monolithic file (as is the convention in Jest). This makes it dramatically easier to review changes. If you'd like the benefit of separate snapshot files, but don't have custom options to pass, you can pass an empty object. -If you use [Component Story Format](https://storybook.js.org/docs/react/api/csf), you may also need to add an additional Jest transform to automate detecting story file names: - -```js -// jest.config.js -export default { - transform: { - '^.+\\.stories\\.jsx?$': '@storybook/addon-storyshots/injectFileName', - '^.+\\.jsx?$': 'babel-jest', - }, -}; -``` - -#### integrityOptions - -This option is useful when running test with `multiSnapshotWithOptions(options)` in order to track snapshots are matching the stories. (disabled by default). -The value is a [settings](https://github.com/isaacs/node-glob#options) to a `glob` object, that searches for the snapshot files. - -```js -initStoryshots({ - integrityOptions: { cwd: __dirname }, // it will start searching from the current directory - test: multiSnapshotWithOptions(), -}); -``` - -### `shallowSnapshot` - -Take a snapshot of a shallow-rendered version of the component. Note that this option will be overridden if you pass a `renderer` option. - -### `Stories2SnapsConverter` - -This is a class that generates snapshot's name based on the story (kind, story & filename) and vice versa. - -###### Example: - -Let's say we wanted to create a test function for shallow && multi-file snapshots: - -```js -import initStoryshots, { Stories2SnapsConverter } from '@storybook/addon-storyshots'; -import { shallow } from 'enzyme'; -import toJson from 'enzyme-to-json'; - -const converter = new Stories2SnapsConverter(); - -initStoryshots({ - test: ({ story, context }) => { - const snapshotFileName = converter.getSnapshotFileName(context); - const storyElement = story.render(); - const shallowTree = shallow(storyElement); - - if (snapshotFileName) { - expect(toJson(shallowTree)).toMatchSpecificSnapshot(snapshotFileName); - } - }, -}); -``` - -### `asyncJest` - -Enables Jest `done()` callback in the StoryShots tests for async testing. See [StoryShots for async rendered components](#storyshots-for-async-rendered-components) for more info. - -## Story Parameters - -### `disable` - -Some stories are difficult or impossible to snapshot, such as those covering components that use external DOM-modifying libraries, and those that deliberately throw errors. It is possible to skip stories like these by giving them a parameter of `storyshots: {disable: true}`. There is also a shorthand for this, `storyshots: false`. - -```js -export const Exception = () => { - throw new Error('storyFn threw an error! WHOOPS'); -}; -Exception.storyName = 'story throws exception'; -Exception.parameters = { - storyshots: { disable: true }, -}; -``` diff --git a/code/addons/storyshots-core/docs/storyshots-fail.png b/code/addons/storyshots-core/docs/storyshots-fail.png deleted file mode 100644 index a85498d2ff2f..000000000000 Binary files a/code/addons/storyshots-core/docs/storyshots-fail.png and /dev/null differ diff --git a/code/addons/storyshots-core/docs/storyshots.png b/code/addons/storyshots-core/docs/storyshots.png deleted file mode 100644 index 991e6c0bc18c..000000000000 Binary files a/code/addons/storyshots-core/docs/storyshots.png and /dev/null differ diff --git a/code/addons/storyshots-core/injectFileName.js b/code/addons/storyshots-core/injectFileName.js deleted file mode 100644 index 991bce4fc5f3..000000000000 --- a/code/addons/storyshots-core/injectFileName.js +++ /dev/null @@ -1,23 +0,0 @@ -const { ScriptTransformer } = require('@jest/transform'); - -const getNextTransformer = (fileName, config) => { - const self = config.transform.find(([pattern]) => new RegExp(pattern).test(fileName)); - return new ScriptTransformer({ - ...config, - transform: config.transform.filter((entry) => entry !== self), - }); -}; - -module.exports = { - process(src, fileName, config, { instrument }) { - const transformer = getNextTransformer(fileName, config); - const { code } = transformer.transformSource(fileName, src, instrument); - - return `${code}; -if(exports.default != null) { - exports.default.parameters = exports.default.parameters || {}; - exports.default.parameters.fileName = '${fileName.replace(/\\/g, '\\\\')}'; -} -`; - }, -}; diff --git a/code/addons/storyshots-core/jest.config.js b/code/addons/storyshots-core/jest.config.js deleted file mode 100644 index 0115c67e5629..000000000000 --- a/code/addons/storyshots-core/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -const path = require('path'); -const baseConfig = require('../../jest.config.browser'); - -module.exports = { - ...baseConfig, - snapshotSerializers: [...baseConfig.snapshotSerializers, 'enzyme-to-json/serializer'], - transform: { - ...baseConfig.transform, - '^.+\\.stories\\.[jt]sx?$': '@storybook/addon-storyshots/injectFileName', - }, - displayName: __dirname.split(path.sep).slice(-2).join(path.posix.sep), -}; diff --git a/code/addons/storyshots-core/package.json b/code/addons/storyshots-core/package.json deleted file mode 100644 index ab7e10f31a92..000000000000 --- a/code/addons/storyshots-core/package.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "name": "@storybook/addon-storyshots", - "version": "7.6.0-beta.2", - "description": "Take a code snapshot of every story automatically with Jest", - "keywords": [ - "addon", - "storybook", - "test" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/addons/storyshots-core", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/addons/storyshots-core" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "main": "dist/index.js", - "module": "dist/index.mjs", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.mjs", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/tsc.ts" - }, - "dependencies": { - "@jest/transform": "^29.3.1", - "@storybook/babel-plugin-require-context-hook": "1.0.1", - "@storybook/client-api": "workspace:*", - "@storybook/core-common": "workspace:*", - "@storybook/core-webpack": "workspace:*", - "@storybook/global": "^5.0.0", - "@storybook/preview-api": "workspace:*", - "@storybook/types": "workspace:*", - "@types/jest-specific-snapshot": "^0.5.6", - "glob": "^10.0.0", - "jest-specific-snapshot": "^8.0.0", - "preact-render-to-string": "^5.1.19", - "pretty-format": "^29.0.0", - "react-test-renderer": "^16.8.0 || ^17.0.0 || ^18.0.0", - "read-pkg-up": "^7.0.1", - "ts-dedent": "^2.0.0" - }, - "devDependencies": { - "@angular/core": "^16.0.0-rc.4", - "@angular/platform-browser-dynamic": "^16.0.0-rc.4", - "@emotion/jest": "^11.8.0", - "@storybook/addon-docs": "workspace:*", - "@storybook/angular": "workspace:*", - "@storybook/react": "workspace:*", - "@storybook/vue": "workspace:*", - "@storybook/vue3": "workspace:*", - "babel-loader": "^9.1.2", - "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.5", - "enzyme-to-json": "^3.6.1", - "jest-preset-angular": "^13.0.1", - "jest-vue-preprocessor": "^1.7.1", - "react-test-renderer": "^16", - "rxjs": "^6.6.3", - "vue-jest": "^5.0.0-alpha.8" - }, - "peerDependencies": { - "@angular/core": ">=13.0.0", - "@angular/platform-browser-dynamic": ">=13.0.0", - "@storybook/angular": "*", - "@storybook/react": "*", - "@storybook/vue": "*", - "@storybook/vue3": "*", - "jest": "*", - "jest-preset-angular": " >= 12.2.3", - "jest-vue-preprocessor": "*", - "preact": "^10.5.13", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "rxjs": "*", - "svelte": "*", - "vue": "*", - "vue-jest": "*" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - }, - "@angular/platform-browser-dynamic": { - "optional": true - }, - "@storybook/angular": { - "optional": true - }, - "@storybook/react": { - "optional": true - }, - "@storybook/vue": { - "optional": true - }, - "@storybook/vue3": { - "optional": true - }, - "jest-preset-angular": { - "optional": true - }, - "jest-vue-preprocessor": { - "optional": true - }, - "preact": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "rxjs": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-jest": { - "optional": true - } - }, - "publishConfig": { - "access": "public" - }, - "bundler": {}, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17", - "storybook": { - "displayName": "Storyshots", - "icon": "https://user-images.githubusercontent.com/263385/101991676-48cdf300-3c7c-11eb-8aa1-944dab6ab29b.png", - "unsupportedFrameworks": [ - "ember" - ] - } -} diff --git a/code/addons/storyshots-core/preset.js b/code/addons/storyshots-core/preset.js deleted file mode 100644 index 501f6e0c1310..000000000000 --- a/code/addons/storyshots-core/preset.js +++ /dev/null @@ -1,4 +0,0 @@ -// storyshots is not a typical addon because it's just a command-line tool -// nevertheless if you add it to .storybook/main.js it shouldn't complain -// https://github.com/storybookjs/storybook/issues/7959 -module.exports = {}; diff --git a/code/addons/storyshots-core/project.json b/code/addons/storyshots-core/project.json deleted file mode 100644 index d4369a8485c9..000000000000 --- a/code/addons/storyshots-core/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/addon-storyshots", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/addons/storyshots-core/src/Stories2SnapsConverter.test.ts b/code/addons/storyshots-core/src/Stories2SnapsConverter.test.ts deleted file mode 100644 index 916ee94eb34c..000000000000 --- a/code/addons/storyshots-core/src/Stories2SnapsConverter.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Stories2SnapsConverter } from './Stories2SnapsConverter'; - -const target = new Stories2SnapsConverter(); - -describe('getSnapshotFileName', () => { - it('fileName is provided - snapshot is stored in __snapshots__ dir', () => { - const context = { fileName: 'foo.js', kind: 'kind' }; - - const result = target.getSnapshotFileName(context); - const platformAgnosticResult = result?.replace(/\\|\//g, '/'); - - // This is an absolute path, so we need to use `toContain()` - expect(platformAgnosticResult).toContain('__snapshots__/foo.storyshot'); - }); - - it('fileName with multiple extensions is provided - only the last extension is replaced', () => { - const context = { fileName: 'foo.web.stories.js', kind: 'kind' }; - - const result = target.getSnapshotFileName(context); - const platformAgnosticResult = result?.replace(/\\|\//g, '/'); - - // This is an absolute path, so we need to use `toContain()` - expect(platformAgnosticResult).toContain('__snapshots__/foo.web.stories.storyshot'); - }); - - it('fileName with dir is provided - __snapshots__ dir is created inside another dir', () => { - const context = { fileName: 'test/foo.js', kind: 'kind' }; - - const result = target.getSnapshotFileName(context); - const platformAgnosticResult = result?.replace(/\\|\//g, '/'); - - // This is an absolute path, so we need to use `toContain()` - expect(platformAgnosticResult).toContain('test/__snapshots__/foo.storyshot'); - }); -}); - -describe('getPossibleStoriesFiles', () => { - it('storyshots is provided and all the posible stories file names are returned', () => { - const storyshots = 'test/__snapshots__/foo.web.stories.storyshot'; - - const result = target.getPossibleStoriesFiles(storyshots); - const platformAgnosticResult = result.map((path) => path.replace(/\\|\//g, '/')); - - expect(platformAgnosticResult).toEqual([ - 'test/foo.web.stories.js', - 'test/foo.web.stories.jsx', - 'test/foo.web.stories.ts', - 'test/foo.web.stories.tsx', - 'test/foo.web.stories.mdx', - ]); - }); -}); diff --git a/code/addons/storyshots-core/src/Stories2SnapsConverter.ts b/code/addons/storyshots-core/src/Stories2SnapsConverter.ts deleted file mode 100644 index 4d6788e6b278..000000000000 --- a/code/addons/storyshots-core/src/Stories2SnapsConverter.ts +++ /dev/null @@ -1,76 +0,0 @@ -import path from 'path'; -import { dedent } from 'ts-dedent'; - -const defaultOptions: Stories2SnapsConverterOptions = { - snapshotsDirName: '__snapshots__', - snapshotExtension: '.storyshot', - storiesExtensions: ['.js', '.jsx', '.ts', '.tsx', '.mdx'], -}; - -export interface Stories2SnapsConverterOptions { - storiesExtensions: string[]; - snapshotExtension: string; - snapshotsDirName: string; -} - -export class Stories2SnapsConverter { - options: Stories2SnapsConverterOptions; - - constructor(options: Partial = {}) { - this.options = { - ...defaultOptions, - ...options, - }; - } - - getSnapshotExtension = () => this.options.snapshotExtension; - - getStoryshotFile(fileName: string) { - const { dir, name } = path.parse(fileName); - const { snapshotsDirName, snapshotExtension } = this.options; - - // Convert to absolute path, in case jest is not running in CWD, - // else it will create snapshots with the wrong path - const absDir = path.isAbsolute(dir) ? dir : path.resolve(dir); - - return path.format({ - dir: path.join(absDir, snapshotsDirName), - name, - ext: snapshotExtension, - }); - } - - getSnapshotFileName(context: { fileName?: string; kind: any }) { - const { fileName, kind } = context; - - if (!fileName) { - // eslint-disable-next-line no-console - console.warn( - dedent` - Storybook was unable to detect filename for stories of kind "${kind}". - To fix it, add following to your jest.config.js: - transform: { - // should be above any other js transform like babel-jest - '^.+\\.stories\\.js$': '@storybook/addon-storyshots/injectFileName', - } - ` - ); - return undefined; - } - - return this.getStoryshotFile(fileName); - } - - getPossibleStoriesFiles(storyshotFile: string) { - const { dir, name } = path.parse(storyshotFile); - const { storiesExtensions } = this.options; - - return storiesExtensions.map((ext) => - path.format({ - dir: path.dirname(dir), - name, - ext, - }) - ); - } -} diff --git a/code/addons/storyshots-core/src/api/StoryshotsOptions.ts b/code/addons/storyshots-core/src/api/StoryshotsOptions.ts deleted file mode 100644 index cbc853717de3..000000000000 --- a/code/addons/storyshots-core/src/api/StoryshotsOptions.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type { GlobOptionsWithFileTypesFalse } from 'glob'; -import type { Stories2SnapsConverter } from '../Stories2SnapsConverter'; -import type { SupportedFramework } from '../frameworks'; -import type { RenderTree } from '../frameworks/Loader'; - -export interface TestMethodOptions { - story: any; - context: any; - renderTree: RenderTree; - renderShallowTree: RenderTree; - stories2snapsConverter: Stories2SnapsConverter; - snapshotFileName?: string; - options: any; - done?: () => void; -} - -export interface StoryshotsTestMethod { - (args: TestMethodOptions): any; - beforeAll?: () => void | Promise; - beforeEach?: () => void | Promise; - afterAll?: () => void | Promise; - afterEach?: () => void | Promise; -} - -export interface StoryshotsOptions { - asyncJest?: boolean; - config?: (options: any) => void; - integrityOptions?: GlobOptionsWithFileTypesFalse | false; - configPath?: string; - suite?: string; - storyKindRegex?: RegExp | string; - storyNameRegex?: RegExp | string; - framework?: SupportedFramework; - test?: StoryshotsTestMethod; - renderer?: Function; - snapshotSerializers?: jest.SnapshotSerializerPlugin[]; - /** - * @Deprecated The functionality of this option is completely covered by snapshotSerializers which should be used instead. - */ - serializer?: any; - stories2snapsConverter?: Stories2SnapsConverter; -} diff --git a/code/addons/storyshots-core/src/api/ensureOptionsDefaults.ts b/code/addons/storyshots-core/src/api/ensureOptionsDefaults.ts deleted file mode 100644 index 742c85173bb7..000000000000 --- a/code/addons/storyshots-core/src/api/ensureOptionsDefaults.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { snapshotWithOptions } from '../test-bodies'; -import { Stories2SnapsConverter } from '../Stories2SnapsConverter'; -import type { StoryshotsOptions } from './StoryshotsOptions'; - -const ignore = ['**/node_modules/**']; -const defaultStories2SnapsConverter = new Stories2SnapsConverter(); - -function getIntegrityOptions({ integrityOptions }: StoryshotsOptions) { - if (integrityOptions === false) { - return false; - } - - if (typeof integrityOptions !== 'object') { - return false; - } - - const ignoreOption: string[] = Array.isArray(integrityOptions.ignore) - ? integrityOptions.ignore - : []; - - return { - ...integrityOptions, - ignore: [...ignore, ...ignoreOption], - absolute: true, - }; -} - -function ensureOptionsDefaults(options: StoryshotsOptions) { - const { - suite = 'Storyshots', - asyncJest, - storyNameRegex, - storyKindRegex, - renderer, - serializer, - snapshotSerializers, - stories2snapsConverter = defaultStories2SnapsConverter, - test: testMethod = snapshotWithOptions({ renderer, serializer }), - } = options; - - const integrityOptions = getIntegrityOptions(options); - - return { - asyncJest, - suite, - storyNameRegex, - storyKindRegex, - stories2snapsConverter, - testMethod, - snapshotSerializers, - integrityOptions, - } as any; -} - -export default ensureOptionsDefaults; diff --git a/code/addons/storyshots-core/src/api/index.ts b/code/addons/storyshots-core/src/api/index.ts deleted file mode 100644 index 932d728a6345..000000000000 --- a/code/addons/storyshots-core/src/api/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { global } from '@storybook/global'; -import { addons, mockChannel } from '@storybook/preview-api'; -import ensureOptionsDefaults from './ensureOptionsDefaults'; -import snapshotsTests from './snapshotsTestsTemplate'; -import integrityTest from './integrityTestTemplate'; -import loadFramework from '../frameworks/frameworkLoader'; -import type { StoryshotsOptions } from './StoryshotsOptions'; - -const { describe, window: globalWindow } = global; - -type TestMethod = 'beforeAll' | 'beforeEach' | 'afterEach' | 'afterAll'; -const methods: TestMethod[] = ['beforeAll', 'beforeEach', 'afterEach', 'afterAll']; - -function callTestMethodGlobals( - testMethod: { [key in TestMethod]?: Function & { timeout?: number } } & { [key in string]: any } -) { - methods.forEach((method) => { - if (typeof testMethod[method] === 'function') { - // @ts-expect-error (ignore) - global[method](testMethod[method], testMethod[method].timeout); - } - }); -} - -const isDisabled = (parameter: any) => - parameter === false || (parameter && parameter.disable === true); -function testStorySnapshots(options: StoryshotsOptions = {}) { - if (typeof describe !== 'function') { - throw new Error('testStorySnapshots is intended only to be used inside jest'); - } - - addons.setChannel(mockChannel()); - - const { storybook, framework, renderTree, renderShallowTree } = loadFramework(options); - const { - asyncJest, - suite, - storyNameRegex, - storyKindRegex, - stories2snapsConverter, - testMethod, - integrityOptions, - snapshotSerializers, - } = ensureOptionsDefaults(options); - const testMethodParams = { - renderTree, - renderShallowTree, - stories2snapsConverter, - }; - - // NOTE: as the store + preview's initialization process entirely uses - // `SychronousPromise`s in the v6 store case, the callback to the `then()` here - // will run *immediately* (in the same tick), and thus the `snapshotsTests`, and - // subsequent calls to `it()` etc will all happen within this tick, which is required - // by Jest (cannot add tests asynchronously) - globalWindow.__STORYBOOK_STORY_STORE__.initializationPromise.then(() => { - const data = storybook.raw()?.reduce( - (acc, item) => { - if (storyNameRegex && !item.name.match(storyNameRegex)) { - return acc; - } - - if (storyKindRegex && !item.kind.match(storyKindRegex)) { - return acc; - } - - const { kind, storyFn: render, parameters } = item; - const existing = acc.find((i: any) => i.kind === kind); - const { fileName } = item.parameters; - - if (!isDisabled(parameters.storyshots)) { - if (existing) { - existing.children.push({ ...item, render, fileName }); - } else { - acc.push({ - kind, - children: [{ ...item, render, fileName }], - }); - } - } - return acc; - }, - [] as { - kind: string; - children: any[]; - }[] - ); - - if (data && data.length) { - callTestMethodGlobals(testMethod); - - snapshotsTests({ - data, - asyncJest, - suite, - framework, - testMethod, - testMethodParams, - snapshotSerializers, - }); - - integrityTest(integrityOptions, stories2snapsConverter); - } else { - throw new Error('storyshots found 0 stories'); - } - }); -} - -export default testStorySnapshots; diff --git a/code/addons/storyshots-core/src/api/integrityTestTemplate.ts b/code/addons/storyshots-core/src/api/integrityTestTemplate.ts deleted file mode 100644 index be6cd5bf79fe..000000000000 --- a/code/addons/storyshots-core/src/api/integrityTestTemplate.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable jest/no-export */ -import fs from 'fs'; -import { globSync } from 'glob'; -import { global } from '@storybook/global'; -import { dedent } from 'ts-dedent'; - -const { describe, it } = global; - -expect.extend({ - notToBeAbandoned(storyshots, stories2snapsConverter) { - const abandonedStoryshots = storyshots.filter((fileName: string) => { - const possibleStoriesFiles = stories2snapsConverter.getPossibleStoriesFiles(fileName); - return !possibleStoriesFiles.some(fs.existsSync); - }); - - if (abandonedStoryshots.length === 0) { - return { pass: true, message: () => '' }; - } - - const formattedList = abandonedStoryshots.join('\n '); - - // See https://github.com/facebook/jest/issues/8732#issuecomment-516445064 - // eslint-disable-next-line no-underscore-dangle - const isUpdate = expect.getState().snapshotState._updateSnapshot === 'all'; - if (isUpdate) { - abandonedStoryshots.forEach((file: string) => fs.unlinkSync(file)); - // eslint-disable-next-line no-console - console.log(dedent` - Removed abandoned storyshots: - ${formattedList} - `); - return { pass: true, message: () => '' }; - } - - return { - pass: false, - message: () => dedent` - Found abandoned storyshots. Run jest with -u to remove them: - ${formattedList} - `, - }; - }, -}); - -function integrityTest(integrityOptions: any, stories2snapsConverter: any) { - if (integrityOptions === false) { - return; - } - - describe('Storyshots Integrity', () => { - it('Abandoned Storyshots', () => { - const snapshotExtension = stories2snapsConverter.getSnapshotExtension(); - const storyshots = globSync(`**/*${snapshotExtension}`, integrityOptions); - - // @ts-expect-error (ts doesn't 'get' the extension happening on line 9) - expect(storyshots).notToBeAbandoned(stories2snapsConverter); - }); - }); -} - -export default integrityTest; diff --git a/code/addons/storyshots-core/src/api/snapshotsTestsTemplate.ts b/code/addons/storyshots-core/src/api/snapshotsTestsTemplate.ts deleted file mode 100644 index 1e2ee8cbf9f4..000000000000 --- a/code/addons/storyshots-core/src/api/snapshotsTestsTemplate.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* eslint-disable jest/no-export */ -/* eslint-disable jest/expect-expect */ -import { global } from '@storybook/global'; -import { addSerializer } from 'jest-specific-snapshot'; - -const { describe, it } = global; - -function snapshotTest({ item, asyncJest, framework, testMethod, testMethodParams }: any) { - const { name } = item; - const context = { ...item, framework }; - - if (asyncJest === true) { - it( - `${name}`, - () => - new Promise((resolve, reject) => - testMethod({ - done: (error: any) => (error ? reject(error) : resolve()), - story: item, - context, - ...testMethodParams, - }) - ), - testMethod.timeout - ); - } else { - it( - `${name}`, - () => - testMethod({ - story: item, - context, - ...testMethodParams, - }), - testMethod.timeout - ); - } -} - -function snapshotTestSuite({ item, suite, ...restParams }: any) { - const { kind, children } = item; - describe(`${suite}`, () => { - describe(`${kind}`, () => { - children.forEach((c: any) => { - snapshotTest({ item: c, ...restParams }); - }); - }); - }); -} - -function snapshotsTests({ data, snapshotSerializers, ...restParams }: any) { - if (snapshotSerializers) { - snapshotSerializers.forEach((serializer: any) => { - addSerializer(serializer); - expect.addSnapshotSerializer(serializer); - }); - } - - data.forEach((item: any) => { - snapshotTestSuite({ item, ...restParams }); - }); -} - -export default snapshotsTests; diff --git a/code/addons/storyshots-core/src/frameworks/Loader.ts b/code/addons/storyshots-core/src/frameworks/Loader.ts deleted file mode 100644 index b7d93898aa1f..000000000000 --- a/code/addons/storyshots-core/src/frameworks/Loader.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Renderer, Addon_Loadable } from '@storybook/types'; -import type { ClientApi as ClientApiClass } from '@storybook/preview-api'; -import type { StoryshotsOptions } from '../api/StoryshotsOptions'; -import type { SupportedFramework } from './SupportedFramework'; - -export type RenderTree = (story: any, context?: any, options?: any) => any; - -export interface ClientApi extends ClientApiClass { - configure( - loader: Addon_Loadable, - module: NodeModule | false, - showDeprecationWarning?: boolean - ): void; - forceReRender(): void; -} - -export interface Loader { - load: (options: StoryshotsOptions) => { - framework: SupportedFramework; - renderTree: RenderTree; - renderShallowTree: any; - storybook: ClientApi; - }; - test: (options: StoryshotsOptions) => boolean; -} diff --git a/code/addons/storyshots-core/src/frameworks/SupportedFramework.ts b/code/addons/storyshots-core/src/frameworks/SupportedFramework.ts deleted file mode 100644 index dfc20d8163ce..000000000000 --- a/code/addons/storyshots-core/src/frameworks/SupportedFramework.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type SupportedFramework = - | 'angular' - | 'html' - | 'preact' - | 'react' - | 'react-native' - | 'svelte' - | 'vue' - | 'vue3' - | 'web-components'; diff --git a/code/addons/storyshots-core/src/frameworks/angular/loader.ts b/code/addons/storyshots-core/src/frameworks/angular/loader.ts deleted file mode 100644 index 48b367bb4d27..000000000000 --- a/code/addons/storyshots-core/src/frameworks/angular/loader.ts +++ /dev/null @@ -1,70 +0,0 @@ -import hasDependency from '../hasDependency'; -import configure from '../configure'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function setupAngularJestPreset() { - // Angular + Jest + Storyshots = Crazy Shit: - // We need to require 'jest-preset-angular/build/setupJest' before any storybook code - // is running inside jest - one of the things that `jest-preset-angular/build/setupJest` does is - // extending the `window.Reflect` with all the needed metadata functions, that are required - // for emission of the TS decorations like 'design:paramtypes' - jest.requireActual('jest-preset-angular/setup-jest'); -} - -function test(options: StoryshotsOptions): boolean { - return ( - options.framework === 'angular' || (!options.framework && hasDependency('@storybook/angular')) - ); -} - -function load(options: StoryshotsOptions) { - setupAngularJestPreset(); - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/angular', () => { - const renderAPI = jest.requireActual('@storybook/angular'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/angular'); - - configure({ - ...options, - storybook, - }); - - return { - framework: 'angular' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for angular'); - }, - storybook, - }; -} - -const angularLoader: Loader = { - load, - test, -}; - -export default angularLoader; diff --git a/code/addons/storyshots-core/src/frameworks/angular/renderTree.ts b/code/addons/storyshots-core/src/frameworks/angular/renderTree.ts deleted file mode 100644 index 3c501c70dcc5..000000000000 --- a/code/addons/storyshots-core/src/frameworks/angular/renderTree.ts +++ /dev/null @@ -1,38 +0,0 @@ -import AngularSnapshotSerializer from 'jest-preset-angular/build/serializers/ng-snapshot'; -import HTMLCommentSerializer from 'jest-preset-angular/build/serializers/html-comment'; -import { TestBed } from '@angular/core/testing'; -import { addSerializer } from 'jest-specific-snapshot'; -import { getApplication, storyPropsProvider, PropertyExtractor } from '@storybook/angular/renderer'; -import { BehaviorSubject } from 'rxjs'; - -addSerializer(HTMLCommentSerializer); -addSerializer(AngularSnapshotSerializer); - -function getRenderedTree(story: any) { - const currentStory = story.render(); - - const analyzedMetadata = new PropertyExtractor(currentStory.moduleMetadata, story.component); - - const application = getApplication({ - storyFnAngular: currentStory, - component: story.component, - // TODO : To change with the story Id in v7. Currently keep with static id to avoid changes in snapshots - targetSelector: 'storybook-wrapper', - analyzedMetadata, - }); - - TestBed.configureTestingModule({ - imports: [application], - providers: [storyPropsProvider(new BehaviorSubject(currentStory.props))], - }); - - return TestBed.compileComponents().then(() => { - const tree = TestBed.createComponent(application); - tree.detectChanges(); - - // Empty componentInstance remove attributes of the internal main component () in snapshot - return { ...tree, componentInstance: {} }; - }); -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/angular/types.ts b/code/addons/storyshots-core/src/frameworks/angular/types.ts deleted file mode 100644 index b97c5d24fdc9..000000000000 --- a/code/addons/storyshots-core/src/frameworks/angular/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -export interface NgModuleMetadata { - declarations?: any[]; - entryComponents?: any[]; - imports?: any[]; - schemas?: any[]; - providers?: any[]; -} - -export interface ICollection { - [p: string]: any; -} - -export interface NgStory { - props: ICollection; - moduleMetadata?: NgModuleMetadata; - template?: string; -} diff --git a/code/addons/storyshots-core/src/frameworks/configure.test.ts b/code/addons/storyshots-core/src/frameworks/configure.test.ts deleted file mode 100644 index 0e4377e9dede..000000000000 --- a/code/addons/storyshots-core/src/frameworks/configure.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import path from 'path'; -import { getPreviewFile, getMainFile } from './configure'; - -// eslint-disable-next-line global-require, jest/no-mocks-import -jest.mock('fs', () => require('../../../../__mocks__/fs')); -const setupFiles = (files: Record) => { - // eslint-disable-next-line no-underscore-dangle, global-require - require('fs').__setMockFiles(files); -}; - -describe('preview files', () => { - it.each` - filepath - ${'preview.ts'} - ${'preview.tsx'} - ${'preview.js'} - ${'preview.jsx'} - ${'config.ts'} - ${'config.tsx'} - ${'config.js'} - ${'config.jsx'} - `('resolves a valid preview file from $filepath', ({ filepath }) => { - setupFiles({ [path.join('test', filepath)]: 'true' }); - - expect(getPreviewFile('test/')).toEqual(`test${path.sep}${filepath}`); - }); - - it('returns false when none of the paths exist', () => { - setupFiles(Object.create(null)); - - expect(getPreviewFile('test/')).toEqual(false); - }); -}); - -describe('main files', () => { - it.each` - filepath - ${'main.ts'} - ${'main.tsx'} - ${'main.js'} - ${'main.jsx'} - `('resolves a valid main file path from $filepath', ({ filepath }) => { - setupFiles({ [path.join('test', filepath)]: 'true' }); - - expect(getMainFile('test/')).toEqual(`test${path.sep}${filepath}`); - }); - - it('returns false when none of the paths exist', () => { - setupFiles(Object.create(null)); - - expect(getPreviewFile('test/')).toEqual(false); - }); -}); diff --git a/code/addons/storyshots-core/src/frameworks/configure.ts b/code/addons/storyshots-core/src/frameworks/configure.ts deleted file mode 100644 index 5532a2dfea8c..000000000000 --- a/code/addons/storyshots-core/src/frameworks/configure.ts +++ /dev/null @@ -1,157 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import type { - Renderer, - ArgsEnhancer, - ArgTypesEnhancer, - NormalizedStoriesSpecifier, - StoriesEntry, - DecoratorFunction, -} from '@storybook/types'; -import { toRequireContext } from '@storybook/core-webpack'; -import { normalizeStoriesEntry } from '@storybook/core-common'; -import registerRequireContextHook from '@storybook/babel-plugin-require-context-hook/register'; -import { global } from '@storybook/global'; - -import type { ClientApi } from './Loader'; -import type { StoryshotsOptions } from '../api/StoryshotsOptions'; - -registerRequireContextHook(); - -const isFile = (file: string): boolean => { - try { - return fs.lstatSync(file).isFile(); - } catch (e) { - return false; - } -}; - -interface Output { - features?: Record; - preview?: string; - stories?: NormalizedStoriesSpecifier[]; - requireContexts?: string[]; -} - -const supportedExtensions = ['ts', 'tsx', 'js', 'jsx', 'cjs', 'mjs']; - -const resolveFile = (configDir: string, supportedFilenames: string[]) => - supportedFilenames - .flatMap((filename) => - supportedExtensions.map((ext) => path.join(configDir, `${filename}.${ext}`)) - ) - .find(isFile) || false; - -export const getPreviewFile = (configDir: string): string | false => - resolveFile(configDir, ['preview', 'config']); - -export const getMainFile = (configDir: string): string | false => resolveFile(configDir, ['main']); - -function getConfigPathParts(input: string): Output { - const configDir = path.resolve(input); - - if (fs.lstatSync(configDir).isDirectory()) { - const output: Output = {}; - - const preview = getPreviewFile(configDir); - const main = getMainFile(configDir); - - if (preview) { - output.preview = preview; - } - if (main) { - const { default: defaultExport, ...rest } = jest.requireActual(main); - const { stories = [], features = {} } = defaultExport || rest; - - output.features = features; - - const workingDir = process.cwd(); - output.stories = stories.map((entry: StoriesEntry) => { - const specifier = normalizeStoriesEntry(entry, { - configDir, - workingDir, - }); - - return specifier; - }); - output.requireContexts = output.stories?.map((specifier) => { - const { path: basePath, recursive, match } = toRequireContext(specifier); - - // eslint-disable-next-line no-underscore-dangle - return global.__requireContext(workingDir, basePath, recursive, match); - }); - } - - return output; - } - - return { preview: configDir }; -} - -function configure( - options: { - storybook: ClientApi; - } & StoryshotsOptions -): void { - const { configPath = '.storybook', config, storybook } = options; - - if (config && typeof config === 'function') { - config(storybook); - return; - } - - const { - preview, - features = {}, - stories = [], - requireContexts = [], - } = getConfigPathParts(configPath); - - global.FEATURES = features; - global.CONFIG_TYPE = 'DEVELOPMENT'; - global.STORIES = stories.map((specifier) => ({ - ...specifier, - importPathMatcher: specifier.importPathMatcher.source, - })); - - if (preview) { - // This is essentially the same code as builders/builder-webpack5/templates/virtualModuleEntry.template - const { - parameters, - decorators, - globals, - globalTypes, - argsEnhancers, - argTypesEnhancers, - runStep, - } = jest.requireActual(preview); - - if (decorators) { - decorators.forEach((decorator: DecoratorFunction) => - storybook.addDecorator(decorator) - ); - } - if (parameters || globals || globalTypes) { - storybook.addParameters({ ...parameters, globals, globalTypes }); - } - if (runStep) { - storybook.addStepRunner(runStep); - } - if (argsEnhancers) { - argsEnhancers.forEach((enhancer: ArgsEnhancer) => - storybook.addArgsEnhancer(enhancer as any) - ); - } - if (argTypesEnhancers) { - argTypesEnhancers.forEach((enhancer: ArgTypesEnhancer) => - storybook.addArgTypesEnhancer(enhancer as any) - ); - } - } - - if (requireContexts && requireContexts.length) { - storybook.configure(requireContexts, false, false); - } -} - -export default configure; diff --git a/code/addons/storyshots-core/src/frameworks/frameworkLoader.ts b/code/addons/storyshots-core/src/frameworks/frameworkLoader.ts deleted file mode 100644 index 40fbed19b2a3..000000000000 --- a/code/addons/storyshots-core/src/frameworks/frameworkLoader.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* eslint-disable global-require,import/no-dynamic-require */ -import fs from 'fs'; -import path from 'path'; -import type { Loader } from './Loader'; -import type { StoryshotsOptions } from '../api/StoryshotsOptions'; - -const loaderScriptName = 'loader.js'; - -const isDirectory = (source: string) => fs.lstatSync(source).isDirectory(); - -function getLoaders(): Loader[] { - return fs - .readdirSync(__dirname) - .map((name) => path.join(__dirname, name)) - .filter(isDirectory) - .map((framework) => { - const pa = path.join(framework, loaderScriptName); - const pb = path.join(framework, 'loader.ts'); - - if (fs.existsSync(pa)) { - return pa; - } - - if (fs.existsSync(pb)) { - return pb; - } - - return null; - }) - .filter(Boolean) - .map((loader) => loader && require(loader).default); -} - -function loadFramework(options: StoryshotsOptions) { - const loaders = getLoaders(); - - const loader = loaders.find((frameworkLoader) => frameworkLoader.test(options)); - - if (!loader) { - throw new Error( - "Couldn't find an appropriate framework loader -- do you need to set the `framework` option?" - ); - } - - return loader.load(options); -} - -export default loadFramework; diff --git a/code/addons/storyshots-core/src/frameworks/hasDependency.ts b/code/addons/storyshots-core/src/frameworks/hasDependency.ts deleted file mode 100644 index c88d5347b116..000000000000 --- a/code/addons/storyshots-core/src/frameworks/hasDependency.ts +++ /dev/null @@ -1,18 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import readPkgUp from 'read-pkg-up'; - -const { - packageJson: { dependencies, devDependencies } = { - dependencies: undefined, - devDependencies: undefined, - }, -} = readPkgUp.sync() || {}; - -export default function hasDependency(name: string): boolean { - return Boolean( - (devDependencies && devDependencies[name]) || - (dependencies && dependencies[name]) || - fs.existsSync(path.join('node_modules', name, 'package.json')) - ); -} diff --git a/code/addons/storyshots-core/src/frameworks/html/loader.ts b/code/addons/storyshots-core/src/frameworks/html/loader.ts deleted file mode 100644 index df86afc1961e..000000000000 --- a/code/addons/storyshots-core/src/frameworks/html/loader.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { global } from '@storybook/global'; -import configure from '../configure'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return options.framework === 'html'; -} - -function load(options: StoryshotsOptions) { - global.STORYBOOK_ENV = 'html'; - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/html', () => { - const renderAPI = jest.requireActual('@storybook/html'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/html'); - - configure({ - ...options, - storybook, - }); - - return { - framework: 'html' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for HTML'); - }, - storybook, - }; -} - -const htmLoader: Loader = { - load, - test, -}; - -export default htmLoader; diff --git a/code/addons/storyshots-core/src/frameworks/html/renderTree.ts b/code/addons/storyshots-core/src/frameworks/html/renderTree.ts deleted file mode 100644 index 2347acb15867..000000000000 --- a/code/addons/storyshots-core/src/frameworks/html/renderTree.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { global } from '@storybook/global'; - -const { document, Node } = global; - -function getRenderedTree(story: { render: () => any }) { - const component = story.render(); - - if (component instanceof Node) { - return component; - } - - const section: HTMLElement = document.createElement('section'); - section.innerHTML = component; - - if (section.childElementCount > 1) { - return section; - } - - return section.firstChild; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/index.ts b/code/addons/storyshots-core/src/frameworks/index.ts deleted file mode 100644 index 3eb9b3a990b0..000000000000 --- a/code/addons/storyshots-core/src/frameworks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './SupportedFramework'; diff --git a/code/addons/storyshots-core/src/frameworks/preact/loader.ts b/code/addons/storyshots-core/src/frameworks/preact/loader.ts deleted file mode 100644 index b938dac3f928..000000000000 --- a/code/addons/storyshots-core/src/frameworks/preact/loader.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** @jsxRuntime classic */ -/** @jsx h */ - -import { global } from '@storybook/global'; -import configure from '../configure'; -import hasDependency from '../hasDependency'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return ( - options.framework === 'preact' || (!options.framework && hasDependency('@storybook/preact')) - ); -} - -function load(options: StoryshotsOptions) { - global.STORYBOOK_ENV = 'preact'; - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/preact', () => { - const renderAPI = jest.requireActual('@storybook/preact'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/preact'); - - configure({ - ...options, - storybook, - }); - - return { - framework: 'preact' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for preact'); - }, - storybook, - }; -} - -const preactLoader: Loader = { - load, - test, -}; - -export default preactLoader; diff --git a/code/addons/storyshots-core/src/frameworks/preact/renderTree.ts b/code/addons/storyshots-core/src/frameworks/preact/renderTree.ts deleted file mode 100644 index 5e95dbe95920..000000000000 --- a/code/addons/storyshots-core/src/frameworks/preact/renderTree.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** @jsx h */ -import { h } from 'preact'; -import preactRenderer from 'preact-render-to-string/jsx'; - -const boundRenderer = (_storyElement: any, _rendererOptions: any) => - preactRenderer(_storyElement, null, { pretty: ' ' }); - -function getRenderedTree(story: any, context: any, { renderer, ...rendererOptions }: any) { - const currentRenderer = renderer || boundRenderer; - const tree = currentRenderer(h(story.render, null), rendererOptions); - - return tree; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/react-native/loader.ts b/code/addons/storyshots-core/src/frameworks/react-native/loader.ts deleted file mode 100644 index 7c0e51d23f0f..000000000000 --- a/code/addons/storyshots-core/src/frameworks/react-native/loader.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable global-require */ -import path from 'path'; -import hasDependency from '../hasDependency'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return ( - options.framework === 'react-native' || - (!options.framework && hasDependency('@storybook/react-native')) - ); -} - -function configure(options: StoryshotsOptions, storybook: any) { - const { configPath = 'storybook', config } = options; - - if (config && typeof config === 'function') { - config(storybook); - return; - } - - const resolvedConfigPath = path.resolve(configPath); - jest.requireActual(resolvedConfigPath); -} - -function load(options: StoryshotsOptions) { - const storybook = jest.requireActual('@storybook/react-native'); - - configure(options, storybook); - - return { - renderTree: require('../react/renderTree').default, - renderShallowTree: require('../react/renderShallowTree').default, - framework: 'react-native' as const, - storybook, - }; -} - -const reactNativeLoader: Loader = { - load, - test, -}; - -export default reactNativeLoader; diff --git a/code/addons/storyshots-core/src/frameworks/react/loader.ts b/code/addons/storyshots-core/src/frameworks/react/loader.ts deleted file mode 100644 index 35d62098d183..000000000000 --- a/code/addons/storyshots-core/src/frameworks/react/loader.ts +++ /dev/null @@ -1,55 +0,0 @@ -import configure from '../configure'; -import hasDependency from '../hasDependency'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return options.framework === 'react' || (!options.framework && hasDependency('@storybook/react')); -} - -function load(options: StoryshotsOptions) { - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/react', () => { - const renderAPI = jest.requireActual('@storybook/react'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/react'); - - configure({ - ...options, - storybook, - }); - - return { - framework: 'react' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: jest.requireActual('./renderShallowTree').default, - storybook, - }; -} - -const reactLoader: Loader = { - load, - test, -}; - -export default reactLoader; diff --git a/code/addons/storyshots-core/src/frameworks/react/renderShallowTree.ts b/code/addons/storyshots-core/src/frameworks/react/renderShallowTree.ts deleted file mode 100644 index d8ac7b865b4e..000000000000 --- a/code/addons/storyshots-core/src/frameworks/react/renderShallowTree.ts +++ /dev/null @@ -1,10 +0,0 @@ -import shallow from 'react-test-renderer/shallow'; - -function getRenderedTree(story: any, context: any, { renderer, serializer }: any) { - const storyElement = story.render(); - const shallowRenderer = renderer || shallow.createRenderer(); - const tree = shallowRenderer.render(storyElement); - return serializer ? serializer(tree) : tree; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/react/renderTree.ts b/code/addons/storyshots-core/src/frameworks/react/renderTree.ts deleted file mode 100644 index d92a55710ab1..000000000000 --- a/code/addons/storyshots-core/src/frameworks/react/renderTree.ts +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import reactTestRenderer from 'react-test-renderer'; - -function getRenderedTree(story: any, context: any, { renderer, ...rendererOptions }: any) { - const StoryFn = story.render; - const storyElement = React.createElement(StoryFn); - const currentRenderer = renderer || reactTestRenderer.create; - const tree = currentRenderer(storyElement, rendererOptions); - - return tree; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/svelte/loader.ts b/code/addons/storyshots-core/src/frameworks/svelte/loader.ts deleted file mode 100644 index 5bd09594013c..000000000000 --- a/code/addons/storyshots-core/src/frameworks/svelte/loader.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { global } from '@storybook/global'; -import hasDependency from '../hasDependency'; -import configure from '../configure'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return ( - options.framework === 'svelte' || (!options.framework && hasDependency('@storybook/svelte')) - ); -} - -function load(options: StoryshotsOptions) { - global.STORYBOOK_ENV = 'svelte'; - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/svelte', () => { - const renderAPI = jest.requireActual('@storybook/svelte'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/svelte'); - - configure({ - ...options, - storybook, - }); - return { - framework: 'svelte' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for svelte'); - }, - storybook, - }; -} - -const svelteLoader: Loader = { - load, - test, -}; - -export default svelteLoader; diff --git a/code/addons/storyshots-core/src/frameworks/svelte/renderTree.ts b/code/addons/storyshots-core/src/frameworks/svelte/renderTree.ts deleted file mode 100644 index d39cf95008e9..000000000000 --- a/code/addons/storyshots-core/src/frameworks/svelte/renderTree.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { global } from '@storybook/global'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore - types are removed in Svelte 4 but it still works. ts-ignore is safer than ts-expect-error because it's not an error in Svelte 3 -// eslint-disable-next-line import/no-unresolved -import { set_current_component } from 'svelte/internal'; - -const { document } = global; - -/** - * Provides functionality to convert your raw story to the resulting markup. - * - * Storybook snapshots need the rendered markup that svelte outputs, - * but since we only have the story config data ({ Component, data }) in - * the Svelte stories, we need to mount the component, and then return the - * resulting HTML. - * - * If we don't render to HTML, we will get a snapshot of the raw story - * i.e. ({ Component, data }). - */ -function getRenderedTree(story: any) { - // allow setContext to work - set_current_component({ $$: { context: new Map() } }); - - const { Component, props } = story.render(); - - const DefaultCompatComponent = Component.default || Component; - - // We need to create a target to mount onto. - const target = document.createElement('section'); - - // eslint-disable-next-line no-new - new DefaultCompatComponent({ target, props }); - - // Classify the target so that it is clear where the markup - // originates from, and that it is specific for snapshot tests. - target.className = 'storybook-snapshot-container'; - - return target; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/vue/loader.ts b/code/addons/storyshots-core/src/frameworks/vue/loader.ts deleted file mode 100644 index a29a88a2d98b..000000000000 --- a/code/addons/storyshots-core/src/frameworks/vue/loader.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { global } from '@storybook/global'; -import hasDependency from '../hasDependency'; -import configure from '../configure'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function mockVueToIncludeCompiler() { - jest.mock('vue', () => jest.requireActual('vue/dist/vue.common.js')); -} - -function test(options: StoryshotsOptions): boolean { - return options.framework === 'vue' || (!options.framework && hasDependency('@storybook/vue')); -} - -function load(options: StoryshotsOptions) { - global.STORYBOOK_ENV = 'vue'; - mockVueToIncludeCompiler(); - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/vue', () => { - const renderAPI = jest.requireActual('@storybook/vue'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/vue'); - - configure({ - ...options, - storybook, - }); - return { - framework: 'vue' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for vue'); - }, - storybook, - }; -} - -const vueLoader: Loader = { - load, - test, -}; - -export default vueLoader; diff --git a/code/addons/storyshots-core/src/frameworks/vue/renderTree.ts b/code/addons/storyshots-core/src/frameworks/vue/renderTree.ts deleted file mode 100644 index d37139e813ea..000000000000 --- a/code/addons/storyshots-core/src/frameworks/vue/renderTree.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import Vue from 'vue'; - -// this is defined in @storybook/vue but not exported, -// and we need it to inject args into the story component's props -const VALUES = 'STORYBOOK_VALUES'; - -function getRenderedTree(story: any) { - const component = story.render(); - - // @ts-ignore FIXME storyshots type error - const vm = new Vue({ - // @ts-ignore FIXME storyshots type error - render(h) { - return h(component); - }, - }); - - // @ts-ignore FIXME storyshots type error - vm[VALUES] = story.initialArgs; - - return vm.$mount().$el; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/vue3/loader.ts b/code/addons/storyshots-core/src/frameworks/vue3/loader.ts deleted file mode 100644 index 3fed6869e1a2..000000000000 --- a/code/addons/storyshots-core/src/frameworks/vue3/loader.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { global } from '@storybook/global'; -import hasDependency from '../hasDependency'; -import configure from '../configure'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return options.framework === 'vue3' || (!options.framework && hasDependency('@storybook/vue3')); -} - -function load(options: StoryshotsOptions) { - global.STORYBOOK_ENV = 'vue3'; - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/vue3', () => { - const renderAPI = jest.requireActual('@storybook/vue3'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/vue3'); - - configure({ - ...options, - storybook, - }); - - return { - framework: 'vue3' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for Vue 3'); - }, - storybook, - }; -} - -const vueLoader: Loader = { - load, - test, -}; - -export default vueLoader; diff --git a/code/addons/storyshots-core/src/frameworks/vue3/renderTree.ts b/code/addons/storyshots-core/src/frameworks/vue3/renderTree.ts deleted file mode 100644 index 854cb485b3c1..000000000000 --- a/code/addons/storyshots-core/src/frameworks/vue3/renderTree.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as Vue from 'vue'; -import { global } from '@storybook/global'; - -const { document } = global; - -// This is cast as `any` to workaround type errors caused by Vue 2 types -const { h, createApp } = Vue as any; - -function getRenderedTree(story: any) { - const component = story.render(); - - const app = createApp({ - render() { - return h(component, story.args); - }, - }); - - const vm = app.mount(document.createElement('div')); - vm.$forceUpdate(); - return vm.$el; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/frameworks/web-components/loader.ts b/code/addons/storyshots-core/src/frameworks/web-components/loader.ts deleted file mode 100644 index e3536d85d99d..000000000000 --- a/code/addons/storyshots-core/src/frameworks/web-components/loader.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { global } from '@storybook/global'; -import configure from '../configure'; -import type { Loader } from '../Loader'; -import type { StoryshotsOptions } from '../../api/StoryshotsOptions'; - -function test(options: StoryshotsOptions): boolean { - return options.framework === 'web-components'; -} - -function load(options: StoryshotsOptions) { - global.STORYBOOK_ENV = 'web-components'; - - let mockStartedAPI: any; - - jest.mock('@storybook/preview-api', () => { - const previewAPI = jest.requireActual('@storybook/preview-api'); - - return { - ...previewAPI, - start: (...args: any[]) => { - mockStartedAPI = previewAPI.start(...args); - return mockStartedAPI; - }, - }; - }); - - jest.mock('@storybook/html', () => { - const renderAPI = jest.requireActual('@storybook/html'); - - renderAPI.addDecorator = mockStartedAPI.clientApi.addDecorator; - renderAPI.addParameters = mockStartedAPI.clientApi.addParameters; - - return renderAPI; - }); - - // eslint-disable-next-line global-require - const storybook = require('@storybook/html'); - - configure({ - ...options, - storybook, - }); - - return { - framework: 'web-components' as const, - renderTree: jest.requireActual('./renderTree').default, - renderShallowTree: () => { - throw new Error('Shallow renderer is not supported for web-components'); - }, - storybook, - }; -} - -const webComponentsLoader: Loader = { - load, - test, -}; - -export default webComponentsLoader; diff --git a/code/addons/storyshots-core/src/frameworks/web-components/renderTree.ts b/code/addons/storyshots-core/src/frameworks/web-components/renderTree.ts deleted file mode 100644 index 8c45ea52eaca..000000000000 --- a/code/addons/storyshots-core/src/frameworks/web-components/renderTree.ts +++ /dev/null @@ -1,6 +0,0 @@ -function getRenderedTree(story: { render: () => any }) { - const component = story.render(); - return component.getHTML ? component.getHTML() : component; -} - -export default getRenderedTree; diff --git a/code/addons/storyshots-core/src/index.ts b/code/addons/storyshots-core/src/index.ts deleted file mode 100644 index 1ded51620241..000000000000 --- a/code/addons/storyshots-core/src/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import api from './api'; -import { - snapshotWithOptions, - multiSnapshotWithOptions, - renderOnly, - renderWithOptions, - shallowSnapshot, - snapshot, -} from './test-bodies'; - -export { - snapshotWithOptions, - multiSnapshotWithOptions, - renderOnly, - renderWithOptions, - shallowSnapshot, - snapshot, -}; - -export * from './Stories2SnapsConverter'; -export * from './frameworks'; - -export default api; diff --git a/code/addons/storyshots-core/src/test-bodies.ts b/code/addons/storyshots-core/src/test-bodies.ts deleted file mode 100644 index 3dc307d6b847..000000000000 --- a/code/addons/storyshots-core/src/test-bodies.ts +++ /dev/null @@ -1,85 +0,0 @@ -import 'jest-specific-snapshot'; -import type { - StoryshotsTestMethod, - TestMethodOptions, - StoryshotsOptions, -} from './api/StoryshotsOptions'; - -const isFunction = (obj: any) => !!(obj && obj.constructor && obj.call && obj.apply); -const optionsOrCallOptions = (opts: any, story: any) => (isFunction(opts) ? opts(story) : opts); - -type SnapshotsWithOptionsArgType = Pick | Function; - -type SnapshotsWithOptionsReturnType = ( - options: Pick -) => any; - -export function snapshotWithOptions( - options: SnapshotsWithOptionsArgType = {} -): SnapshotsWithOptionsReturnType { - return ({ story, context, renderTree, snapshotFileName }) => { - const result = renderTree(story, context, optionsOrCallOptions(options, story)); - - function match(tree: any) { - let target = tree; - const isReact = story.parameters.renderer === 'react'; - - if (isReact && typeof tree.childAt === 'function') { - target = tree.childAt(0); - } - if (isReact && Array.isArray(tree.children)) { - [target] = tree.children; - } - - if (snapshotFileName) { - expect(target).toMatchSpecificSnapshot(snapshotFileName); - } else { - expect(target).toMatchSnapshot(); - } - - if (typeof tree.unmount === 'function') { - tree.unmount(); - } - } - - if (typeof result.then === 'function') { - return result.then(match); - } - - return match(result); - }; -} - -export function multiSnapshotWithOptions( - options: SnapshotsWithOptionsArgType = {} -): StoryshotsTestMethod { - return ({ story, context, renderTree, stories2snapsConverter }) => { - const snapshotFileName = stories2snapsConverter.getSnapshotFileName(context); - return snapshotWithOptions(options)({ story, context, renderTree, snapshotFileName }); - }; -} - -export const shallowSnapshot: StoryshotsTestMethod = ({ - story, - context, - renderShallowTree, - options = {}, -}) => { - const result = renderShallowTree(story, context, options); - expect(result).toMatchSnapshot(); -}; - -export function renderWithOptions(options = {}): StoryshotsTestMethod { - return ({ story, context, renderTree }) => { - const result = renderTree(story, context, options); - if (typeof result.then === 'function') { - return result; - } - - return undefined; - }; -} - -export const renderOnly = renderWithOptions(); - -export const snapshot = snapshotWithOptions(); diff --git a/code/addons/storyshots-core/src/typings.d.ts b/code/addons/storyshots-core/src/typings.d.ts deleted file mode 100644 index 2ae47a5617de..000000000000 --- a/code/addons/storyshots-core/src/typings.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable no-underscore-dangle */ -/* eslint-disable @typescript-eslint/naming-convention */ -declare module 'jest-preset-angular/*'; -declare module 'preact-render-to-string/jsx'; -declare module 'react-test-renderer*'; - -declare module '@storybook/babel-plugin-require-context-hook/register'; - -declare var STORYBOOK_ENV: any; -declare var STORIES: any; - -declare var CONFIG_TYPE: 'DEVELOPMENT' | 'PRODUCTION'; -declare var FEATURES: import('@storybook/types').StorybookConfig['features']; - -declare var __STORYBOOK_STORY_STORE__: any; -declare var __requireContext: any; diff --git a/code/addons/storyshots-core/stories/__snapshots__/storyshot.defaultExport.test.js.snap b/code/addons/storyshots-core/stories/__snapshots__/storyshot.defaultExport.test.js.snap deleted file mode 100644 index 42d99ae740ca..000000000000 --- a/code/addons/storyshots-core/stories/__snapshots__/storyshot.defaultExport.test.js.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Another Button with text 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Text Simple 1`] = ` -
- prefix - - contents - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/__snapshots__/storyshot.enzyme.test.js.snap b/code/addons/storyshots-core/stories/__snapshots__/storyshot.enzyme.test.js.snap deleted file mode 100644 index 984165bef39c..000000000000 --- a/code/addons/storyshots-core/stories/__snapshots__/storyshot.enzyme.test.js.snap +++ /dev/null @@ -1,56 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` - -
- prefix - - - - - - suffix -
-
-`; - -exports[`Storyshots Another Button with text 1`] = ` - -
- prefix - - - - - - suffix -
-
-`; - -exports[`Storyshots Text Simple 1`] = ` - -
- prefix - - - contents - - - suffix -
-
-`; diff --git a/code/addons/storyshots-core/stories/__snapshots__/storyshot.metadata.test.js.snap b/code/addons/storyshots-core/stories/__snapshots__/storyshot.metadata.test.js.snap deleted file mode 100644 index 42d99ae740ca..000000000000 --- a/code/addons/storyshots-core/stories/__snapshots__/storyshot.metadata.test.js.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Another Button with text 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Text Simple 1`] = ` -
- prefix - - contents - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/__snapshots__/storyshot.shallow.test.js.snap b/code/addons/storyshots-core/stories/__snapshots__/storyshot.shallow.test.js.snap deleted file mode 100644 index d7def107120a..000000000000 --- a/code/addons/storyshots-core/stories/__snapshots__/storyshot.shallow.test.js.snap +++ /dev/null @@ -1,31 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Another Button with text 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Text Simple 1`] = ` -
- prefix - - - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/__snapshots__/storyshot.shallowWithOptions.test.js.snap b/code/addons/storyshots-core/stories/__snapshots__/storyshot.shallowWithOptions.test.js.snap deleted file mode 100644 index d7def107120a..000000000000 --- a/code/addons/storyshots-core/stories/__snapshots__/storyshot.shallowWithOptions.test.js.snap +++ /dev/null @@ -1,31 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Another Button with text 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Text Simple 1`] = ` -
- prefix - - - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/__snapshots__/storyshot.snapshotWithOptionsFunction.test.js.snap b/code/addons/storyshots-core/stories/__snapshots__/storyshot.snapshotWithOptionsFunction.test.js.snap deleted file mode 100644 index 42d99ae740ca..000000000000 --- a/code/addons/storyshots-core/stories/__snapshots__/storyshot.snapshotWithOptionsFunction.test.js.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Another Button with text 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Text Simple 1`] = ` -
- prefix - - contents - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/default_export/Extra.stories.jsx b/code/addons/storyshots-core/stories/default_export/Extra.stories.jsx deleted file mode 100644 index 4886a1c158f7..000000000000 --- a/code/addons/storyshots-core/stories/default_export/Extra.stories.jsx +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable react/button-has-type */ -import React from 'react'; - -import { storiesOf } from '@storybook/react'; -import { action } from '@storybook/addon-actions'; - -storiesOf('Another Button', module) - .add('with text', () => ) - .add('with some emoji', () => ( - - )); diff --git a/code/addons/storyshots-core/stories/default_export/Text.stories.jsx b/code/addons/storyshots-core/stories/default_export/Text.stories.jsx deleted file mode 100644 index e87143f2c786..000000000000 --- a/code/addons/storyshots-core/stories/default_export/Text.stories.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default { - title: 'Text', -}; - -export const Simple = () => 'contents'; diff --git a/code/addons/storyshots-core/stories/default_export/__snapshots__/Extra.stories@Another-_-Button@with-_-some-_-emoji.boo b/code/addons/storyshots-core/stories/default_export/__snapshots__/Extra.stories@Another-_-Button@with-_-some-_-emoji.boo deleted file mode 100644 index a1027859204f..000000000000 --- a/code/addons/storyshots-core/stories/default_export/__snapshots__/Extra.stories@Another-_-Button@with-_-some-_-emoji.boo +++ /dev/null @@ -1,14 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` - -`; diff --git a/code/addons/storyshots-core/stories/default_export/__snapshots__/Extra.stories@Another-_-Button@with-_-text.boo b/code/addons/storyshots-core/stories/default_export/__snapshots__/Extra.stories@Another-_-Button@with-_-text.boo deleted file mode 100644 index e344c7924619..000000000000 --- a/code/addons/storyshots-core/stories/default_export/__snapshots__/Extra.stories@Another-_-Button@with-_-text.boo +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with text 1`] = ` - -`; diff --git a/code/addons/storyshots-core/stories/default_export/main.js b/code/addons/storyshots-core/stories/default_export/main.js deleted file mode 100644 index 233070243d8a..000000000000 --- a/code/addons/storyshots-core/stories/default_export/main.js +++ /dev/null @@ -1,5 +0,0 @@ -const config = { - stories: ['./Text.stories.jsx', './Extra.stories.jsx'], -}; - -export default config; diff --git a/code/addons/storyshots-core/stories/default_export/preview.jsx b/code/addons/storyshots-core/stories/default_export/preview.jsx deleted file mode 100644 index 54fec6401462..000000000000 --- a/code/addons/storyshots-core/stories/default_export/preview.jsx +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const Container = ({ children }) =>
{children}
; - -export const decorators = [ - (StoryFn, { parameters, globals }) => ( - - {parameters.prefix} {globals.suffix} - - ), -]; - -export const parameters = { prefix: 'prefix' }; -export const globals = { suffix: 'suffix' }; diff --git a/code/addons/storyshots-core/stories/exported_metadata/Async.stories.jsx b/code/addons/storyshots-core/stories/exported_metadata/Async.stories.jsx deleted file mode 100644 index f469d8b2a638..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/Async.stories.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; - -export const EXPECTED_VALUE = 'THIS IS SO DONE'; -export const TIMEOUT = 5; - -class AsyncTestComponent extends React.Component { - constructor(props) { - super(props); - this.state = { - value: '', - }; - } - - componentDidMount() { - setTimeout(() => { - this.setState({ - value: EXPECTED_VALUE, - }); - }, TIMEOUT); - } - - render() { - const { value } = this.state; - return

{value}

; - } -} - -export default { - title: 'Async', - includeStories: ['WithTimeout'], -}; - -export const WithTimeout = () => ; -WithTimeout.storyName = `with ${TIMEOUT}ms timeout simulating async operation`; diff --git a/code/addons/storyshots-core/stories/exported_metadata/Extra.stories.jsx b/code/addons/storyshots-core/stories/exported_metadata/Extra.stories.jsx deleted file mode 100644 index 4886a1c158f7..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/Extra.stories.jsx +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable react/button-has-type */ -import React from 'react'; - -import { storiesOf } from '@storybook/react'; -import { action } from '@storybook/addon-actions'; - -storiesOf('Another Button', module) - .add('with text', () => ) - .add('with some emoji', () => ( - - )); diff --git a/code/addons/storyshots-core/stories/exported_metadata/Text.stories.jsx b/code/addons/storyshots-core/stories/exported_metadata/Text.stories.jsx deleted file mode 100644 index e87143f2c786..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/Text.stories.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default { - title: 'Text', -}; - -export const Simple = () => 'contents'; diff --git a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories.storyshot b/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories.storyshot deleted file mode 100644 index 841630b0fc01..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories.storyshot +++ /dev/null @@ -1,34 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` -
- prefix - - - - suffix -
-`; - -exports[`Storyshots Another Button with text 1`] = ` -
- prefix - - - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories@Another-_-Button@with-_-some-_-emoji.boo b/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories@Another-_-Button@with-_-some-_-emoji.boo deleted file mode 100644 index a1027859204f..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories@Another-_-Button@with-_-some-_-emoji.boo +++ /dev/null @@ -1,14 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with some emoji 1`] = ` - -`; diff --git a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories@Another-_-Button@with-_-text.boo b/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories@Another-_-Button@with-_-text.boo deleted file mode 100644 index e344c7924619..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Extra.stories@Another-_-Button@with-_-text.boo +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Another Button with text 1`] = ` - -`; diff --git a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Text.stories.storyshot b/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Text.stories.storyshot deleted file mode 100644 index c9965e394a4c..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/__snapshots__/Text.stories.storyshot +++ /dev/null @@ -1,11 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Text Simple 1`] = ` -
- prefix - - contents - - suffix -
-`; diff --git a/code/addons/storyshots-core/stories/exported_metadata/main.js b/code/addons/storyshots-core/stories/exported_metadata/main.js deleted file mode 100644 index fbb87ec1dfc5..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/main.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - stories: ['./Text.stories.jsx', './Extra.stories.jsx'], -}; diff --git a/code/addons/storyshots-core/stories/exported_metadata/preview.jsx b/code/addons/storyshots-core/stories/exported_metadata/preview.jsx deleted file mode 100644 index 54fec6401462..000000000000 --- a/code/addons/storyshots-core/stories/exported_metadata/preview.jsx +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable react/prop-types */ -import React from 'react'; - -const Container = ({ children }) =>
{children}
; - -export const decorators = [ - (StoryFn, { parameters, globals }) => ( - - {parameters.prefix} {globals.suffix} - - ), -]; - -export const parameters = { prefix: 'prefix' }; -export const globals = { suffix: 'suffix' }; diff --git a/code/addons/storyshots-core/stories/storyshot.async.test.js b/code/addons/storyshots-core/stories/storyshot.async.test.js deleted file mode 100644 index a4f13e34ddc6..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.async.test.js +++ /dev/null @@ -1,41 +0,0 @@ -import path from 'path'; -import { render, screen, waitFor } from '@testing-library/react'; -import initStoryshots, { Stories2SnapsConverter } from '../src'; -import { EXPECTED_VALUE } from './exported_metadata/Async.stories.jsx'; - -initStoryshots({ - asyncJest: true, - framework: 'react', - integrityOptions: false, - configPath: path.join(__dirname, 'exported_metadata'), - - // When async is true we need to provide a test method that - // calls done() when at the end of the test method - test: async ({ story, context, done }) => { - expect(done).toBeDefined(); - - // This is a storyOf Async (see ./required_with_context/Async.stories) - if (context.kind === 'Async') { - const converter = new Stories2SnapsConverter({ snapshotExtension: '.async.storyshot' }); - const snapshotFilename = converter.getSnapshotFileName(context); - const storyElement = story.render(); - - // Mount the component - const { container } = render(storyElement); - - // The Async component should not contain the expected value - expect(screen.queryByText(EXPECTED_VALUE)).toBeFalsy(); - - await waitFor(() => { - expect(screen.getByText(EXPECTED_VALUE)).toBeInTheDocument(); - expect(container.firstChild).toMatchSpecificSnapshot(snapshotFilename); - }); - - // finally mark test as done - done(); - } else { - // If not async, mark the test as done - done(); - } - }, -}); diff --git a/code/addons/storyshots-core/stories/storyshot.configFunc.test.js b/code/addons/storyshots-core/stories/storyshot.configFunc.test.js deleted file mode 100644 index 346c581207b9..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.configFunc.test.js +++ /dev/null @@ -1,50 +0,0 @@ -import path from 'path'; -import initStoryshots, { multiSnapshotWithOptions, Stories2SnapsConverter } from '../src'; - -/* deprecated and will be removed in Storybook 8.0 */ - -class AnotherStories2SnapsConverter extends Stories2SnapsConverter { - getSnapshotFileName(context) { - const { fileName, kind, name } = context; - const { dir, name: filename } = path.parse(fileName); - const uniqueName = `${filename}@${kind.replace(/ /g, '-_-')}@${name.replace(/ /g, '-_-')}`; - const { snapshotsDirName, snapshotExtension } = this.options; - - return path.format({ - dir: path.join(dir, snapshotsDirName), - name: uniqueName, - ext: snapshotExtension, - }); - } - - getPossibleStoriesFiles(storyshotFile) { - const { dir, name } = path.parse(storyshotFile); - const { storiesExtensions } = this.options; - - const [fileName] = name.split('@'); - - return storiesExtensions.map((ext) => - path.format({ - dir: path.dirname(dir), - name: fileName, - ext, - }) - ); - } -} - -initStoryshots({ - framework: 'react', - integrityOptions: { cwd: __dirname }, - stories2snapsConverter: new AnotherStories2SnapsConverter({ snapshotExtension: '.boo' }), - config: ({ configure }) => - configure( - () => { - // eslint-disable-next-line global-require - require('./exported_metadata/Extra.stories.jsx'); - }, - module, - false - ), - test: multiSnapshotWithOptions(), -}); diff --git a/code/addons/storyshots-core/stories/storyshot.defaultExport.test.js b/code/addons/storyshots-core/stories/storyshot.defaultExport.test.js deleted file mode 100644 index 0d88bddea1ff..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.defaultExport.test.js +++ /dev/null @@ -1,7 +0,0 @@ -import path from 'path'; -import initStoryshots from '../src'; - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'default_export'), -}); diff --git a/code/addons/storyshots-core/stories/storyshot.enzyme.test.js b/code/addons/storyshots-core/stories/storyshot.enzyme.test.js deleted file mode 100644 index afaaf9b3b537..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.enzyme.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import path from 'path'; -import { mount, configure } from 'enzyme'; -// @ts-expect-error (Converted from ts-ignore) -import Adapter from 'enzyme-adapter-react-16'; -import initStoryshots from '../src'; - -configure({ adapter: new Adapter() }); - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), - renderer: mount, -}); diff --git a/code/addons/storyshots-core/stories/storyshot.metadata.test.js b/code/addons/storyshots-core/stories/storyshot.metadata.test.js deleted file mode 100644 index 971390d2b513..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.metadata.test.js +++ /dev/null @@ -1,9 +0,0 @@ -import path from 'path'; -import initStoryshots from '../src'; - -// jest.mock('@storybook/node-logger'); - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), -}); diff --git a/code/addons/storyshots-core/stories/storyshot.renderOnly.test.js b/code/addons/storyshots-core/stories/storyshot.renderOnly.test.js deleted file mode 100644 index e620fd15ed47..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.renderOnly.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import path from 'path'; -import initStoryshots, { renderOnly } from '../src'; - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), - test: renderOnly, -}); diff --git a/code/addons/storyshots-core/stories/storyshot.renderWithOptions.test.js b/code/addons/storyshots-core/stories/storyshot.renderWithOptions.test.js deleted file mode 100644 index 4aac113cedd4..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.renderWithOptions.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import path from 'path'; -import initStoryshots, { renderWithOptions } from '../src'; - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), - test: renderWithOptions({}), -}); diff --git a/code/addons/storyshots-core/stories/storyshot.shallow.test.js b/code/addons/storyshots-core/stories/storyshot.shallow.test.js deleted file mode 100644 index 62cf107e089a..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.shallow.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import path from 'path'; -import initStoryshots, { shallowSnapshot } from '../src'; - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), - test: shallowSnapshot, -}); diff --git a/code/addons/storyshots-core/stories/storyshot.shallowWithOptions.test.js b/code/addons/storyshots-core/stories/storyshot.shallowWithOptions.test.js deleted file mode 100644 index 5a4c45b78257..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.shallowWithOptions.test.js +++ /dev/null @@ -1,11 +0,0 @@ -import path from 'path'; -import initStoryshots, { shallowSnapshot } from '../src'; - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), - test: (data) => - shallowSnapshot({ - ...data, - }), -}); diff --git a/code/addons/storyshots-core/stories/storyshot.snapshotWithOptionsFunction.test.js b/code/addons/storyshots-core/stories/storyshot.snapshotWithOptionsFunction.test.js deleted file mode 100644 index f6fc73770aa9..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.snapshotWithOptionsFunction.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import path from 'path'; -import initStoryshots, { snapshotWithOptions } from '../src'; - -initStoryshots({ - framework: 'react', - configPath: path.join(__dirname, 'exported_metadata'), - test: snapshotWithOptions(() => ({})), -}); diff --git a/code/addons/storyshots-core/stories/storyshot.test.js b/code/addons/storyshots-core/stories/storyshot.test.js deleted file mode 100644 index 9a1dde49cb99..000000000000 --- a/code/addons/storyshots-core/stories/storyshot.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import path from 'path'; -import initStoryshots, { multiSnapshotWithOptions } from '../src'; - -jest.mock('@storybook/node-logger'); - -// with react-test-renderer -initStoryshots({ - framework: 'react', - // Ignore integrityOptions for async.storyshot because only run when asyncJest is true - integrityOptions: { cwd: __dirname, ignore: ['**/**.async.storyshot'] }, - configPath: path.join(__dirname, 'exported_metadata'), - test: multiSnapshotWithOptions(), -}); diff --git a/code/addons/storyshots-core/tsconfig.build.json b/code/addons/storyshots-core/tsconfig.build.json deleted file mode 100644 index dae6c1e39197..000000000000 --- a/code/addons/storyshots-core/tsconfig.build.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compileOnSave": false, - "compilerOptions": { - "target": "ES2020", - "module": "CommonJS", - "lib": ["es2020", "dom"], - "esModuleInterop": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "declaration": true, - "outDir": "dist", - "types": ["node"], - "skipLibCheck": true, - "resolveJsonModule": true, - "allowJs": true, - "pretty": true, - "noErrorTruncation": true, - "listEmittedFiles": false, - "noUnusedLocals": false - }, - "include": ["src/**/*", "src/**/*.json"] -} diff --git a/code/addons/storyshots-core/tsconfig.json b/code/addons/storyshots-core/tsconfig.json deleted file mode 100644 index 6d43397802f1..000000000000 --- a/code/addons/storyshots-core/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": true, - "jsx": "preserve", - "skipLibCheck": true, - "skipDefaultLibCheck": true, - "strict": true - }, - "include": ["src/**/*.ts"] -} diff --git a/code/addons/storyshots-puppeteer/.eslintrc.js b/code/addons/storyshots-puppeteer/.eslintrc.js deleted file mode 100644 index cc34d2deab0f..000000000000 --- a/code/addons/storyshots-puppeteer/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - settings: { - 'import/core-modules': ['puppeteer'], - }, -}; diff --git a/code/addons/storyshots-puppeteer/README.md b/code/addons/storyshots-puppeteer/README.md deleted file mode 100644 index de7d4d801326..000000000000 --- a/code/addons/storyshots-puppeteer/README.md +++ /dev/null @@ -1,346 +0,0 @@ -# StoryShots + [Puppeteer](https://github.com/GoogleChrome/puppeteer) - -## Getting Started - -Add the following modules into your app. - -```sh -npm install @storybook/addon-storyshots-puppeteer puppeteer --save-dev -``` - -⚠️ As of Storybook 5.3 `puppeteer` is no longer included in the addon dependencies and must be added to your project directly. - -## Configure Storyshots for Puppeteer tests - -⚠️ **React-native** is **not supported** by this test function. - -When running Puppeteer tests for your stories, you have two options: - -- Have a storybook running (ie. accessible via http(s), for instance using `npm run storybook`) -- Have a static build of the storybook (for instance, using `npm run build-storybook`) - -Then you will need to reference the storybook URL (`http(s)://...`) - -## _puppeteerTest_ - -Allows to define arbitrary Puppeteer tests as `story.parameters.puppeteerTest` function. - -You can either create a new Storyshots instance or edit the one you previously used: - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; - -initStoryshots({ suite: 'Puppeteer storyshots', test: puppeteerTest() }); -``` - -Then, in your stories: - -```js -export const myExample = () => { - ... -}; -myExample.parameters = { - async puppeteerTest(page) { - const element = await page.$(''); - await element.click(); - expect(something).toBe(something); - }, -}; -``` - -This will assume you have a storybook running on at __. -Internally here are the steps: - -- Launches a Chrome headless using [puppeteer](https://github.com/GoogleChrome/puppeteer) -- Browses each stories (calling __ URL), -- Runs the `parameters.puppeteerTest` function if it's defined. - -### Specifying the storybook URL - -If you want to set specific storybook URL, you can specify via the `storybookUrl` parameter, see below: - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; - -initStoryshots({ - suite: 'Puppeteer storyshots', - test: puppeteerTest({ storybookUrl: 'http://my-specific-domain.com:9010' }), -}); -``` - -The above config will use __ for tests. You can also use query parameters in your URL (e.g. for setting a different background for your storyshots, if you use `@storybook/addon-backgrounds`). - -### Specifying options to _goto()_ (Puppeteer API) - -You might use `getGotoOptions` to specify options when the storybook is navigating to a story (using the `goto` method). Will be passed to [Puppeteer .goto() fn](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagegotourl-options) - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; - -const getGotoOptions = ({ context, url }) => { - return { - waitUntil: 'networkidle0', - }; -}; - -initStoryshots({ - suite: 'Puppeteer storyshots', - test: puppeteerTest({ storybookUrl: 'http://localhost:6006', getGotoOptions }), -}); -``` - -### Customizing browser launch options (Puppeteer API) - -You might use the `browserLaunchOptions` to specify options for the default browser instance. Will be passed to [puppeteer.launch()](https://pptr.dev/api/puppeteer.puppeteernode.launch) - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; - -initStoryshots({ - suite: 'Puppeteer storyshots', - test: puppeteerTest({ - storybookUrl: 'https://some-local-ssl-url:7777', - browserLaunchOptions: { - // For ignoring self-signed certificates - ignoreHTTPSErrors: true, - }, - }), -}); -``` - -### Specifying custom Chrome executable path (Puppeteer API) - -You might use `chromeExecutablePath` to specify the path to a different version of Chrome, without downloading Chromium. Will be passed to [Runs a bundled version of Chromium](https://github.com/GoogleChrome/puppeteer#default-runtime-settings) - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; - -const chromeExecutablePath = '/usr/local/bin/chrome'; - -initStoryshots({ - suite: 'Puppeteer storyshots', - test: puppeteerTest({ storybookUrl: 'http://localhost:6006', chromeExecutablePath }), -}); -``` - -Alternatively, you may set the `SB_CHROMIUM_PATH` environment variable. If both are set, then `chromeExecutablePath` will take precedence. - -### Specifying a custom Puppeteer `browser` instance - -You might use the async `getCustomBrowser` function to obtain a custom instance of a Puppeteer `browser` object. This will prevent `storyshots-puppeteer` from creating its own `browser`. It will create and close pages within the `browser`, and it is your responsibility to manage the lifecycle of the `browser` itself. - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; -import puppeteer from 'puppeteer'; - -(async function () { - initStoryshots({ - suite: 'Puppeteer storyshots', - test: puppeteerTest({ - storybookUrl: 'http://localhost:6006', - getCustomBrowser: () => puppeteer.connect({ browserWSEndpoint: 'ws://yourUrl' }), - }), - }); -})(); -``` - -### Customizing a `page` instance - -Sometimes, there is a need to customize a page before it calls the `goto` api. - -An example of device emulation: - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { puppeteerTest } from '@storybook/addon-storyshots-puppeteer'; -const devices = require('puppeteer/DeviceDescriptors'); - -const iPhone = devices['iPhone 6']; - -function customizePage(page) { - return page.emulate(iPhone); -} - -initStoryshots({ - suite: 'Puppeteer storyshots', - test: puppeteerTest({ - storybookUrl: 'http://localhost:6006', - customizePage, - }), -}); -``` - -### Specifying setup and tests timeout - -By default, `@storybook/addon-storyshots-puppeteer` uses 15 second timeouts for browser setup and test functions. -Those can be customized with `setupTimeout` and `testTimeout` parameters. - -### Integrate Puppeteer storyshots with regular app - -You may want to use another Jest project to run your Puppeteer storyshots as they require more resources: Chrome and Storybook built/served. - -### Integrate Puppeteer storyshots with [Create React App](https://github.com/facebookincubator/create-react-app) - -You have two options here, you can either: - -- Add the storyshots configuration inside any of your `test.js` file. You must ensure you have either a running storybook or a static build available. - -- Create a custom test file using Jest outside of the CRA scope: - - A more robust approach would be to separate existing test files ran by create-react-app (anything `(test|spec).js` suffixed files) from the test files to run Puppeteer storyshots. - This use case can be achieved by using a custom name for the test file, ie something like `puppeteer-storyshots.runner.js`. This file will contain the `initStoryshots` call with Puppeteer storyshots configuration. - Then you will create a separate script entry in your package.json, for instance - - ```json - { - "scripts": { - "puppeteer-storyshots": "jest puppeteer-storyshots.runner.js --config path/to/custom/jest.config.json" - } - } - ``` - - Note that you will certainly need a custom config file for Jest as you run it outside of the CRA scope and thus you do not have the built-in config. - - Once that's setup, you can run `npm run puppeteer-storyshots`. - -### Reminder - -Puppeteer launches a web browser (Chrome) internally. - -The browser opens a page (either using the static build of storybook or a running instance of Storybook) - -If you run your test without either the static build or a running instance, this wont work. - -To make sure your tests run against the latest changes of your Storybook, you must keep your static build or running Storybook up-to-date. -This can be achieved by adding a step before running the test ie: `npm run build-storybook && npm run image-snapshots`. -If you run the Puppeteer storyshots against a running Storybook in dev mode, you don't have to worry about the stories being up-to-date because the dev-server is watching changes and rebuilds automatically. - -## _axeTest_ - -Runs [Axe](https://www.deque.com/axe/) accessibility checks and verifies that they pass using [jest-puppeteer-axe](https://github.com/WordPress/gutenberg/tree/master/packages/jest-puppeteer-axe). - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { axeTest } from '@storybook/addon-storyshots-puppeteer'; - -initStoryshots({ suite: 'A11y checks', test: axeTest() }); -``` - -For configuration, it uses the same `story.parameters.a11y` parameter as [`@storybook/addon-a11y`](https://github.com/storybookjs/storybook/tree/next/code/addons/a11y#parameters) - -### Specifying options to `axeTest` - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { axeTest } from '@storybook/addon-storyshots-puppeteer'; - -const beforeAxeTest = (page, { context: { kind, story }, url }) => { - return new Promise((resolve) => - setTimeout(() => { - resolve(); - }, 600) - ); -}; - -initStoryshots({ suite: 'A11y checks', test: axeTest({ beforeAxeTest }) }); -``` - -`beforeAxeTest` receives the [Puppeteer page instance](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page) and an object: `{ context: {kind, story}, url}`. _kind_ is the kind of the story and the _story_ its name. _url_ is the URL the browser will use to screenshot. `beforeAxeTest` is part of the promise chain and is called after the browser navigation is completed but before the screenshot is taken. It allows for triggering events on the page elements and delaying the axe test . - -## _imageSnapshots_ - -Generates and compares screenshots of your stories using [jest-image-snapshot](https://github.com/americanexpress/jest-image-snapshot). - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer'; - -initStoryshots({ suite: 'Image storyshots', test: imageSnapshot() }); -``` - -It saves all images under \_\_image_snapshots\_\_ folder. - -### Specifying options to _jest-image-snapshots_ - -If you wish to customize [jest-image-snapshot](https://github.com/americanexpress/jest-image-snapshot), then you can provide a `getMatchOptions` parameter that should return the options config object. Additionally, you can provide `beforeScreenshot` which is called before the screenshot is captured and a `afterScreenshot` handler which is called after the screenshot and receives the just created image. - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer'; -const getMatchOptions = ({ context: { kind, story }, url }) => { - return { - failureThreshold: 0.2, - failureThresholdType: 'percent', - }; -}; -const beforeScreenshot = (page, { context: { kind, story }, url }) => { - return new Promise((resolve) => - setTimeout(() => { - resolve(); - }, 600) - ); -}; -const afterScreenshot = ({ image, context }) => { - return new Promise((resolve) => - setTimeout(() => { - resolve(); - }, 600) - ); -}; -initStoryshots({ - suite: 'Image storyshots', - test: imageSnapshot({ - storybookUrl: 'http://localhost:6006', - getMatchOptions, - beforeScreenshot, - afterScreenshot, - }), -}); -``` - -`getMatchOptions` receives an object: `{ context: {kind, story}, url}`. _kind_ is the kind of the story and the _story_ its name. _url_ is the URL the browser will use to screenshot. - -`beforeScreenshot` receives the [Puppeteer page instance](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page) and an object: `{ context: {kind, story}, url}`. _kind_ is the kind of the story and the _story_ its name. _url_ is the URL the browser will use to screenshot. `beforeScreenshot` is part of the promise chain and is called after the browser navigation is completed but before the screenshot is taken. It allows for triggering events on the page elements and delaying the screenshot and can be used avoid regressions due to mounting animations. - -`afterScreenshot` receives the created image from puppeteer. - -### Specifying options to _screenshot()_ (Puppeteer API) - -You might use `getScreenshotOptions` to specify options for screenshot. Will be passed to [Puppeteer .screenshot() fn](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagescreenshotoptions) - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer'; -const getScreenshotOptions = ({ context, url }) => { - return { - encoding: 'base64', // encoding: 'base64' is a property required by puppeteer - fullPage: false, // Do not take the full page screenshot. Default is 'true' in Storyshots., - }; -}; -initStoryshots({ - suite: 'Image storyshots', - test: imageSnapshot({ storybookUrl: 'http://localhost:6006', getScreenshotOptions }), -}); -``` - -`getScreenshotOptions` receives an object `{ context: {kind, story}, url}`. _kind_ is the kind of the story and the _story_ its name. _url_ is the URL the browser will use to screenshot. - -To create a screenshot of just a single element (with its children), rather than the page or current viewport, an ElementHandle can be returned from `beforeScreenshot`: - -```js -import initStoryshots from '@storybook/addon-storyshots'; -import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer'; - -const beforeScreenshot = (page) => page.$('#storybook-root > *'); - -initStoryshots({ - suite: 'Image storyshots', - test: imageSnapshot({ storybookUrl: 'http://localhost:6006', beforeScreenshot }), -}); -``` diff --git a/code/addons/storyshots-puppeteer/jest.config.js b/code/addons/storyshots-puppeteer/jest.config.js deleted file mode 100644 index 0115c67e5629..000000000000 --- a/code/addons/storyshots-puppeteer/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -const path = require('path'); -const baseConfig = require('../../jest.config.browser'); - -module.exports = { - ...baseConfig, - snapshotSerializers: [...baseConfig.snapshotSerializers, 'enzyme-to-json/serializer'], - transform: { - ...baseConfig.transform, - '^.+\\.stories\\.[jt]sx?$': '@storybook/addon-storyshots/injectFileName', - }, - displayName: __dirname.split(path.sep).slice(-2).join(path.posix.sep), -}; diff --git a/code/addons/storyshots-puppeteer/package.json b/code/addons/storyshots-puppeteer/package.json deleted file mode 100644 index 657369001f2a..000000000000 --- a/code/addons/storyshots-puppeteer/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@storybook/addon-storyshots-puppeteer", - "version": "7.6.0-beta.2", - "description": "Image snapshots addition to StoryShots based on puppeteer", - "keywords": [ - "addon", - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/addons/storyshots-puppeteer", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/addons/storyshots-puppeteer" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "main": "dist/index.js", - "module": "dist/index.mjs", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.mjs", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/tsc.ts" - }, - "dependencies": { - "@axe-core/puppeteer": "^4.2.0", - "@storybook/csf": "^0.1.2", - "@storybook/node-logger": "workspace:*", - "@storybook/types": "workspace:*", - "@types/jest-image-snapshot": "^6.0.0", - "jest-image-snapshot": "^6.0.0" - }, - "devDependencies": { - "@types/puppeteer": "^5.4.0", - "enzyme": "^3.11.0", - "enzyme-to-json": "^3.6.1", - "puppeteer": "^2.0.0 || ^3.0.0" - }, - "peerDependencies": { - "@storybook/addon-storyshots": "workspace:*", - "puppeteer": ">=2.0.0" - }, - "peerDependenciesMeta": { - "puppeteer": { - "optional": true - } - }, - "publishConfig": { - "access": "public" - }, - "bundler": {}, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/addons/storyshots-puppeteer/preset.js b/code/addons/storyshots-puppeteer/preset.js deleted file mode 100644 index 501f6e0c1310..000000000000 --- a/code/addons/storyshots-puppeteer/preset.js +++ /dev/null @@ -1,4 +0,0 @@ -// storyshots is not a typical addon because it's just a command-line tool -// nevertheless if you add it to .storybook/main.js it shouldn't complain -// https://github.com/storybookjs/storybook/issues/7959 -module.exports = {}; diff --git a/code/addons/storyshots-puppeteer/project.json b/code/addons/storyshots-puppeteer/project.json deleted file mode 100644 index 7625e336cc8d..000000000000 --- a/code/addons/storyshots-puppeteer/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/addon-storyshots-puppeteer", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/addons/storyshots-puppeteer/src/__tests__/url.test.ts b/code/addons/storyshots-puppeteer/src/__tests__/url.test.ts deleted file mode 100644 index cf36929dee62..000000000000 --- a/code/addons/storyshots-puppeteer/src/__tests__/url.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { toId } from '@storybook/csf'; - -import { constructUrl } from '../url'; - -jest.mock('@storybook/node-logger'); - -const id = toId('someKind', 'someStory'); - -describe('Construct URL for Storyshots', () => { - it('can use a url without path and without query params', () => { - expect(constructUrl('http://localhost:9001', id)).toEqual( - 'http://localhost:9001/iframe.html?id=somekind--somestory' - ); - }); - - it('can use a url without path (but slash) and without query params', () => { - expect(constructUrl('http://localhost:9001/', id)).toEqual( - 'http://localhost:9001/iframe.html?id=somekind--somestory' - ); - }); - - it('can use a url without path and with query params', () => { - expect(constructUrl('http://localhost:9001?hello=world', id)).toEqual( - 'http://localhost:9001/iframe.html?hello=world&id=somekind--somestory' - ); - }); - - it('can use a url without path (buth slash) and with query params', () => { - expect(constructUrl('http://localhost:9001/?hello=world', id)).toEqual( - 'http://localhost:9001/iframe.html?hello=world&id=somekind--somestory' - ); - }); - - it('can use a url with some path and query params', () => { - expect(constructUrl('http://localhost:9001/nice-path?hello=world', id)).toEqual( - 'http://localhost:9001/nice-path/iframe.html?hello=world&id=somekind--somestory' - ); - }); - - it('can use a url with some path (slash) and query params', () => { - expect(constructUrl('http://localhost:9001/nice-path/?hello=world', id)).toEqual( - 'http://localhost:9001/nice-path/iframe.html?hello=world&id=somekind--somestory' - ); - }); - - it('can use a url with username and password and query params', () => { - expect( - constructUrl('http://username:password@localhost:9001/nice-path/?hello=world', id) - ).toEqual( - 'http://username:password@localhost:9001/nice-path/iframe.html?hello=world&id=somekind--somestory' - ); - }); - - it('can use a url with username and query params', () => { - expect(constructUrl('http://username@localhost:9001/nice-path/?hello=world', id)).toEqual( - 'http://username@localhost:9001/nice-path/iframe.html?hello=world&id=somekind--somestory' - ); - }); - - it('can use a url with file protocol', () => { - expect(constructUrl('file://users/storybook', id)).toEqual( - 'file://users/storybook/iframe.html?id=somekind--somestory' - ); - }); -}); diff --git a/code/addons/storyshots-puppeteer/src/axeTest.ts b/code/addons/storyshots-puppeteer/src/axeTest.ts deleted file mode 100644 index b2a7bdb603ff..000000000000 --- a/code/addons/storyshots-puppeteer/src/axeTest.ts +++ /dev/null @@ -1,45 +0,0 @@ -import AxePuppeteer from '@axe-core/puppeteer'; -import type { AxeConfig } from './config'; -import { defaultAxeConfig } from './config'; -import { puppeteerTest } from './puppeteerTest'; - -export const axeTest = (customConfig: Partial = {}) => { - const extendedConfig = { ...defaultAxeConfig, ...customConfig }; - const { beforeAxeTest } = extendedConfig; - - return puppeteerTest({ - ...extendedConfig, - async testBody(page, testOptions) { - const { - element = '#storybook-root', - exclude, - disabledRules, - options, - config, - } = testOptions.context.parameters.a11y || {}; - await beforeAxeTest(page, options); - const axe = new AxePuppeteer(page); - axe.include(element); - - if (exclude) { - axe.exclude(exclude); - } - - if (options) { - axe.options(options); - } - - if (disabledRules) { - axe.disableRules(disabledRules); - } - - if (config) { - axe.configure(config); - } - - const { violations } = await axe.analyze(); - - expect(violations).toHaveLength(0); - }, - }); -}; diff --git a/code/addons/storyshots-puppeteer/src/config.ts b/code/addons/storyshots-puppeteer/src/config.ts deleted file mode 100644 index 25d6633540bc..000000000000 --- a/code/addons/storyshots-puppeteer/src/config.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { MatchImageSnapshotOptions } from 'jest-image-snapshot'; -import type { ScreenshotOptions, Browser, Page, ElementHandle, LaunchOptions } from 'puppeteer'; - -type PuppeteerLifeCycleEvent = 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'; - -export interface Context { - kind: string; - story: string; - parameters: { - [key: string]: any; - }; -} - -interface Options { - context: Context; - url: string; -} - -interface Base64ScreenShotOptions extends ScreenshotOptions { - encoding: 'base64'; -} - -interface DirectNavigationOptions { - referer?: string; - timeout?: number; - waitUntil?: PuppeteerLifeCycleEvent | PuppeteerLifeCycleEvent[]; -} - -export interface CommonConfig { - storybookUrl: string; - chromeExecutablePath?: string; - getGotoOptions: (options: Options) => DirectNavigationOptions | undefined; - customizePage: (page: Page) => Promise; - getCustomBrowser?: () => Promise; - /** - * Puppeteer browser launch options: - * {@link https://pptr.dev/api/puppeteer.puppeteernode.launch/ puppeteer.launch()} - */ - browserLaunchOptions: LaunchOptions; - setupTimeout: number; - testTimeout: number; -} - -export interface PuppeteerTestConfig extends CommonConfig { - testBody: ((page: Page, options: Options) => void | Promise) & { - filter?: (options: Options) => boolean; - }; -} - -export interface ImageSnapshotConfig extends CommonConfig { - getMatchOptions: (options: Options) => MatchImageSnapshotOptions | undefined; - getScreenshotOptions: (options: Options) => Base64ScreenShotOptions; - beforeScreenshot: (page: Page, options: Options) => Promise; - afterScreenshot: (options: { image: string | void | Buffer; context: Context }) => Promise; -} - -export interface AxeConfig extends CommonConfig { - beforeAxeTest: (page: Page, options: Options) => Promise; -} - -const noop: () => undefined = () => undefined; -const asyncNoop: () => Promise = async () => undefined; - -export const defaultCommonConfig: CommonConfig = { - storybookUrl: 'http://localhost:6006', - chromeExecutablePath: process.env.SB_CHROMIUM_PATH, - getGotoOptions: noop, - customizePage: asyncNoop, - getCustomBrowser: undefined, - browserLaunchOptions: {}, - setupTimeout: 15000, - testTimeout: 15000, -}; - -const getTestBody = (options: Options) => options.context.parameters.puppeteerTest; - -function defaultTestBody(page: Page, options: Options) { - const testBody = getTestBody(options); - if (testBody != null) { - return testBody(page, options); - } - return null; -} - -defaultTestBody.filter = (options: Options) => getTestBody(options) != null; - -export const defaultPuppeteerTestConfig: PuppeteerTestConfig = { - ...defaultCommonConfig, - testBody: defaultTestBody, -}; - -// We consider taking the full page is a reasonable default. -const defaultScreenshotOptions = () => ({ fullPage: true, encoding: 'base64' } as const); -export const defaultImageSnapshotConfig: ImageSnapshotConfig = { - ...defaultCommonConfig, - getMatchOptions: noop, - getScreenshotOptions: defaultScreenshotOptions, - beforeScreenshot: asyncNoop, - afterScreenshot: asyncNoop, -}; - -export const defaultAxeConfig: AxeConfig = { - ...defaultCommonConfig, - beforeAxeTest: asyncNoop, -}; diff --git a/code/addons/storyshots-puppeteer/src/imageSnapshot.ts b/code/addons/storyshots-puppeteer/src/imageSnapshot.ts deleted file mode 100644 index b61552be7787..000000000000 --- a/code/addons/storyshots-puppeteer/src/imageSnapshot.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { toMatchImageSnapshot } from 'jest-image-snapshot'; -import type { ImageSnapshotConfig } from './config'; -import { defaultImageSnapshotConfig } from './config'; -import { puppeteerTest } from './puppeteerTest'; - -expect.extend({ toMatchImageSnapshot }); - -export const imageSnapshot = (customConfig: Partial = {}) => { - const config = { ...defaultImageSnapshotConfig, ...customConfig }; - const { getMatchOptions, getScreenshotOptions, beforeScreenshot, afterScreenshot } = config; - - return puppeteerTest({ - ...config, - async testBody(page, options) { - expect.hasAssertions(); - const element = await beforeScreenshot(page, options); - const image = await (element || page).screenshot(getScreenshotOptions(options)); - await afterScreenshot({ image, context: options.context }); - expect(image).toMatchImageSnapshot(getMatchOptions(options)); - }, - }); -}; diff --git a/code/addons/storyshots-puppeteer/src/index.ts b/code/addons/storyshots-puppeteer/src/index.ts deleted file mode 100644 index dd2e0b715fee..000000000000 --- a/code/addons/storyshots-puppeteer/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './config'; -export * from './puppeteerTest'; -export * from './axeTest'; -export * from './imageSnapshot'; diff --git a/code/addons/storyshots-puppeteer/src/puppeteerTest.ts b/code/addons/storyshots-puppeteer/src/puppeteerTest.ts deleted file mode 100644 index 03517979d31b..000000000000 --- a/code/addons/storyshots-puppeteer/src/puppeteerTest.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { Browser, Page } from 'puppeteer'; -import { logger } from '@storybook/node-logger'; -import { constructUrl } from './url'; -import type { PuppeteerTestConfig } from './config'; -import { defaultPuppeteerTestConfig } from './config'; - -export const puppeteerTest = (customConfig: Partial = {}) => { - const { - storybookUrl, - chromeExecutablePath, - getGotoOptions, - customizePage, - getCustomBrowser, - browserLaunchOptions, - testBody, - setupTimeout, - testTimeout, - } = { ...defaultPuppeteerTestConfig, ...customConfig }; - - let browser: Browser; // holds ref to browser. (ie. Chrome) - let page: Page; // Hold ref to the page to screenshot. - - const testFn = async ({ context }: any) => { - const { kind, framework, name, id } = context; - if (framework === 'react-native') { - // Skip tests since RN is not a browser environment. - logger.error( - "It seems you are running puppeteer test on RN app and it's not supported. Skipping test." - ); - - return; - } - - const url = constructUrl(storybookUrl, id); - const options = { context, url }; - if (testBody.filter != null && !testBody.filter(options)) { - return; - } - - if (!browser || !page) { - logger.error( - `Error when running puppeteer test for ${kind} - ${name} : It seems the headless browser is not running.` - ); - - throw new Error('no-headless-browser-running'); - } - - try { - await customizePage(page); - await page.goto(url, getGotoOptions(options)); - } catch (e) { - logger.error( - `Error when connecting to ${url}, did you start or build the storybook first? A storybook instance should be running or a static version should be built when using puppeteer test feature.` - ); - throw e; - } - await testBody(page, options); - }; - testFn.timeout = testTimeout; - - const cleanup = async () => { - if (getCustomBrowser && page) { - await page.close(); - } else if (browser) { - await browser.close(); - } - }; - - process.on('SIGINT', async () => { - await cleanup(); - process.exit(); - }); - testFn.afterAll = cleanup; - - const beforeAll = async () => { - if (getCustomBrowser) { - browser = await getCustomBrowser(); - } else { - // eslint-disable-next-line global-require - const puppeteer = require('puppeteer'); - // add some options "no-sandbox" to make it work properly on some Linux systems as proposed here: https://github.com/Googlechrome/puppeteer/issues/290#issuecomment-322851507 - browser = await puppeteer.launch({ - ...browserLaunchOptions, - args: [ - '--no-sandbox ', - '--disable-setuid-sandbox', - '--disable-dev-shm-usage', - ...(browserLaunchOptions?.args || []), - ], - executablePath: chromeExecutablePath, - }); - } - - page = await browser.newPage(); - }; - beforeAll.timeout = setupTimeout; - testFn.beforeAll = beforeAll; - - return testFn; -}; diff --git a/code/addons/storyshots-puppeteer/src/url.ts b/code/addons/storyshots-puppeteer/src/url.ts deleted file mode 100644 index 036fc76200c6..000000000000 --- a/code/addons/storyshots-puppeteer/src/url.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { URL } from 'url'; - -export const constructUrl = (storybookUrl: string, id: string) => { - const url = new URL(storybookUrl); - url.pathname = url.pathname.replace(/\/$/, '').concat('/iframe.html'); - url.searchParams.append('id', id); - return url.toString(); -}; diff --git a/code/addons/storyshots-puppeteer/tsconfig.build.json b/code/addons/storyshots-puppeteer/tsconfig.build.json deleted file mode 100644 index dae6c1e39197..000000000000 --- a/code/addons/storyshots-puppeteer/tsconfig.build.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compileOnSave": false, - "compilerOptions": { - "target": "ES2020", - "module": "CommonJS", - "lib": ["es2020", "dom"], - "esModuleInterop": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "declaration": true, - "outDir": "dist", - "types": ["node"], - "skipLibCheck": true, - "resolveJsonModule": true, - "allowJs": true, - "pretty": true, - "noErrorTruncation": true, - "listEmittedFiles": false, - "noUnusedLocals": false - }, - "include": ["src/**/*", "src/**/*.json"] -} diff --git a/code/addons/storyshots-puppeteer/tsconfig.json b/code/addons/storyshots-puppeteer/tsconfig.json deleted file mode 100644 index b32dad6f525c..000000000000 --- a/code/addons/storyshots-puppeteer/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "skipLibCheck": true, - "types": ["node"], - "declaration": true, - "strict": true - }, - "include": ["src/**/*"] -} diff --git a/code/addons/storysource/package.json b/code/addons/storysource/package.json index 333dc2b3ceda..1f564a9602de 100644 --- a/code/addons/storysource/package.json +++ b/code/addons/storysource/package.json @@ -58,12 +58,12 @@ "@storybook/router": "workspace:*", "@storybook/source-loader": "workspace:*", "@storybook/theming": "workspace:*", - "@types/react": "^16.14.34", + "@types/react": "^18.0.37", "@types/react-syntax-highlighter": "11.0.5", - "react": "^16.8.0", - "react-dom": "^16.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-syntax-highlighter": "^15.5.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/themes/README.md b/code/addons/themes/README.md index 5ed36f2c4050..55bc748fd48f 100644 --- a/code/addons/themes/README.md +++ b/code/addons/themes/README.md @@ -12,7 +12,7 @@ Requires Storybook 7.0 or later. If you need to add it to your Storybook, you ca npm i -D @storybook/addon-themes ``` -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/themes/package.json b/code/addons/themes/package.json index 511dcbc81b07..2edb9b7c2488 100644 --- a/code/addons/themes/package.json +++ b/code/addons/themes/package.json @@ -59,11 +59,12 @@ "@storybook/client-logger": "workspace:*", "@storybook/components": "workspace:*", "@storybook/core-events": "workspace:*", + "@storybook/icons": "^1.2.1", "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/themes/src/theme-switcher.tsx b/code/addons/themes/src/theme-switcher.tsx index 3658a3ef78cc..4fc7ffa89256 100644 --- a/code/addons/themes/src/theme-switcher.tsx +++ b/code/addons/themes/src/theme-switcher.tsx @@ -1,8 +1,9 @@ import React, { Fragment, useMemo } from 'react'; import { useAddonState, useChannel, useGlobals, useParameter } from '@storybook/manager-api'; import { styled } from '@storybook/theming'; -import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { PaintBrushIcon } from '@storybook/icons'; import type { ThemeAddonState, ThemeParameters } from './constants'; import { PARAM_KEY, @@ -74,7 +75,7 @@ export const ThemeSwitcher = () => { }} > - + {label && {label}} diff --git a/code/addons/toolbars/README.md b/code/addons/toolbars/README.md index b6cf730ab141..560966c094ce 100644 --- a/code/addons/toolbars/README.md +++ b/code/addons/toolbars/README.md @@ -12,13 +12,13 @@ The Toolbars addon controls global story rendering options from [Storybook's](ht ## Installation -Toolbars is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +Toolbars is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-toolbars ``` -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/toolbars/package.json b/code/addons/toolbars/package.json index 6d79696b0154..80ba3891dedb 100644 --- a/code/addons/toolbars/package.json +++ b/code/addons/toolbars/package.json @@ -56,9 +56,9 @@ "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/toolbars/src/components/ToolbarMenuListItem.tsx b/code/addons/toolbars/src/components/ToolbarMenuListItem.tsx index 8c0ddea7ede7..29a2bfb236f6 100644 --- a/code/addons/toolbars/src/components/ToolbarMenuListItem.tsx +++ b/code/addons/toolbars/src/components/ToolbarMenuListItem.tsx @@ -9,7 +9,6 @@ export type ToolbarMenuListItemProps = { } & ToolbarItem; export const ToolbarMenuListItem = ({ - left, right, title, value, @@ -25,12 +24,12 @@ export const ToolbarMenuListItem = ({ active: currentValue === value, right, title, - left, + icon, onClick, }; if (icon && !hideIcon) { - Item.left = Icon; + Item.icon = Icon; } return Item; diff --git a/code/addons/viewport/README.md b/code/addons/viewport/README.md index 196c5e0b0aa5..3766d555f8b3 100644 --- a/code/addons/viewport/README.md +++ b/code/addons/viewport/README.md @@ -8,13 +8,13 @@ Storybook Viewport Addon allows your stories to be displayed in different sizes ## Installation -Viewport is part of [essentials](https://storybook.js.org/docs/react/essentials/introduction) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: +Viewport is part of [essentials](https://storybook.js.org/docs/react/essentials) and so is installed in all new Storybooks by default. If you need to add it to your Storybook, you can run: ```sh npm i -D @storybook/addon-viewport ``` -Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project): +Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/react/configure/#configure-your-storybook-project): ```js export default { diff --git a/code/addons/viewport/package.json b/code/addons/viewport/package.json index 7f57d1eba792..b47cf9aa903f 100644 --- a/code/addons/viewport/package.json +++ b/code/addons/viewport/package.json @@ -56,12 +56,13 @@ "@storybook/components": "workspace:*", "@storybook/core-events": "workspace:*", "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "@storybook/manager-api": "workspace:*", "@storybook/preview-api": "workspace:*", "@storybook/theming": "workspace:*", - "react": "^16.8.0", - "react-dom": "^16.8.0", - "typescript": "~4.9.3" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/addons/viewport/src/Tool.tsx b/code/addons/viewport/src/Tool.tsx index df65988e5097..093d16bb57ba 100644 --- a/code/addons/viewport/src/Tool.tsx +++ b/code/addons/viewport/src/Tool.tsx @@ -4,9 +4,10 @@ import memoize from 'memoizerific'; import { styled, Global, type Theme, withTheme } from '@storybook/theming'; -import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; +import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; import { useStorybookApi, useParameter, useAddonState } from '@storybook/manager-api'; +import { GrowIcon, TransferIcon } from '@storybook/icons'; import { registerShortcuts } from './shortcuts'; import { PARAM_KEY, ADDON_ID } from './constants'; import { MINIMAL_VIEWPORTS } from './defaults'; @@ -48,8 +49,6 @@ const toLinks = memoize(50)((list: ViewportItem[], active: LinkBase, set, state, }); }); -const wrapperId = 'storybook-preview-wrapper'; - interface LinkBase { id: string; title: string; @@ -188,7 +187,7 @@ export const ViewportTool: FC = memo( setState({ ...state, selected: responsiveViewport.id }); }} > - + {styles ? ( {isRotated ? `${item.title} (L)` : `${item.title} (P)`} @@ -202,25 +201,10 @@ export const ViewportTool: FC = memo( @@ -234,7 +218,7 @@ export const ViewportTool: FC = memo( setState({ ...state, isRotated: !isRotated }); }} > - + {styles.height.replace('px', '')} diff --git a/code/addons/viewport/src/index.ts b/code/addons/viewport/src/index.ts index 341f696ad7b5..832595462640 100644 --- a/code/addons/viewport/src/index.ts +++ b/code/addons/viewport/src/index.ts @@ -1,3 +1,4 @@ export * from './constants'; export * from './defaults'; +export * from './models'; export * from './shortcuts'; diff --git a/code/builders/builder-manager/package.json b/code/builders/builder-manager/package.json index 2fc14cd4251c..db8469fcc11e 100644 --- a/code/builders/builder-manager/package.json +++ b/code/builders/builder-manager/package.json @@ -63,7 +63,7 @@ }, "devDependencies": { "slash": "^5.0.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" diff --git a/code/builders/builder-manager/src/utils/data.ts b/code/builders/builder-manager/src/utils/data.ts index 5e315c92e9f8..eb6754e7635a 100644 --- a/code/builders/builder-manager/src/utils/data.ts +++ b/code/builders/builder-manager/src/utils/data.ts @@ -1,5 +1,5 @@ import { basename } from 'path'; -import type { DocsOptions, Options } from '@storybook/types'; +import type { Options } from '@storybook/types'; import { getRefs } from '@storybook/core-common'; import { readTemplate } from './template'; @@ -13,7 +13,7 @@ export const getData = async (options: Options) => { const features = options.presets.apply>('features'); const logLevel = options.presets.apply('logLevel'); const title = options.presets.apply('title'); - const docsOptions = options.presets.apply('docs', {}); + const docsOptions = options.presets.apply('docs', {}); const template = readTemplate('template.ejs'); const customHead = options.presets.apply('managerHead'); diff --git a/code/builders/builder-manager/templates/template.ejs b/code/builders/builder-manager/templates/template.ejs index 462a83649e9c..7961f4ae4f7c 100644 --- a/code/builders/builder-manager/templates/template.ejs +++ b/code/builders/builder-manager/templates/template.ejs @@ -4,7 +4,7 @@ <%= typeof title !== 'undefined'? title : 'Storybook'%> - + <% if (favicon.endsWith('.svg')) {%> @@ -57,11 +57,13 @@ <% } %> diff --git a/code/builders/builder-vite/package.json b/code/builders/builder-vite/package.json index 9efe43c618b6..261857257f6b 100644 --- a/code/builders/builder-vite/package.json +++ b/code/builders/builder-vite/package.json @@ -66,7 +66,7 @@ "glob": "^10.0.0", "rollup": "^3.20.1", "slash": "^5.0.0", - "typescript": "~4.9.3", + "typescript": "^5.3.2", "vite": "^4.0.4" }, "peerDependencies": { diff --git a/code/builders/builder-vite/src/plugins/csf-plugin.ts b/code/builders/builder-vite/src/plugins/csf-plugin.ts index 9f472f6552f8..94cea3344c1c 100644 --- a/code/builders/builder-vite/src/plugins/csf-plugin.ts +++ b/code/builders/builder-vite/src/plugins/csf-plugin.ts @@ -1,11 +1,11 @@ import type { Plugin } from 'vite'; import { vite } from '@storybook/csf-plugin'; -import type { StorybookConfig, Options } from '@storybook/types'; +import type { Options } from '@storybook/types'; export async function csfPlugin(config: Options): Promise { const { presets } = config; - const addons = await presets.apply('addons', []); + const addons = await presets.apply('addons', []); const docsOptions = // @ts-expect-error - not sure what type to use here addons.find((a) => [a, a.name].includes('@storybook/addon-docs'))?.options ?? {}; diff --git a/code/builders/builder-vite/src/transform-iframe-html.ts b/code/builders/builder-vite/src/transform-iframe-html.ts index 620cbed3da0a..8c0546125162 100644 --- a/code/builders/builder-vite/src/transform-iframe-html.ts +++ b/code/builders/builder-vite/src/transform-iframe-html.ts @@ -1,5 +1,5 @@ import { normalizeStories } from '@storybook/core-common'; -import type { CoreConfig, DocsOptions, Options } from '@storybook/types'; +import type { DocsOptions, Options } from '@storybook/types'; export type PreviewHtml = string | undefined; @@ -12,7 +12,7 @@ export async function transformIframeHtml(html: string, options: Options) { const logLevel = await presets.apply('logLevel', undefined); const docsOptions = await presets.apply('docs'); - const coreOptions = await presets.apply('core'); + const coreOptions = await presets.apply('core'); const stories = normalizeStories(await options.presets.apply('stories', [], options), { configDir: options.configDir, workingDir: process.cwd(), diff --git a/code/builders/builder-vite/src/vite-config.ts b/code/builders/builder-vite/src/vite-config.ts index def3e631cb65..b4d1744d3833 100644 --- a/code/builders/builder-vite/src/vite-config.ts +++ b/code/builders/builder-vite/src/vite-config.ts @@ -68,6 +68,10 @@ export async function commonConfig( // If an envPrefix is specified in the vite config, add STORYBOOK_ to it, // otherwise, add VITE_ and STORYBOOK_ so that vite doesn't lose its default. envPrefix: userConfig.envPrefix ? ['STORYBOOK_'] : ['VITE_', 'STORYBOOK_'], + // Pass build.target option from user's vite config + build: { + target: buildProperty?.target, + }, }; const config: ViteConfig = mergeConfig(userConfig, sbConfig); diff --git a/code/builders/builder-webpack5/package.json b/code/builders/builder-webpack5/package.json index f99ef3bc3253..3c9f218fdd85 100644 --- a/code/builders/builder-webpack5/package.json +++ b/code/builders/builder-webpack5/package.json @@ -108,7 +108,7 @@ "@types/webpack-virtual-modules": "^0.1.1", "pretty-hrtime": "^1.0.3", "slash": "^5.0.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "peerDependenciesMeta": { "typescript": { diff --git a/code/builders/builder-webpack5/src/index.ts b/code/builders/builder-webpack5/src/index.ts index 53c4fba32df5..b4725b4a1f4c 100644 --- a/code/builders/builder-webpack5/src/index.ts +++ b/code/builders/builder-webpack5/src/index.ts @@ -61,7 +61,6 @@ export const executor = { export const getConfig: WebpackBuilder['getConfig'] = async (options) => { const { presets } = options; const typescriptOptions = await presets.apply('typescript', {}, options); - const babelOptions = await presets.apply('babel', {}, { ...options, typescriptOptions }); const frameworkOptions = await presets.apply('frameworkOptions'); return presets.apply( @@ -69,7 +68,6 @@ export const getConfig: WebpackBuilder['getConfig'] = async (options) => { {}, { ...options, - babelOptions, typescriptOptions, frameworkOptions, } diff --git a/code/builders/builder-webpack5/src/presets/custom-webpack-preset.ts b/code/builders/builder-webpack5/src/presets/custom-webpack-preset.ts index d71a67322d3e..5d921943012c 100644 --- a/code/builders/builder-webpack5/src/presets/custom-webpack-preset.ts +++ b/code/builders/builder-webpack5/src/presets/custom-webpack-preset.ts @@ -1,6 +1,6 @@ import * as webpackReal from 'webpack'; import { logger } from '@storybook/node-logger'; -import type { Options, CoreConfig } from '@storybook/types'; +import type { Options } from '@storybook/types'; import type { Configuration } from 'webpack'; import deprecate from 'util-deprecate'; import { dedent } from 'ts-dedent'; @@ -11,7 +11,7 @@ export async function webpack(config: Configuration, options: Options) { // @ts-expect-error (Converted from ts-ignore) const { configDir, configType, presets, webpackConfig } = options; - const coreOptions = await presets.apply('core'); + const coreOptions = await presets.apply('core'); let defaultConfig = config; if (!coreOptions?.disableWebpackDefaults) { diff --git a/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts b/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts index f1598a66e5da..ac573827715a 100644 --- a/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts +++ b/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts @@ -9,7 +9,7 @@ import VirtualModulePlugin from 'webpack-virtual-modules'; import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; import type { TransformOptions as EsbuildOptions } from 'esbuild'; import type { JsMinifyOptions as SwcOptions } from '@swc/core'; -import type { Options, CoreConfig, DocsOptions } from '@storybook/types'; +import type { Options } from '@storybook/types'; import { globalsNameReferenceMap } from '@storybook/preview/globals'; import { getBuilderOptions, @@ -45,8 +45,6 @@ const themingPath = maybeGetAbsolutePath(`@storybook/theming`); const storybookPaths: Record = { ...(managerAPIPath ? { - // deprecated, remove in 8.0 - [`@storybook/api`]: managerAPIPath, [`@storybook/manager-api`]: managerAPIPath, } : {}), @@ -57,7 +55,7 @@ const storybookPaths: Record = { }; export default async ( - options: Options & Record & { typescriptOptions: TypescriptOptions } + options: Options & { typescriptOptions: TypescriptOptions } ): Promise => { const { outputDir = join('.', 'public'), @@ -66,7 +64,6 @@ export default async ( configType, presets, previewUrl, - babelOptions, typescriptOptions, features, } = options; @@ -88,14 +85,14 @@ export default async ( modulesCount = 1000, build, ] = await Promise.all([ - presets.apply('core'), + presets.apply('core'), presets.apply('frameworkOptions'), presets.apply>('env'), presets.apply('logLevel', undefined), presets.apply('previewHead'), presets.apply('previewBody'), presets.apply('previewMainTemplate'), - presets.apply('docs'), + presets.apply('docs'), presets.apply('entries', []), presets.apply('stories', []), options.cache?.get('modulesCount').catch(() => {}), @@ -240,7 +237,7 @@ export default async ( }, builderOptions.useSWC ? await createSWCLoader(Object.keys(virtualModuleMapping), options) - : createBabelLoader(babelOptions, typescriptOptions, Object.keys(virtualModuleMapping)), + : await createBabelLoader(options, typescriptOptions, Object.keys(virtualModuleMapping)), { test: /\.md$/, type: 'asset/source', diff --git a/code/builders/builder-webpack5/src/preview/loaders.ts b/code/builders/builder-webpack5/src/preview/loaders.ts index f10bd93a5ebc..868d35ba394c 100644 --- a/code/builders/builder-webpack5/src/preview/loaders.ts +++ b/code/builders/builder-webpack5/src/preview/loaders.ts @@ -5,18 +5,19 @@ import { logger } from '@storybook/node-logger'; import type { Options } from '@storybook/types'; import type { TypescriptOptions } from '../types'; -export const createBabelLoader = ( - options: any, +export const createBabelLoader = async ( + options: Options & { typescriptOptions: TypescriptOptions }, typescriptOptions: TypescriptOptions, excludes: string[] = [] ) => { logger.info(dedent`Using Babel compiler`); + const babelOptions = await options.presets.apply('babel', {}, options); return { test: typescriptOptions.skipBabel ? /\.(mjs|jsx?)$/ : /\.(mjs|tsx?|jsx?)$/, use: [ { loader: require.resolve('babel-loader'), - options, + options: babelOptions, }, ], include: [getProjectRoot()], diff --git a/code/deprecated/addons/README.md b/code/deprecated/addons/README.md deleted file mode 100644 index 41f81df8a95d..000000000000 --- a/code/deprecated/addons/README.md +++ /dev/null @@ -1,3 +0,0 @@ -The contents of this package have moved to `@storybook/preview-api` and `@storybook/manager-api`. Please update your import depending on where are using this API. - -This package will no longer be released as part of the 8.0 release of storybook. diff --git a/code/deprecated/addons/package.json b/code/deprecated/addons/package.json deleted file mode 100644 index eee2a170485b..000000000000 --- a/code/deprecated/addons/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@storybook/addons", - "version": "7.6.0-beta.2", - "description": "Storybook addons store", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/deprecated/addons", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/deprecated/addons" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "node": "./dist/index.js", - "require": "./dist/index.js", - "import": "./dist/index.mjs" - }, - "./package.json": "./package.json" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" - }, - "dependencies": { - "@storybook/manager-api": "workspace:*", - "@storybook/preview-api": "workspace:*", - "@storybook/types": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/index.ts" - ] - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/addons/project.json b/code/deprecated/addons/project.json deleted file mode 100644 index db49d29418b1..000000000000 --- a/code/deprecated/addons/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/addons", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/addons/src/index.ts b/code/deprecated/addons/src/index.ts deleted file mode 100644 index 2dee3d2d2ea4..000000000000 --- a/code/deprecated/addons/src/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { type Addon_Type, Addon_TypesEnum } from '@storybook/types'; - -export { type Addon_Type as Addon, Addon_TypesEnum as types }; - -export { addons, type AddonStore, mockChannel } from '@storybook/manager-api'; - -export { - type EventMap, - HooksContext, - type Listener, - type MakeDecoratorOptions, - type MakeDecoratorResult, - applyHooks, - makeDecorator, - useArgs, - useCallback, - useChannel, - useEffect, - useGlobals, - useMemo, - useParameter, - useReducer, - useRef, - useState, - useStoryContext, -} from '@storybook/preview-api/dist/addons'; diff --git a/code/deprecated/addons/tsconfig.json b/code/deprecated/addons/tsconfig.json deleted file mode 100644 index 4c6f20a1be4d..000000000000 --- a/code/deprecated/addons/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src/**/*"], - "compilerOptions": { - "strict": false - } -} diff --git a/code/deprecated/channel-postmessage/README.md b/code/deprecated/channel-postmessage/README.md deleted file mode 100644 index 8edc7163f9e2..000000000000 --- a/code/deprecated/channel-postmessage/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Storybook PostMessage Channel - -Storybook PostMessage Channel is a channel for Storybook that can be used when the Storybook Renderer runs inside an iframe or a child window. -A channel can be created using the `createChannel` function. - -```js -import { createChannel } from '@storybook/channel-postmessage'; - -const channel = createChannel({ key: 'postmsg-key' }); -``` - ---- - -For more information visit: [storybook.js.org](https://storybook.js.org) diff --git a/code/deprecated/channel-postmessage/jest.config.js b/code/deprecated/channel-postmessage/jest.config.js deleted file mode 100644 index 4396fbc7010d..000000000000 --- a/code/deprecated/channel-postmessage/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const path = require('path'); -const baseConfig = require('../../jest.config.browser'); - -module.exports = { - ...baseConfig, - displayName: __dirname.split(path.sep).slice(-2).join(path.posix.sep), -}; diff --git a/code/deprecated/channel-postmessage/package.json b/code/deprecated/channel-postmessage/package.json deleted file mode 100644 index 3e9669447029..000000000000 --- a/code/deprecated/channel-postmessage/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "@storybook/channel-postmessage", - "version": "7.6.0-beta.2", - "description": "", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/lib/channel-postmessage", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/lib/channel-postmessage" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "node": "./dist/entry.js", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" - }, - "dependencies": { - "@storybook/channels": "workspace:*", - "@storybook/client-logger": "workspace:*" - }, - "devDependencies": { - "typescript": "~4.9.3" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "shim": "@storybook/channels/dist/postmessage/index" - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/channel-postmessage/project.json b/code/deprecated/channel-postmessage/project.json deleted file mode 100644 index 8a56b8804d7f..000000000000 --- a/code/deprecated/channel-postmessage/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/channel-postmessage", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/channel-postmessage/src/entry.ts b/code/deprecated/channel-postmessage/src/entry.ts deleted file mode 100644 index 2190b9f5382e..000000000000 --- a/code/deprecated/channel-postmessage/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/channel-postmessage is deprecated and will be removed in 8.0, please import createPostmessageChannel from @storybook/channels' -); - -export * from '@storybook/channels/dist/postmessage/index'; diff --git a/code/deprecated/channel-postmessage/tsconfig.json b/code/deprecated/channel-postmessage/tsconfig.json deleted file mode 100644 index b5a2f9a70918..000000000000 --- a/code/deprecated/channel-postmessage/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src/**/*"], - "compilerOptions": { - "strict": true - } -} diff --git a/code/deprecated/channel-websocket/README.md b/code/deprecated/channel-websocket/README.md deleted file mode 100644 index 8f131ab21ae3..000000000000 --- a/code/deprecated/channel-websocket/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Storybook Websocket Channel - -Storybook Websocket Channel is a channel for Storybook that can be used when the Storybook Renderer should communicate with the Storybook Manager over the network. -A channel can be created using the `createChannel` function. - -```js -import createChannel from '@storybook/channel-websocket'; - -const channel = createChannel({ url: 'ws://localhost:9001' }); -``` - ---- - -For more information visit: [storybook.js.org](https://storybook.js.org) diff --git a/code/deprecated/channel-websocket/jest.config.js b/code/deprecated/channel-websocket/jest.config.js deleted file mode 100644 index 4396fbc7010d..000000000000 --- a/code/deprecated/channel-websocket/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const path = require('path'); -const baseConfig = require('../../jest.config.browser'); - -module.exports = { - ...baseConfig, - displayName: __dirname.split(path.sep).slice(-2).join(path.posix.sep), -}; diff --git a/code/deprecated/channel-websocket/package.json b/code/deprecated/channel-websocket/package.json deleted file mode 100644 index 812efc5fb460..000000000000 --- a/code/deprecated/channel-websocket/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "@storybook/channel-websocket", - "version": "7.6.0-beta.2", - "description": "", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/lib/channel-websocket", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/lib/channel-websocket" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "node": "./dist/entry.js", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/facade.ts" - }, - "dependencies": { - "@storybook/channels": "workspace:*", - "@storybook/client-logger": "workspace:*" - }, - "devDependencies": { - "typescript": "~4.9.3" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "shim": "@storybook/channels/dist/websocket/index" - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/channel-websocket/project.json b/code/deprecated/channel-websocket/project.json deleted file mode 100644 index f778bc09228d..000000000000 --- a/code/deprecated/channel-websocket/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/channel-websocket", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/channel-websocket/src/entry.ts b/code/deprecated/channel-websocket/src/entry.ts deleted file mode 100644 index e5b6602e6120..000000000000 --- a/code/deprecated/channel-websocket/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/channel-websocket is deprecated and will be removed in 8.0, please import createWebsocketChannel from @storybook/channels' -); - -export * from '@storybook/channels/dist/websocket/index'; diff --git a/code/deprecated/channel-websocket/tsconfig.json b/code/deprecated/channel-websocket/tsconfig.json deleted file mode 100644 index b5a2f9a70918..000000000000 --- a/code/deprecated/channel-websocket/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src/**/*"], - "compilerOptions": { - "strict": true - } -} diff --git a/code/deprecated/client-api/README.md b/code/deprecated/client-api/README.md deleted file mode 100644 index 2220a03cb98b..000000000000 --- a/code/deprecated/client-api/README.md +++ /dev/null @@ -1,3 +0,0 @@ -The contents of this package have moved to `@storybook/preview-api`. Please update your import. - -This package will no longer be released as part of the 8.0 release of storybook. diff --git a/code/deprecated/client-api/package.json b/code/deprecated/client-api/package.json deleted file mode 100644 index ca91a85f270e..000000000000 --- a/code/deprecated/client-api/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "@storybook/client-api", - "version": "7.6.0-beta.2", - "description": "Storybook Client API", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/deprecated/client-api", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/deprecated/client-api" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/facade.ts" - }, - "dependencies": { - "@storybook/client-logger": "workspace:*", - "@storybook/preview-api": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "shim": "@storybook/preview-api/dist/client-api" - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/client-api/project.json b/code/deprecated/client-api/project.json deleted file mode 100644 index 6ad043cf9a61..000000000000 --- a/code/deprecated/client-api/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/client-api", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/client-api/src/entry.ts b/code/deprecated/client-api/src/entry.ts deleted file mode 100644 index c5528bee29db..000000000000 --- a/code/deprecated/client-api/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/client-api is deprecated and will be removed in 8.0, please import canvas related modules from @storybook/preview-api' -); - -export * from '@storybook/preview-api/dist/client-api'; diff --git a/code/deprecated/client-api/src/typings.d.ts b/code/deprecated/client-api/src/typings.d.ts deleted file mode 100644 index bfd9e55123ff..000000000000 --- a/code/deprecated/client-api/src/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/deprecated/client-api/tsconfig.json b/code/deprecated/client-api/tsconfig.json deleted file mode 100644 index b5a2f9a70918..000000000000 --- a/code/deprecated/client-api/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src/**/*"], - "compilerOptions": { - "strict": true - } -} diff --git a/code/deprecated/core-client/README.md b/code/deprecated/core-client/README.md deleted file mode 100644 index 2220a03cb98b..000000000000 --- a/code/deprecated/core-client/README.md +++ /dev/null @@ -1,3 +0,0 @@ -The contents of this package have moved to `@storybook/preview-api`. Please update your import. - -This package will no longer be released as part of the 8.0 release of storybook. diff --git a/code/deprecated/core-client/package.json b/code/deprecated/core-client/package.json deleted file mode 100644 index 1894929ef3e8..000000000000 --- a/code/deprecated/core-client/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@storybook/core-client", - "version": "7.6.0-beta.2", - "description": "Storybook framework-agnostic API", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/deprecated/core-client", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/deprecated/core-client" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/facade.ts" - }, - "dependencies": { - "@storybook/client-logger": "workspace:*", - "@storybook/preview-api": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "shim": "@storybook/preview-api/dist/core-client" - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/core-client/project.json b/code/deprecated/core-client/project.json deleted file mode 100644 index 9ae6f7635e71..000000000000 --- a/code/deprecated/core-client/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/core-client", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/core-client/src/entry.ts b/code/deprecated/core-client/src/entry.ts deleted file mode 100644 index e838a6bd7930..000000000000 --- a/code/deprecated/core-client/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/core-client is deprecated and will be removed in 8.0, please import canvas related modules from @storybook/preview-api' -); - -export * from '@storybook/preview-api/dist/core-client'; diff --git a/code/deprecated/core-client/src/typings.d.ts b/code/deprecated/core-client/src/typings.d.ts deleted file mode 100644 index bfd9e55123ff..000000000000 --- a/code/deprecated/core-client/src/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/deprecated/core-client/tsconfig.json b/code/deprecated/core-client/tsconfig.json deleted file mode 100644 index cb1c83813c18..000000000000 --- a/code/deprecated/core-client/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src/**/*", "typings.d.ts"], - "compilerOptions": { - "strict": true - } -} diff --git a/code/deprecated/core-client/typings.d.ts b/code/deprecated/core-client/typings.d.ts deleted file mode 100644 index 2a4bb7deb464..000000000000 --- a/code/deprecated/core-client/typings.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare class AnsiToHtml { - constructor(options: { escapeHtml: boolean }); - - toHtml: (ansi: string) => string; -} diff --git a/code/deprecated/manager-api-shim/README.md b/code/deprecated/manager-api-shim/README.md deleted file mode 100644 index 21130d9a30f1..000000000000 --- a/code/deprecated/manager-api-shim/README.md +++ /dev/null @@ -1,3 +0,0 @@ -The contents of this package have moved to `@storybook/manager-api`. Please update your import. - -This package will no longer be released as part of the 8.0 release of storybook. diff --git a/code/deprecated/manager-api-shim/package.json b/code/deprecated/manager-api-shim/package.json deleted file mode 100644 index 32893c3fc69e..000000000000 --- a/code/deprecated/manager-api-shim/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "@storybook/api", - "version": "7.6.0-beta.2", - "description": "Storybook Manager API (facade)", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/lib/api", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/deprecated/manager-api-shim" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/facade.ts" - }, - "dependencies": { - "@storybook/client-logger": "workspace:*", - "@storybook/manager-api": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "shim": "@storybook/manager-api" - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/manager-api-shim/project.json b/code/deprecated/manager-api-shim/project.json deleted file mode 100644 index fdba5d62b5b2..000000000000 --- a/code/deprecated/manager-api-shim/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/api", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/manager-api-shim/src/entry.ts b/code/deprecated/manager-api-shim/src/entry.ts deleted file mode 100644 index c0174219dd33..000000000000 --- a/code/deprecated/manager-api-shim/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/api is deprecated and will be removed in 8.0, please import manager related modules from @storybook/manager-api' -); - -export * from '@storybook/manager-api'; diff --git a/code/deprecated/manager-api-shim/src/typings.d.ts b/code/deprecated/manager-api-shim/src/typings.d.ts deleted file mode 100644 index bfd9e55123ff..000000000000 --- a/code/deprecated/manager-api-shim/src/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/deprecated/manager-api-shim/tsconfig.json b/code/deprecated/manager-api-shim/tsconfig.json deleted file mode 100644 index 4c6f20a1be4d..000000000000 --- a/code/deprecated/manager-api-shim/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src/**/*"], - "compilerOptions": { - "strict": false - } -} diff --git a/code/deprecated/preview-web/README.md b/code/deprecated/preview-web/README.md deleted file mode 100644 index 2220a03cb98b..000000000000 --- a/code/deprecated/preview-web/README.md +++ /dev/null @@ -1,3 +0,0 @@ -The contents of this package have moved to `@storybook/preview-api`. Please update your import. - -This package will no longer be released as part of the 8.0 release of storybook. diff --git a/code/deprecated/preview-web/package.json b/code/deprecated/preview-web/package.json deleted file mode 100644 index a528dd003460..000000000000 --- a/code/deprecated/preview-web/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "@storybook/preview-web", - "version": "7.6.0-beta.2", - "description": "", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/deprecated/preview-web", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/deprecated/preview-web" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/facade.ts" - }, - "dependencies": { - "@storybook/client-logger": "workspace:*", - "@storybook/preview-api": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "shim": "@storybook/preview-api/dist/preview-web" - }, - "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17" -} diff --git a/code/deprecated/preview-web/project.json b/code/deprecated/preview-web/project.json deleted file mode 100644 index 461764d60368..000000000000 --- a/code/deprecated/preview-web/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/preview-web", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/preview-web/src/entry.ts b/code/deprecated/preview-web/src/entry.ts deleted file mode 100644 index 0e2b07b5379e..000000000000 --- a/code/deprecated/preview-web/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/preview is deprecated and will be removed in 8.0, please import canvas related modules from @storybook/preview-api' -); - -export * from '@storybook/preview-api/dist/preview-web'; diff --git a/code/deprecated/preview-web/src/typings.d.ts b/code/deprecated/preview-web/src/typings.d.ts deleted file mode 100644 index bfd9e55123ff..000000000000 --- a/code/deprecated/preview-web/src/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/deprecated/preview-web/tsconfig.json b/code/deprecated/preview-web/tsconfig.json deleted file mode 100644 index 5b3f3a56a68d..000000000000 --- a/code/deprecated/preview-web/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "strict": true, - "skipLibCheck": true - }, - "include": ["src/**/*"] -} diff --git a/code/deprecated/store/README.md b/code/deprecated/store/README.md deleted file mode 100644 index 2220a03cb98b..000000000000 --- a/code/deprecated/store/README.md +++ /dev/null @@ -1,3 +0,0 @@ -The contents of this package have moved to `@storybook/preview-api`. Please update your import. - -This package will no longer be released as part of the 8.0 release of storybook. diff --git a/code/deprecated/store/package.json b/code/deprecated/store/package.json deleted file mode 100644 index dd37248555bf..000000000000 --- a/code/deprecated/store/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "@storybook/store", - "version": "7.6.0-beta.2", - "description": "", - "keywords": [ - "storybook" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/deprecated/store", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/deprecated/store" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/entry.d.ts", - "require": "./dist/entry.js", - "import": "./dist/entry.mjs" - }, - "./package.json": "./package.json" - }, - "main": "dist/entry.js", - "module": "dist/entry.mjs", - "types": "dist/entry.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", - "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/facade.ts" - }, - "dependencies": { - "@storybook/client-logger": "workspace:*", - "@storybook/preview-api": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "entries": [ - "./src/entry.ts" - ], - "platform": "node", - "shim": "@storybook/preview-api/dist/store" - } -} diff --git a/code/deprecated/store/project.json b/code/deprecated/store/project.json deleted file mode 100644 index 7fc42733239c..000000000000 --- a/code/deprecated/store/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@storybook/store", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "implicitDependencies": [], - "type": "library" -} diff --git a/code/deprecated/store/src/entry.ts b/code/deprecated/store/src/entry.ts deleted file mode 100644 index 5183f9456376..000000000000 --- a/code/deprecated/store/src/entry.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { deprecate } from '@storybook/client-logger'; - -deprecate( - 'importing from @storybook/store is deprecated and will be removed in 8.0, please import canvas related modules from @storybook/preview-api' -); - -export * from '@storybook/preview-api/dist/store'; diff --git a/code/deprecated/store/src/typings.d.ts b/code/deprecated/store/src/typings.d.ts deleted file mode 100644 index bfd9e55123ff..000000000000 --- a/code/deprecated/store/src/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/deprecated/store/tsconfig.json b/code/deprecated/store/tsconfig.json deleted file mode 100644 index 5b3f3a56a68d..000000000000 --- a/code/deprecated/store/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "strict": true, - "skipLibCheck": true - }, - "include": ["src/**/*"] -} diff --git a/code/e2e-tests/addon-actions.spec.ts b/code/e2e-tests/addon-actions.spec.ts index a38b6b82d118..520c2b5dc41f 100644 --- a/code/e2e-tests/addon-actions.spec.ts +++ b/code/e2e-tests/addon-actions.spec.ts @@ -5,13 +5,10 @@ import { SbPage } from './util'; const storybookUrl = process.env.STORYBOOK_URL || 'http://localhost:8001'; test.describe('addon-actions', () => { - test.beforeEach(async ({ page }) => { - await page.goto(storybookUrl); - await new SbPage(page).waitUntilLoaded(); - }); - test('should trigger an action', async ({ page }) => { + await page.goto(storybookUrl); const sbPage = new SbPage(page); + sbPage.waitUntilLoaded(); await sbPage.navigateToStory('example/button', 'primary'); const root = sbPage.previewRoot(); diff --git a/code/e2e-tests/manager.spec.ts b/code/e2e-tests/manager.spec.ts index bd07a1adc30a..b54c6b0df8a2 100644 --- a/code/e2e-tests/manager.spec.ts +++ b/code/e2e-tests/manager.spec.ts @@ -3,92 +3,256 @@ import process from 'process'; import { SbPage } from './util'; const storybookUrl = process.env.STORYBOOK_URL || 'http://localhost:8001'; +const templateName = process.env.STORYBOOK_TEMPLATE_NAME; -test.describe('manager', () => { +test.describe('Manager UI', () => { test.beforeEach(async ({ page }) => { await page.goto(storybookUrl); await new SbPage(page).waitUntilLoaded(); }); - test('shortcuts sidebar', async ({ page }) => { - const sbPage = new SbPage(page); + test.describe('Desktop', () => { + // TODO: test dragging and resizing - await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); + test('Sidebar toggling', async ({ page }) => { + const sbPage = new SbPage(page); - await sbPage.page.locator('html').press('s'); - await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); - await sbPage.page.locator('[aria-label="Show sidebar"]').click(); - await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); + // toggle with keyboard shortcut + await sbPage.page.locator('html').press('s'); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); + await sbPage.page.locator('html').press('s'); + await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); - await sbPage.page.locator('[aria-label="Shortcuts"]').click(); - await sbPage.page.locator('#list-item-S').click(); + // toggle with menu item + await sbPage.page.locator('[aria-label="Shortcuts"]').click(); + await sbPage.page.locator('#list-item-S').click(); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); - await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); + // toggle with "show sidebar" button + await sbPage.page.locator('[aria-label="Show sidebar"]').click(); + await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); + }); - await sbPage.page.locator('html').press('s'); - await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); - }); + test('Toolbar toggling', async ({ page }) => { + const sbPage = new SbPage(page); + const expectToolbarVisibility = async (visible: boolean) => { + expect(async () => { + const toolbar = await sbPage.page.locator(`[data-test-id="sb-preview-toolbar"]`); + const marginTop = await toolbar.evaluate( + (element) => window.getComputedStyle(element).marginTop + ); + expect(marginTop).toBe(visible ? '0px' : '-40px'); + }).toPass({ intervals: [400] }); + }; + + await expectToolbarVisibility(true); + + // toggle with keyboard shortcut + await sbPage.page.locator('html').press('t'); + await expectToolbarVisibility(false); + await sbPage.page.locator('html').press('t'); + await expectToolbarVisibility(true); + + // toggle with menu item + await sbPage.page.locator('[aria-label="Shortcuts"]').click(); + await sbPage.page.locator('#list-item-T').click(); + await expectToolbarVisibility(false); + await sbPage.page.locator('[aria-label="Shortcuts"]').click(); + await sbPage.page.locator('#list-item-T').click(); + await expectToolbarVisibility(true); + }); + + test.describe('Panel', () => { + test('Hidden in docs view', async ({ page }) => { + const sbPage = new SbPage(page); - test('shortcuts toolbar', async ({ page }) => { - const sbPage = new SbPage(page); - const isToolbarShown = async () => { - const canvas = await sbPage.page.locator('div', { - has: sbPage.page.locator('> #storybook-preview-wrapper'), + // navigate to docs to hide panel + await sbPage.navigateToStory('example/button', 'docs'); + + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + + // toggle with keyboard shortcut + await sbPage.page.locator('html').press('a'); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + await sbPage.page.locator('html').press('a'); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); }); - return (await canvas.getAttribute('offset')) === '40'; - }; + test('Toggling', async ({ page }) => { + const sbPage = new SbPage(page); - await expect(await isToolbarShown()).toBeTruthy(); + // navigate to story to show panel + await sbPage.navigateToStory('example/button', 'primary'); - await sbPage.page.locator('html').press('t'); - await expect(await isToolbarShown()).toBeFalsy(); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); - await sbPage.page.locator('[aria-label="Shortcuts"]').click(); - await sbPage.page.locator('#list-item-T').click(); - await expect(await isToolbarShown()).toBeTruthy(); - }); + // toggle with keyboard shortcut + await sbPage.page.locator('html').press('a'); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + await sbPage.page.locator('html').press('a'); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); - test('shortcuts panel', async ({ page }) => { - const sbPage = new SbPage(page); - const isPanelsShown = async () => { - const main = await sbPage.page.locator('div', { - has: sbPage.page.locator('> * > #storybook-preview-wrapper'), + // toggle with menu item + await sbPage.page.locator('[aria-label="Shortcuts"]').click(); + await sbPage.page.locator('#list-item-A').click(); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + + // toggle with "show addons" button + await sbPage.page.locator('[aria-label="Show addons"]').click(); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); }); - const style = await main.getAttribute('style'); - return style; - }; + test('Positioning', async ({ page }) => { + const sbPage = new SbPage(page); + + // navigate to story to show panel + await sbPage.navigateToStory('example/button', 'primary'); + + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); + + // toggle position with keyboard shortcut + await sbPage.page.locator('html').press('d'); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); + // TODO: how to assert panel position? + + // hide with keyboard shortcut + await sbPage.page.locator('html').press('a'); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + + // toggling position should also show the panel again + await sbPage.page.locator('html').press('d'); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); + }); + }); + + test('Fullscreen toggling', async ({ page }) => { + const sbPage = new SbPage(page); + + // navigate to story to show panel + await sbPage.navigateToStory('example/button', 'primary'); + + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); + + // toggle with keyboard shortcut + await sbPage.page.locator('html').press('f'); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); - await sbPage.navigateToStory('example/button', 'primary'); - await expect(await isPanelsShown()).toBeTruthy(); + await sbPage.page.locator('html').press('f'); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); - await sbPage.page.locator('html').press('a'); - await expect(await isPanelsShown()).toBeFalsy(); + // toggle with menu item + await sbPage.page.locator('[aria-label="Shortcuts"]').click(); + await sbPage.page.locator('#list-item-F').click(); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); - await sbPage.page.locator('[aria-label="Shortcuts"]').click(); - await sbPage.page.locator('#list-item-A').click(); - await expect(await isPanelsShown()).toBeTruthy(); + // toggle with "go/exit fullscreen" button + await sbPage.page.locator('[aria-label="Exit full screen"]').click(); + await expect(sbPage.page.locator('#storybook-panel-root')).toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).toBeVisible(); - await sbPage.page.locator('html').press('a'); - await expect(await isPanelsShown()).toBeFalsy(); + await sbPage.page.locator('[aria-label="Go full screen"]').click(); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); - await sbPage.page.locator('html').press('a'); - await sbPage.page.locator('[aria-label="Shortcuts"]').click(); - await sbPage.page.locator('#list-item-D').click(); - await expect(await isPanelsShown()).toBeTruthy(); + // go fullscreen when sidebar is shown but panel is hidden + await sbPage.page.locator('[aria-label="Show sidebar"]').click(); + await sbPage.page.locator('[aria-label="Go full screen"]').click(); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); + + // go fullscreen when panel is shown but sidebar is hidden + await sbPage.page.locator('[aria-label="Show addons"]').click(); + await sbPage.page.locator('[aria-label="Go full screen"]').click(); + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + await expect(sbPage.page.locator('.sidebar-container')).not.toBeVisible(); + }); + + test('Settings page', async ({ page }) => { + const sbPage = new SbPage(page); + await sbPage.page.locator('[aria-label="Shortcuts"]').click(); + await sbPage.page.locator('#list-item-about').click(); + + await expect(sbPage.page.url()).toContain('/settings/about'); + + await expect(sbPage.page.locator('#storybook-panel-root')).not.toBeVisible(); + + await sbPage.page.locator('[title="Close settings page"]').click(); + await expect(sbPage.page.url()).not.toContain('/settings/about'); + }); }); - test('settings page', async ({ page }) => { - const sbPage = new SbPage(page); - await sbPage.page.locator('[aria-label="Shortcuts"]').click(); - await sbPage.page.locator('#list-item-about').click(); + test.describe('Mobile', () => { + // TODO: remove this when SSV6 templates have been removed + // Some assertions in these tests are not compatible with SSV6 + // GIven that SSV6 will be removed before the new mobile UI released, it doesn't make sense to fix them + // eslint-disable-next-line jest/no-disabled-tests + test.skip( + // eslint-disable-next-line jest/valid-title + templateName?.includes('ssv6') || false, + 'Skip mobile UI tests for SSV6' + ); + + // standard iPhone viewport size + test.use({ viewport: { width: 390, height: 844 } }); + + test('Navigate to story', async ({ page }) => { + const sbPage = new SbPage(page); + + const mobileNavigationHeading = await sbPage.page.locator('[title="Open navigation menu"]'); + + // navigation menu is closed + await expect(mobileNavigationHeading).toHaveText('Configure your project/Docs'); + await expect(sbPage.page.locator('#storybook-explorer-menu')).not.toBeVisible(); + + // open navigation menu + await mobileNavigationHeading.click(); + + await sbPage.openComponent('Example/Button'); + + // navigation menu is still open + await expect(sbPage.page.locator('#storybook-explorer-menu')).toBeVisible(); + // story has not changed + await expect(sbPage.page.url()).toContain('configure-your-project'); + + await sbPage.navigateToStory('Example/Button', 'Secondary'); + + // navigation menu is closed + await expect(mobileNavigationHeading).toHaveText('Example/Button/Secondary'); + await expect(sbPage.page.locator('#storybook-explorer-menu')).not.toBeVisible(); + // story has changed + await expect(sbPage.page.url()).toContain('example-button--secondary'); + }); + + test('Open and close addon panel', async ({ page }) => { + const sbPage = new SbPage(page); + + const mobileNavigationHeading = await sbPage.page.locator('[title="Open navigation menu"]'); + await mobileNavigationHeading.click(); + await sbPage.navigateToStory('Example/Button', 'Secondary'); + + // panel is closed + await expect(mobileNavigationHeading).toHaveText('Example/Button/Secondary'); + await expect(sbPage.page.locator('#tabbutton-addon-controls')).not.toBeVisible(); + + // open panel + await sbPage.page.locator('[title="Open addon panel"]').click(); + + // panel is open + await expect(sbPage.page.locator('#tabbutton-addon-controls')).toBeVisible(); - await expect(sbPage.page.url()).toContain('/settings/about'); + // close panel + await sbPage.page.locator('[title="Close addon panel"]').click(); - await sbPage.page.locator('[title="Close settings page"]').click(); - await expect(sbPage.page.url()).not.toContain('/settings/about'); + // panel is closed + await expect(mobileNavigationHeading).toHaveText('Example/Button/Secondary'); + await expect(sbPage.page.locator('#tabbutton-addon-controls')).not.toBeVisible(); + }); }); }); diff --git a/code/e2e-tests/util.ts b/code/e2e-tests/util.ts index 5ca303d47ef6..e0c45c1ae336 100644 --- a/code/e2e-tests/util.ts +++ b/code/e2e-tests/util.ts @@ -57,6 +57,8 @@ export class SbPage { const selected = await storyLink.getAttribute('data-selected'); await expect(selected).toBe('true'); + + await this.previewRoot(); } async waitUntilLoaded() { @@ -65,8 +67,9 @@ export class SbPage { const storeState = { layout: { showToolbar: true, - showNav: true, - showPanel: true, + navSize: 300, + bottomPanelHeight: 300, + rightPanelWidth: 300, }, }; window.sessionStorage.setItem('@storybook/manager/store', JSON.stringify(storeState)); diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 2498bcb774b1..05e03971ed78 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -51,8 +51,8 @@ "@storybook/telemetry": "workspace:*", "@storybook/types": "workspace:*", "@types/node": "^18.0.0", - "@types/react": "^16.14.34", - "@types/react-dom": "^16.9.14", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", "@types/semver": "^7.3.4", "@types/webpack-env": "^1.18.0", "find-up": "^5.0.0", @@ -84,7 +84,7 @@ "jest-preset-angular": "^13.0.1", "jest-specific-snapshot": "^8.0.0", "tmp": "^0.2.1", - "typescript": "^5.0.4", + "typescript": "^5.3.2", "webpack": "5", "zone.js": "^0.13.0" }, diff --git a/code/frameworks/angular/src/client/public-api.ts b/code/frameworks/angular/src/client/public-api.ts index 3f91276a044b..553c4c85907e 100644 --- a/code/frameworks/angular/src/client/public-api.ts +++ b/code/frameworks/angular/src/client/public-api.ts @@ -1,29 +1 @@ -/* eslint-disable prefer-destructuring */ -import { Addon_ClientStoryApi, Addon_Loadable } from '@storybook/types'; -import { start } from '@storybook/preview-api'; -import { renderToCanvas, render } from './render'; -import decorateStory from './decorateStory'; -import { AngularRenderer } from './types'; - export * from './public-types'; - -const RENDERER = 'angular'; - -interface ClientApi extends Addon_ClientStoryApi { - configure(loader: Addon_Loadable, module: NodeModule): void; - forceReRender(): void; - raw: () => any; // todo add type - load: (...args: any[]) => void; -} - -const api = start(renderToCanvas, { decorateStory, render }); - -export const storiesOf: ClientApi['storiesOf'] = (kind, m) => { - return (api.clientApi.storiesOf(kind, m) as ReturnType).addParameters({ - renderer: RENDERER, - }); -}; - -export const configure: ClientApi['configure'] = (...args) => api.configure(RENDERER, ...args); -export const forceReRender: ClientApi['forceReRender'] = api.forceReRender; -export const raw: ClientApi['raw'] = api.clientApi.raw; diff --git a/code/frameworks/angular/src/preset.ts b/code/frameworks/angular/src/preset.ts index f093cb6cc8b8..3d433ba2b841 100644 --- a/code/frameworks/angular/src/preset.ts +++ b/code/frameworks/angular/src/preset.ts @@ -6,16 +6,13 @@ import { StandaloneOptions } from './builders/utils/standalone-options'; const getAbsolutePath = (input: I): I => dirname(require.resolve(join(input, 'package.json'))) as any; -export const addons: PresetProperty<'addons', StorybookConfig> = [ +export const addons: PresetProperty<'addons'> = [ require.resolve('./server/framework-preset-angular-cli'), require.resolve('./server/framework-preset-angular-ivy'), require.resolve('./server/framework-preset-angular-docs'), ]; -export const previewAnnotations: StorybookConfig['previewAnnotations'] = ( - entries = [], - options -) => { +export const previewAnnotations: PresetProperty<'previewAnnotations'> = (entries = [], options) => { const annotations = [...entries, require.resolve('./client/config')]; if ((options as any as StandaloneOptions).enableProdMode) { @@ -26,7 +23,7 @@ export const previewAnnotations: StorybookConfig['previewAnnotations'] = ( }; export const core: PresetProperty<'core', StorybookConfig> = async (config, options) => { - const framework = await options.presets.apply('framework'); + const framework = await options.presets.apply('framework'); return { ...config, diff --git a/code/frameworks/angular/src/server/framework-preset-angular-docs.ts b/code/frameworks/angular/src/server/framework-preset-angular-docs.ts index a055b0c430d6..0b31ffe9c12e 100644 --- a/code/frameworks/angular/src/server/framework-preset-angular-docs.ts +++ b/code/frameworks/angular/src/server/framework-preset-angular-docs.ts @@ -1,7 +1,7 @@ -import { StorybookConfig } from '@storybook/types'; +import { PresetProperty } from '@storybook/types'; import { hasDocsOrControls } from '@storybook/docs-tools'; -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { +export const previewAnnotations: PresetProperty<'previewAnnotations'> = (entry = [], options) => { if (!hasDocsOrControls(options)) return entry; return [...entry, require.resolve('../client/docs/config')]; }; diff --git a/code/frameworks/angular/src/typings.d.ts b/code/frameworks/angular/src/typings.d.ts index a1bde958b56d..ca7bae4c5383 100644 --- a/code/frameworks/angular/src/typings.d.ts +++ b/code/frameworks/angular/src/typings.d.ts @@ -12,7 +12,7 @@ declare var __STORYBOOK_STORY_STORE__: any; declare var CHANNEL_OPTIONS: any; declare var DOCS_OPTIONS: any; -declare var FEATURES: import('@storybook/types').StorybookConfig['features']; +declare var FEATURES: import('@storybook/types').StorybookConfigRaw['features']; declare var IS_STORYBOOK: any; declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined; diff --git a/code/frameworks/angular/template/cli/Button.stories.ts b/code/frameworks/angular/template/cli/Button.stories.ts index 8f280fb0c763..3809c0e3dd19 100644 --- a/code/frameworks/angular/template/cli/Button.stories.ts +++ b/code/frameworks/angular/template/cli/Button.stories.ts @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import Button from './button.component'; -// More on how to set up stories at: https://storybook.js.org/docs/angular/writing-stories/introduction +// More on how to set up stories at: https://storybook.js.org/docs/writing-stories const meta: Meta ); } const controlId = getControlId(name); diff --git a/code/ui/blocks/src/controls/Number.tsx b/code/ui/blocks/src/controls/Number.tsx index 551d5fb7417e..946563ea0c7d 100644 --- a/code/ui/blocks/src/controls/Number.tsx +++ b/code/ui/blocks/src/controls/Number.tsx @@ -1,7 +1,7 @@ import type { FC, ChangeEvent } from 'react'; import React, { useState, useCallback, useEffect, useRef } from 'react'; import { styled } from '@storybook/theming'; -import { Form } from '@storybook/components'; +import { Button, Form } from '@storybook/components'; import { getControlId, getControlSetterButtonId } from './helpers'; import type { ControlProps, NumberValue, NumberConfig } from './types'; @@ -68,9 +68,14 @@ export const NumberControl: FC = ({ if (!forceVisible && value === undefined) { return ( - + ); } diff --git a/code/ui/blocks/src/controls/Object.tsx b/code/ui/blocks/src/controls/Object.tsx index 11c51f8f6392..c6b94fc23951 100644 --- a/code/ui/blocks/src/controls/Object.tsx +++ b/code/ui/blocks/src/controls/Object.tsx @@ -3,7 +3,8 @@ import cloneDeep from 'lodash/cloneDeep.js'; import type { ComponentProps, SyntheticEvent, FC, FocusEvent } from 'react'; import React, { useCallback, useMemo, useState, useEffect, useRef } from 'react'; import { styled, useTheme, type Theme } from '@storybook/theming'; -import { Form, Icons, type IconsProps, IconButton } from '@storybook/components'; +import { Form, Icons, IconButton, Button } from '@storybook/components'; +import { EyeCloseIcon, EyeIcon } from '@storybook/icons'; import { JsonTree, getObjectType } from './react-editable-json-tree'; import { getControlId, getControlSetterButtonId } from './helpers'; import type { ControlProps, ObjectValue, ObjectConfig } from './types'; @@ -120,7 +121,7 @@ const Wrapper = styled.div(({ theme }) => ({ }, })); -const Button = styled.button<{ primary?: boolean }>(({ theme, primary }) => ({ +const ButtonInline = styled.button<{ primary?: boolean }>(({ theme, primary }) => ({ border: 0, height: 20, margin: 1, @@ -132,9 +133,7 @@ const Button = styled.button<{ primary?: boolean }>(({ theme, primary }) => ({ order: primary ? 'initial' : 9, })); -type ActionIconProps = IconsProps & { disabled?: boolean }; - -const ActionIcon = styled(Icons)(({ theme, icon, disabled }: ActionIconProps) => ({ +const ActionIcon = styled(Icons)<{ disabled?: boolean }>(({ theme, icon, disabled }) => ({ display: 'inline-block', verticalAlign: 'middle', width: 15, @@ -265,9 +264,9 @@ export const ObjectControl: FC = ({ name, value, onChange }) => { if (!hasData) { return ( - + ); } @@ -288,13 +287,12 @@ export const ObjectControl: FC = ({ name, value, onChange }) => { {['Object', 'Array'].includes(getObjectType(data)) && ( { e.preventDefault(); setShowRaw((v) => !v); }} > - + {showRaw ? : } RAW )} @@ -304,12 +302,12 @@ export const ObjectControl: FC = ({ name, value, onChange }) => { rootName={name} onFullyUpdate={onChange} getStyle={getCustomStyleFunction(theme)} - cancelButtonElement={} - editButtonElement={} + cancelButtonElement={Cancel} + editButtonElement={Save} addButtonElement={ - + } plusMenuElement={} minusMenuElement={} diff --git a/code/ui/blocks/src/controls/Text.tsx b/code/ui/blocks/src/controls/Text.tsx index d7a1e312784d..38cb955816e4 100644 --- a/code/ui/blocks/src/controls/Text.tsx +++ b/code/ui/blocks/src/controls/Text.tsx @@ -1,7 +1,7 @@ import type { FC, ChangeEvent } from 'react'; import React, { useCallback, useState } from 'react'; import { styled } from '@storybook/theming'; -import { Form } from '@storybook/components'; +import { Button, Form } from '@storybook/components'; import { getControlId, getControlSetterButtonId } from './helpers'; import type { ControlProps, TextValue, TextConfig } from './types'; @@ -37,9 +37,14 @@ export const TextControl: FC = ({ }, [setForceVisible]); if (value === undefined) { return ( - + ); } diff --git a/code/ui/blocks/src/examples/Button.stories.tsx b/code/ui/blocks/src/examples/Button.stories.tsx index 59e3fe55b308..0f9410e02906 100644 --- a/code/ui/blocks/src/examples/Button.stories.tsx +++ b/code/ui/blocks/src/examples/Button.stories.tsx @@ -1,8 +1,6 @@ import { expect } from '@storybook/jest'; import type { Meta, StoryObj } from '@storybook/react'; import { within, fireEvent } from '@storybook/testing-library'; -import { addons } from '@storybook/preview-api'; -import { RESET_STORY_ARGS, STORY_ARGS_UPDATED } from '@storybook/core-events'; import React from 'react'; import { Button } from './Button'; @@ -98,13 +96,6 @@ export const Clicking: Story = { ); }, play: async ({ canvasElement, id }) => { - const channel = addons.getChannel(); - - channel.emit(RESET_STORY_ARGS, { storyId: id }); - await new Promise((resolve) => { - channel.once(STORY_ARGS_UPDATED, resolve); - }); - const canvas = within(canvasElement); const button = canvas.getByText('Increment'); diff --git a/code/ui/components/package.json b/code/ui/components/package.json index 21860ef912c2..e8ff19bf6957 100644 --- a/code/ui/components/package.json +++ b/code/ui/components/package.json @@ -59,11 +59,11 @@ "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" }, "dependencies": { - "@radix-ui/react-select": "^1.2.2", - "@radix-ui/react-toolbar": "^1.0.4", + "@radix-ui/react-slot": "^1.0.2", "@storybook/client-logger": "workspace:*", "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", "memoizerific": "^1.11.3", @@ -73,7 +73,6 @@ "devDependencies": { "@popperjs/core": "^2.6.0", "@radix-ui/react-scroll-area": "^1.0.5", - "@storybook/icons": "^1.1.6", "@types/react-syntax-highlighter": "11.0.5", "@types/util-deprecate": "^1.0.0", "css": "^3.0.0", @@ -83,7 +82,7 @@ "react-syntax-highlighter": "^15.4.5", "react-textarea-autosize": "^8.3.0", "ts-dedent": "^2.0.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0", diff --git a/code/ui/components/src/components/ActionBar/ActionBar.tsx b/code/ui/components/src/components/ActionBar/ActionBar.tsx index 643a8a60e40e..8519b47e47c1 100644 --- a/code/ui/components/src/components/ActionBar/ActionBar.tsx +++ b/code/ui/components/src/components/ActionBar/ActionBar.tsx @@ -1,4 +1,4 @@ -import type { FC, MouseEvent } from 'react'; +import type { FC, MouseEvent, ReactElement } from 'react'; import React from 'react'; import { styled } from '@storybook/theming'; @@ -56,7 +56,7 @@ export const ActionButton = styled.button<{ disabled: boolean }>( ActionButton.displayName = 'ActionButton'; export interface ActionItem { - title: string | JSX.Element; + title: string | ReactElement; className?: string; onClick: (e: MouseEvent) => void; disabled?: boolean; diff --git a/code/ui/components/src/components/Badge/Badge.tsx b/code/ui/components/src/components/Badge/Badge.tsx index 36a7d191c8f6..bcb4d3b01b50 100644 --- a/code/ui/components/src/components/Badge/Badge.tsx +++ b/code/ui/components/src/components/Badge/Badge.tsx @@ -1,4 +1,4 @@ -import type { FC } from 'react'; +import type { FC, PropsWithChildren } from 'react'; import React from 'react'; import { styled } from '@storybook/theming'; import { transparentize } from 'polished'; @@ -80,7 +80,7 @@ const BadgeWrapper = styled.div( } ); -export interface BadgeProps { +export interface BadgeProps extends PropsWithChildren { status: 'positive' | 'negative' | 'neutral' | 'warning' | 'critical'; } diff --git a/code/ui/components/src/components/Button/Button.deprecated.stories.tsx b/code/ui/components/src/components/Button/Button.deprecated.stories.tsx new file mode 100644 index 000000000000..10362221ce2a --- /dev/null +++ b/code/ui/components/src/components/Button/Button.deprecated.stories.tsx @@ -0,0 +1,90 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import { LinkIcon } from '@storybook/icons'; +import { Button } from './Button'; +import { Form } from '../form'; + +const meta: Meta = { + title: 'Button/Deprecated', + component: Button, + tags: ['autodocs'], +}; + +export default meta; +type Story = StoryObj; + +export const Default = { args: { children: 'Default' } }; + +export const FormButton: Story = { + render: (args) => , + args: { children: 'Form.Button' }, +}; + +export const Primary: Story = { args: { primary: true, children: 'Primary' } }; +export const Secondary: Story = { args: { secondary: true, children: 'Secondary' } }; +export const Tertiary: Story = { args: { tertiary: true, children: 'Tertiary' } }; +export const Gray: Story = { args: { gray: true, children: 'Gray' } }; + +export const Outline: Story = { args: { outline: true, children: 'Outline' } }; +export const OutlinePrimary: Story = { + args: { outline: true, primary: true, children: 'Outline Primary' }, +}; +export const OutlineSecondary: Story = { + args: { outline: true, secondary: true, children: 'Outline Secondary' }, +}; +export const OutlineTertiary: Story = { + args: { outline: true, tertiary: true, children: 'Outline Tertiary' }, +}; + +export const Disabled: Story = { args: { disabled: true, children: 'Disabled' } }; +export const DisabledPrimary: Story = { + args: { disabled: true, primary: true, children: 'Disabled Priary' }, +}; +export const DisabledSecondary: Story = { + args: { disabled: true, secondary: true, children: 'Disabled Secondary' }, +}; +export const DisabledTertiary: Story = { + args: { disabled: true, tertiary: true, children: 'Disabled Tertiary' }, +}; +export const DisabledGray: Story = { + args: { disabled: true, gray: true, children: 'Disabled Gray' }, +}; + +export const Small: Story = { args: { small: true, children: 'Small' } }; +export const SmallPrimary: Story = { + args: { small: true, primary: true, children: 'Small Priary' }, +}; +export const SmallSecondary: Story = { + args: { small: true, secondary: true, children: 'Small Secondary' }, +}; +export const SmallTertiary: Story = { + args: { small: true, tertiary: true, children: 'Small Tertiary' }, +}; +export const SmallGray: Story = { + args: { small: true, gray: true, children: 'Small Gray' }, +}; + +export const IsLink: Story = { + args: { isLink: true, children: 'Button as a link' }, +}; + +export const IconPrimary: Story = { + args: { + primary: true, + containsIcon: true, + title: 'link', + children: , + }, +}; +export const IconOutline: Story = { + args: { outline: true, containsIcon: true, title: 'link', children: }, +}; +export const IconOutlineSmall: Story = { + args: { + outline: true, + containsIcon: true, + small: true, + title: 'link', + children: , + }, +}; diff --git a/code/ui/components/src/components/Button/Button.stories.tsx b/code/ui/components/src/components/Button/Button.stories.tsx index e1fc021087b8..a74ce9e308a6 100644 --- a/code/ui/components/src/components/Button/Button.stories.tsx +++ b/code/ui/components/src/components/Button/Button.stories.tsx @@ -1,82 +1,185 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import type { ReactNode } from 'react'; import React from 'react'; -import type { Args } from '@storybook/types'; - +import { FaceHappyIcon } from '@storybook/icons'; import { Button } from './Button'; -import { Icons } from '../icon/icon'; -import { Form } from '../form/index'; -export default { +const meta = { + title: 'Button', component: Button, -}; + args: { children: 'Button' }, +} satisfies Meta; -export const Default = { args: { children: 'Default' } }; +export default meta; +type Story = StoryObj; -export const FormButton = { - render: (args: Args) => , - args: { children: 'Form.Button' }, -}; +const Stack = ({ children }: { children: ReactNode }) => ( +
{children}
+); -export const Primary = { args: { primary: true, children: 'Primary' } }; -export const Secondary = { args: { secondary: true, children: 'Secondary' } }; -export const Tertiary = { args: { tertiary: true, children: 'Tertiary' } }; -export const Gray = { args: { gray: true, children: 'Gray' } }; +const Row = ({ children }: { children: ReactNode }) => ( +
{children}
+); -export const Outline = { args: { outline: true, children: 'Outline' } }; -export const OutlinePrimary = { - args: { outline: true, primary: true, children: 'Outline Primary' }, -}; -export const OutlineSecondary = { - args: { outline: true, secondary: true, children: 'Outline Secondary' }, -}; -export const OutlineTertiary = { - args: { outline: true, tertiary: true, children: 'Outline Tertiary' }, -}; +export const Base: Story = {}; -export const Disabled = { args: { disabled: true, children: 'Disabled' } }; -export const DisabledPrimary = { - args: { disabled: true, primary: true, children: 'Disabled Priary' }, -}; -export const DisabledSecondary = { - args: { disabled: true, secondary: true, children: 'Disabled Secondary' }, -}; -export const DisabledTertiary = { - args: { disabled: true, tertiary: true, children: 'Disabled Tertiary' }, -}; -export const DisabledGray = { - args: { disabled: true, gray: true, children: 'Disabled Gray' }, +export const Variants: Story = { + render: (args) => ( + + + + + + + + + + + + + + + + + + ), }; -export const Small = { args: { small: true, children: 'Small' } }; -export const SmallPrimary = { - args: { small: true, primary: true, children: 'Small Priary' }, +export const Active: Story = { + args: { + active: true, + children: ( + <> + + Button + + ), + }, + render: (args) => ( + + + + + ), }; -export const IconPrimary = { +export const Disabled: Story = { args: { - primary: true, - containsIcon: true, - title: 'link', - children: , + disabled: true, + children: 'Disabled Button', }, }; -export const IconOutline = { - args: { outline: true, containsIcon: true, title: 'link', children: }, + +export const WithHref: Story = { + render: () => ( + + + + + ), }; -export const IconOutlineSmall = { + +export const Animated: Story = { args: { - outline: true, - containsIcon: true, - small: true, - title: 'link', - children: , + variant: 'outline', }, + render: (args) => ( + + + + + + + + + + + + + + + + + + ), }; diff --git a/code/ui/components/src/components/Button/Button.tsx b/code/ui/components/src/components/Button/Button.tsx index 72598c214ec7..5045f0621ed2 100644 --- a/code/ui/components/src/components/Button/Button.tsx +++ b/code/ui/components/src/components/Button/Button.tsx @@ -1,272 +1,218 @@ -import type { FC, ComponentProps, ReactNode } from 'react'; -import React, { forwardRef } from 'react'; -import { styled } from '@storybook/theming'; +import type { ButtonHTMLAttributes, SyntheticEvent } from 'react'; +import React, { forwardRef, useEffect, useState } from 'react'; +import { isPropValid, styled } from '@storybook/theming'; import { darken, lighten, rgba, transparentize } from 'polished'; +import { Slot } from '@radix-ui/react-slot'; +import { deprecate } from '@storybook/client-logger'; + +export interface ButtonProps extends ButtonHTMLAttributes { + asChild?: boolean; + size?: 'small' | 'medium'; + padding?: 'small' | 'medium'; + variant?: 'outline' | 'solid' | 'ghost'; + onClick?: (event: SyntheticEvent) => void; + disabled?: boolean; + active?: boolean; + animation?: 'none' | 'rotate360' | 'glow' | 'jiggle'; -const ButtonWrapper = styled.button<{ + /** @deprecated Use {@link asChild} instead */ isLink?: boolean; + /** @deprecated Use {@link variant} instead */ primary?: boolean; + /** @deprecated Use {@link variant} instead */ secondary?: boolean; + /** @deprecated Use {@link variant} instead */ tertiary?: boolean; + /** @deprecated Use {@link variant} instead */ gray?: boolean; + /** @deprecated Use {@link variant} instead */ inForm?: boolean; - disabled?: boolean; + /** @deprecated Use {@link size} instead */ small?: boolean; + /** @deprecated Use {@link variant} instead */ outline?: boolean; + /** @deprecated Add your icon as a child directly */ containsIcon?: boolean; - children?: ReactNode; - href?: string; -}>( - ({ small, theme }) => ({ - border: 0, - borderRadius: '3em', - cursor: 'pointer', - display: 'inline-block', - overflow: 'hidden', - padding: small ? '8px 16px' : '13px 20px', - position: 'relative', - textAlign: 'center', - textDecoration: 'none', - transitionProperty: 'background, box-shadow', - transitionDuration: '150ms', - transitionTimingFunction: 'ease-out', - verticalAlign: 'top', - whiteSpace: 'nowrap', - userSelect: 'none', - opacity: 1, - margin: 0, - background: 'transparent', - - fontSize: `${small ? theme.typography.size.s1 : theme.typography.size.s2 - 1}px`, - fontWeight: theme.typography.weight.bold, - lineHeight: '1', - - svg: { - display: 'inline-block', - height: small ? 12 : 14, - width: small ? 12 : 14, - - verticalAlign: 'top', - marginRight: small ? 4 : 6, - marginTop: small ? 0 : -1, - marginBottom: small ? 0 : -1, +} - /* Necessary for js mouse events to not glitch out when hovering on svgs */ - pointerEvents: 'none', - - path: { - fill: 'currentColor', - }, +export const Button = forwardRef( + ( + { + asChild = false, + animation = 'none', + size = 'small', + variant = 'outline', + padding = 'medium', + disabled = false, + active = false, + onClick, + ...props }, - }), - ({ disabled }) => - disabled - ? { - cursor: 'not-allowed !important', - opacity: 0.5, - '&:hover': { - transform: 'none', - }, - } - : {}, - ({ containsIcon, small }) => - containsIcon - ? { - svg: { - display: 'block', - margin: 0, - }, - ...(small ? { padding: 10 } : { padding: 13 }), - } - : {}, - ({ theme, primary, secondary, gray }) => { - let color; - - if (gray) { - color = theme.color.mediumlight; - } else if (secondary) { - color = theme.color.secondary; - } else if (primary) { - color = theme.color.primary; + ref + ) => { + let Comp: 'button' | 'a' | typeof Slot = 'button'; + if (props.isLink) Comp = 'a'; + if (asChild) Comp = Slot; + let localVariant = variant; + let localSize = size; + + const [isAnimating, setIsAnimating] = useState(false); + + const handleClick = (event: SyntheticEvent) => { + if (onClick) onClick(event); + if (animation === 'none') return; + setIsAnimating(true); + }; + + useEffect(() => { + const timer = setTimeout(() => { + if (isAnimating) setIsAnimating(false); + }, 1000); + return () => clearTimeout(timer); + }, [isAnimating]); + + // Match the old API with the new API. + // TODO: Remove this after 9.0. + if (props.primary) { + localVariant = 'solid'; + localSize = 'medium'; } - return color - ? { - background: color, - color: gray ? theme.color.darkest : theme.color.lightest, - - '&:hover': { - background: darken(0.05, color), - }, - '&:active': { - boxShadow: 'rgba(0, 0, 0, 0.1) 0 0 0 3em inset', - }, - '&:focus': { - boxShadow: `${rgba(color, 1)} 0 1px 9px 2px`, - outline: 'none', - }, - '&:focus:hover': { - boxShadow: `${rgba(color, 0.2)} 0 8px 18px 0px`, - }, - } - : {}; - }, - ({ theme, tertiary, inForm, small }) => - tertiary - ? { - background: theme.button.background, - color: theme.input.color, - boxShadow: `${theme.button.border} 0 0 0 1px inset`, - borderRadius: theme.input.borderRadius, - - ...(inForm && small ? { padding: '10px 16px' } : {}), - - '&:hover': { - background: - theme.base === 'light' - ? darken(0.02, theme.button.background) - : lighten(0.03, theme.button.background), - ...(inForm - ? {} - : { - boxShadow: 'rgba(0,0,0,.2) 0 2px 6px 0, rgba(0,0,0,.1) 0 0 0 1px inset', - }), - }, - '&:active': { - background: theme.button.background, - }, - '&:focus': { - boxShadow: `${rgba(theme.color.secondary, 1)} 0 0 0 1px inset`, - outline: 'none', - }, - } - : {}, - ({ theme, outline }) => - outline - ? { - boxShadow: `${transparentize(0.8, theme.color.defaultText)} 0 0 0 1px inset`, - color: transparentize(0.3, theme.color.defaultText), - background: 'transparent', - - '&:hover, &:focus': { - boxShadow: `${transparentize(0.5, theme.color.defaultText)} 0 0 0 1px inset`, - outline: 'none', - }, + // Match the old API with the new API. + // TODO: Remove this after 9.0. + if (props.secondary || props.tertiary || props.gray || props.outline || props.inForm) { + localVariant = 'outline'; + localSize = 'medium'; + } - '&:active': { - boxShadow: `${transparentize(0.5, theme.color.defaultText)} 0 0 0 2px inset`, - color: transparentize(0, theme.color.defaultText), - }, - } - : {}, - ({ theme, outline, primary }) => { - const color = theme.color.primary; + if ( + props.small || + props.isLink || + props.primary || + props.secondary || + props.tertiary || + props.gray || + props.outline || + props.inForm || + props.containsIcon + ) { + const buttonContent = React.Children.toArray(props.children).filter( + (e) => typeof e === 'string' && e !== '' + ); - return outline && primary - ? { - boxShadow: `${color} 0 0 0 1px inset`, - color, + deprecate( + `Use of deprecated props in the button ${ + buttonContent.length > 0 ? `"${buttonContent.join(' ')}"` : 'component' + } detected, see the migration notes at https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#new-ui-and-props-for-button-and-iconbutton-components` + ); + } - 'svg path:not([fill])': { - fill: color, - }, + return ( + + ); + } +); - '&:hover': { - boxShadow: `${color} 0 0 0 1px inset`, - background: 'transparent', - }, +Button.displayName = 'Button'; - '&:active': { - background: color, - boxShadow: `${color} 0 0 0 1px inset`, - color: theme.color.tertiary, - }, - '&:focus': { - boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.4)} 0 1px 9px 2px`, - outline: 'none', - }, - '&:focus:hover': { - boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.2)} 0 8px 18px 0px`, - }, - } - : {}; +const StyledButton = styled('button', { + shouldForwardProp: (prop) => isPropValid(prop), +})< + ButtonProps & { + animating: boolean; + animation: ButtonProps['animation']; + } +>(({ theme, variant, size, disabled, active, animating, animation, padding }) => ({ + border: 0, + cursor: disabled ? 'not-allowed' : 'pointer', + display: 'inline-flex', + gap: '6px', + alignItems: 'center', + justifyContent: 'center', + overflow: 'hidden', + padding: (() => { + if (padding === 'small' && size === 'small') return '0 7px'; + if (padding === 'small' && size === 'medium') return '0 9px'; + if (size === 'small') return '0 10px'; + if (size === 'medium') return '0 12px'; + return 0; + })(), + height: size === 'small' ? '28px' : '32px', + position: 'relative', + textAlign: 'center', + textDecoration: 'none', + transitionProperty: 'background, box-shadow', + transitionDuration: '150ms', + transitionTimingFunction: 'ease-out', + verticalAlign: 'top', + whiteSpace: 'nowrap', + userSelect: 'none', + opacity: disabled ? 0.5 : 1, + margin: 0, + fontSize: `${theme.typography.size.s1}px`, + fontWeight: theme.typography.weight.bold, + lineHeight: '1', + background: (() => { + if (variant === 'solid') return theme.color.secondary; + if (variant === 'outline') return theme.button.background; + if (variant === 'ghost' && active) return theme.background.hoverable; + return 'transparent'; + })(), + color: (() => { + if (variant === 'solid') return theme.color.lightest; + if (variant === 'outline') return theme.input.color; + if (variant === 'ghost' && active) return theme.color.secondary; + if (variant === 'ghost') return theme.color.mediumdark; + return theme.input.color; + })(), + boxShadow: variant === 'outline' ? `${theme.button.border} 0 0 0 1px inset` : 'none', + borderRadius: theme.input.borderRadius, + // Making sure that the button never shrinks below its minimum size + flexShrink: 0, + + '&:hover': { + color: variant === 'ghost' ? theme.color.secondary : null, + background: (() => { + let bgColor = theme.color.secondary; + if (variant === 'solid') bgColor = theme.color.secondary; + if (variant === 'outline') bgColor = theme.button.background; + + if (variant === 'ghost') return transparentize(0.86, theme.color.secondary); + return theme.base === 'light' ? darken(0.02, bgColor) : lighten(0.03, bgColor); + })(), }, - ({ theme, outline, primary, secondary }) => { - let color; - - if (secondary) { - color = theme.color.secondary; - } else if (primary) { - color = theme.color.primary; - } - - return outline && color - ? { - boxShadow: `${color} 0 0 0 1px inset`, - color, - 'svg path:not([fill])': { - fill: color, - }, + '&:active': { + color: variant === 'ghost' ? theme.color.secondary : null, + background: (() => { + let bgColor = theme.color.secondary; + if (variant === 'solid') bgColor = theme.color.secondary; + if (variant === 'outline') bgColor = theme.button.background; - '&:hover': { - boxShadow: `${color} 0 0 0 1px inset`, - background: 'transparent', - }, - - '&:active': { - background: color, - boxShadow: `${color} 0 0 0 1px inset`, - color: theme.color.tertiary, - }, - '&:focus': { - boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.4)} 0 1px 9px 2px`, - outline: 'none', - }, - '&:focus:hover': { - boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.2)} 0 8px 18px 0px`, - }, - } - : {}; - } -); + if (variant === 'ghost') return theme.background.hoverable; + return theme.base === 'light' ? darken(0.02, bgColor) : lighten(0.03, bgColor); + })(), + }, -const ButtonLink = ButtonWrapper.withComponent('a'); + '&:focus': { + boxShadow: `${rgba(theme.color.secondary, 1)} 0 0 0 1px inset`, + outline: 'none', + }, -export const Button: FC> = Object.assign( - forwardRef< - any, - { - isLink?: boolean; - primary?: boolean; - secondary?: boolean; - tertiary?: boolean; - gray?: boolean; - inForm?: boolean; - disabled?: boolean; - small?: boolean; - outline?: boolean; - containsIcon?: boolean; - children?: ReactNode; - href?: string; - } - >(function Button({ isLink, children, ...props }, ref) { - if (isLink) { - return ( - - {children} - - ); - } - return ( - - {children} - - ); - }), - { - defaultProps: { - isLink: false, - }, - } -); + '> svg': { + animation: + animating && animation !== 'none' ? `${theme.animation[animation]} 1000ms ease-out` : '', + }, +})); diff --git a/code/ui/components/src/components/Button/Docs.mdx b/code/ui/components/src/components/Button/Docs.mdx new file mode 100644 index 000000000000..eb6565812da9 --- /dev/null +++ b/code/ui/components/src/components/Button/Docs.mdx @@ -0,0 +1,159 @@ +import { Canvas, Meta, Controls, Source } from '@storybook/blocks'; + +import * as ButtonStories from './Button.stories'; + + + +# Button + +Button component is used to trigger an action or event, such as submitting a form, opening a Dialog, canceling an action, or performing a delete operation. + +## Import + + + +## Usage +Hello world! + +// Using the asChild prop to render a custom child + +`} /> + + + +### Button sizes + +Use the `size` prop to change the size of the button. You can set the value to `small` or `medium`. + + +Small Button + +`} /> + +### Button variants + +Use the `variant` prop to change the visual style of the button. You can set the value to `outline`, `solid` or `ghost`. + + +Outline + + +`} /> + +### Button with icon + +You can add an icon to the button by adding the icon on the left of the text. Please use any icon from the icon library `@storybook/icons`. + + + + Button + +`} /> + +### Icon only buttons + +You can also use the button as an icon only button by removing the text. to make sure the button is square, please set the padding prop to `small` + + + + + +`} /> + +### Button with custom wrapper + +If you want to use a custom wrapper to set the button as an external link or to use your custom router, you can use the `asChild` prop. This will render the button as a child of the wrapper. + + + + Hello world! + + +`} /> + +### Button with animations + +You can use the `animate` prop to add animations to the button. You can set the value to `glow`, `jiggle` or `rotate360`. + + + + Button + + + +`} /> + +### Active button + +You can use the `active` prop to set the button as active. This will change the background color of the button. + + + + Button + + `} +/> + +### Disabled button + +You can use the `disabled` prop to set the button as disabled. + + + + Button + + `} +/> \ No newline at end of file diff --git a/code/ui/components/src/components/IconButton/IconButton.stories.tsx b/code/ui/components/src/components/IconButton/IconButton.stories.tsx new file mode 100644 index 000000000000..c3341ac44c92 --- /dev/null +++ b/code/ui/components/src/components/IconButton/IconButton.stories.tsx @@ -0,0 +1,81 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import { FaceHappyIcon } from '@storybook/icons'; +import { IconButton } from './IconButton'; + +const meta = { + title: 'IconButton', + component: IconButton, + tags: ['autodocs'], + args: { children: }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Base = {}; + +export const Types: Story = { + render: ({ ...args }) => ( +
+ + + +
+ ), +}; + +export const Active: Story = { + args: { active: true }, + render: ({ ...args }) => ( +
+ + + +
+ ), +}; + +export const Sizes: Story = { + args: { variant: 'solid' }, + render: ({ ...args }) => ( +
+ + +
+ ), +}; + +export const Disabled: Story = { + args: { disabled: true }, + render: ({ ...args }) => ( +
+ + + +
+ ), +}; + +export const Animated: Story = { + render: ({ ...args }) => ( +
+ + + +
+ ), +}; + +export const WithHref: Story = { + render: ({ ...args }) => ( +
+ console.log('Hello')} /> + + + + + +
+ ), +}; diff --git a/code/ui/components/src/components/IconButton/IconButton.tsx b/code/ui/components/src/components/IconButton/IconButton.tsx new file mode 100644 index 000000000000..87088d342b52 --- /dev/null +++ b/code/ui/components/src/components/IconButton/IconButton.tsx @@ -0,0 +1,11 @@ +import React, { forwardRef } from 'react'; +import type { ButtonProps } from '../Button/Button'; +import { Button } from '../Button/Button'; + +export const IconButton = forwardRef( + ({ padding = 'small', variant = 'ghost', ...props }, ref) => { + return - ); -}); +const isLink = (obj: { + props: ButtonProps | LinkProps; + ref: ForwardedRef | ForwardedRef; +}): obj is { props: LinkProps; ref: ForwardedRef } => { + return typeof obj.props.href === 'string'; +}; + +const isButton = (obj: { + props: ButtonProps | LinkProps; + ref: ForwardedRef | ForwardedRef; +}): obj is { props: ButtonProps; ref: ForwardedRef } => { + return typeof obj.props.href !== 'string'; +}; + +function ForwardRefFunction(p: LinkProps, r: ForwardedRef): ReactElement; +function ForwardRefFunction(p: ButtonProps, r: ForwardedRef): ReactElement; +function ForwardRefFunction( + { children, ...rest }: ButtonProps | LinkProps, + ref: ForwardedRef | ForwardedRef +) { + const o = { props: rest, ref }; + if (isLink(o)) { + return ( + + {children} + + ); + } + if (isButton(o)) { + return ( + + ); + } + throw new Error('invalid props'); +} +type ButtonLike

= ForwardRefExoticComponent< + Omit & RefAttributes & P +>; + +type LinkLike

= ForwardRefExoticComponent< + Omit & RefAttributes & P +>; + +const ButtonOrLink: ButtonLike | LinkLike = forwardRef(ForwardRefFunction) as ButtonLike | LinkLike; ButtonOrLink.displayName = 'ButtonOrLink'; @@ -55,6 +90,9 @@ export const TabButton = styled(ButtonOrLink, { shouldForwardProp: isPropValid } '&:empty': { display: 'none', }, + '&[hidden]': { + display: 'none', + }, }, ({ theme }) => ({ padding: '0 15px', @@ -92,54 +130,6 @@ export interface IconButtonProps { disabled?: boolean; } -export const IconButton = styled(ButtonOrLink, { shouldForwardProp: isPropValid })( - () => ({ - alignItems: 'center', - background: 'transparent', - border: 'none', - borderRadius: 4, - color: 'inherit', - cursor: 'pointer', - display: 'inline-flex', - fontSize: 13, - fontWeight: 'bold', - height: 28, - justifyContent: 'center', - marginTop: 6, - padding: '8px 7px', - - '& > svg': { - width: 14, - }, - }), - ({ active, theme }) => - active - ? { - backgroundColor: theme.background.hoverable, - color: theme.barSelectedColor, - } - : {}, - ({ disabled, theme }) => - disabled - ? { - opacity: 0.5, - cursor: 'not-allowed', - } - : { - '&:hover, &:focus-visible': { - background: transparentize(0.88, theme.color.secondary), - color: theme.barHoverColor, - }, - '&:focus-visible': { - outline: auto, // Ensures links have the same focus style - }, - '&:focus:not(:focus-visible)': { - outline: 'none', - }, - } -); -IconButton.displayName = 'IconButton'; - const IconPlaceholder = styled.div(({ theme }) => ({ width: 14, height: 14, @@ -153,7 +143,11 @@ const IconButtonSkeletonWrapper = styled.div(() => ({ height: 28, })); -export const IconButtonSkeleton = () => ( +/** + * @deprecated + * This component will be removed in Storybook 9.0 + * */ +export const IconButtonSkeleton: FC = () => ( diff --git a/code/ui/components/src/components/bar/separator.tsx b/code/ui/components/src/components/bar/separator.tsx index c43ebebad7b9..6a24a11d3386 100644 --- a/code/ui/components/src/components/bar/separator.tsx +++ b/code/ui/components/src/components/bar/separator.tsx @@ -6,8 +6,7 @@ export const Separator = styled.span( width: 1, height: 20, background: theme.appBorderColor, - marginTop: 10, - marginLeft: 6, + marginLeft: 2, marginRight: 2, }), ({ force }) => diff --git a/code/ui/components/src/components/form/form.stories.tsx b/code/ui/components/src/components/form/form.stories.tsx index 993000e6085b..fb6070100d41 100644 --- a/code/ui/components/src/components/form/form.stories.tsx +++ b/code/ui/components/src/components/form/form.stories.tsx @@ -84,15 +84,6 @@ export const Select = { }, }; -export const Button = { - render: (args: any) => ( - - Form Button - - ), - argTypes: sharedArgTypes, -}; - export const Textarea = { render: (args: any) => ( diff --git a/code/ui/components/src/components/form/index.tsx b/code/ui/components/src/components/form/index.tsx index 587a3abd0f2e..f35aef240b36 100644 --- a/code/ui/components/src/components/form/index.tsx +++ b/code/ui/components/src/components/form/index.tsx @@ -1,6 +1,7 @@ import { styled } from '@storybook/theming'; import { Field } from './field/field'; -import { Input, Select, Textarea, Button } from './input/input'; +import { Input, Select, Textarea } from './input/input'; +import { Button } from '../Button/Button'; export const Form = Object.assign( styled.form({ diff --git a/code/ui/components/src/components/form/input/input.tsx b/code/ui/components/src/components/form/input/input.tsx index 83d99e4d8a8d..15f647c7cdb2 100644 --- a/code/ui/components/src/components/form/input/input.tsx +++ b/code/ui/components/src/components/form/input/input.tsx @@ -1,4 +1,4 @@ -import type { FC, HTMLProps, SelectHTMLAttributes } from 'react'; +import type { HTMLProps, SelectHTMLAttributes } from 'react'; import React, { forwardRef } from 'react'; import type { Theme, CSSObject } from '@storybook/theming'; import { styled } from '@storybook/theming'; @@ -6,8 +6,6 @@ import { styled } from '@storybook/theming'; import type { TextareaAutosizeProps } from 'react-textarea-autosize'; import TextareaAutoResize from 'react-textarea-autosize'; -import { Button as StyledButton } from '../../Button/Button'; - const styleResets: CSSObject = { // resets appearance: 'none', @@ -205,41 +203,3 @@ export const Textarea = Object.assign( displayName: 'Textarea', } ); - -const ButtonStyled = styled( - forwardRef< - any, - { - size?: Sizes; - align?: Alignments; - valid?: ValidationStates; - height?: number; - } - >(function ButtonStyled({ size, valid, align, ...props }, ref) { - return ; - }) -)<{ - size?: Sizes; - align?: Alignments; - valid?: ValidationStates; - height?: number; -}>(sizes, validation, { - // Custom styling for color widget nested in buttons - userSelect: 'none', - overflow: 'visible', - zIndex: 2, - - // overrides the default hover from Button - '&:hover': { - transform: 'none', - }, -}); - -export const Button: FC = Object.assign( - forwardRef<{}, {}>(function Button(props, ref) { - return ; - }), - { - displayName: 'Button', - } -); diff --git a/code/ui/components/src/components/icon/icon.stories.tsx b/code/ui/components/src/components/icon/icon.stories.tsx index 8c6856b73158..d3da4af90ed1 100644 --- a/code/ui/components/src/components/icon/icon.stories.tsx +++ b/code/ui/components/src/components/icon/icon.stories.tsx @@ -2,9 +2,8 @@ import type { ComponentProps } from 'react'; import React from 'react'; import { styled, css } from '@storybook/theming'; -import { Icons } from './icon'; -import type { IconKey } from './icons'; -import { icons } from './icons'; +import type { IconType } from './icon'; +import { Icons, icons } from './icon'; const Meta = styled.div` color: #666; @@ -71,7 +70,7 @@ export const Labels = (args: ComponentProps) => ( {Object.keys(icons).map((key) => ( - + {key} ))} @@ -85,7 +84,7 @@ export const NoLabels = (args: ComponentProps) => ( {Object.keys(icons).map((key) => ( - + ))} diff --git a/code/ui/components/src/components/icon/icon.tsx b/code/ui/components/src/components/icon/icon.tsx index 30c235f995b9..28b78983b712 100644 --- a/code/ui/components/src/components/icon/icon.tsx +++ b/code/ui/components/src/components/icon/icon.tsx @@ -1,15 +1,17 @@ -import type { FunctionComponent, ComponentProps } from 'react'; +import type { ComponentProps, FC } from 'react'; import React, { memo } from 'react'; +import * as StorybookIcons from '@storybook/icons'; import { styled } from '@storybook/theming'; -import type { IconKey } from './icons'; -import { icons } from './icons'; +import { deprecate, logger } from '@storybook/client-logger'; + +export type IconType = keyof typeof icons; +type NewIconTypes = typeof icons[IconType]; const Svg = styled.svg` display: inline-block; shape-rendering: inherit; vertical-align: middle; fill: currentColor; - path { fill: currentColor; } @@ -18,22 +20,42 @@ const Svg = styled.svg` export interface IconsProps extends ComponentProps { icon: IconType; useSymbol?: boolean; + onClick?: () => void; } -export const Icons: FunctionComponent = ({ icon, useSymbol, ...props }: IconsProps) => { - return ( - - {useSymbol ? : icons[icon]} - +/** + * @deprecated No longer used, will be removed in Storybook 9.0 + * Please use the `@storybook/icons` package instead. + * */ +export const Icons: FC = ({ icon, useSymbol, ...props }: IconsProps) => { + deprecate( + `Use of the deprecated Icons ${ + `(${icon})` || '' + } component detected. Please use the @storybook/icons component directly. For more informations, see the migration notes at https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#icons-is-deprecated` ); -}; + const findIcon: NewIconTypes = icons[icon] || null; + if (!findIcon) { + logger.warn( + `Use of an unknown prop ${ + `(${icon})` || '' + } in the Icons component. The Icons component is deprecated. Please use the @storybook/icons component directly. For more informations, see the migration notes at https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#icons-is-deprecated` + ); + return null; + } + // TODO: Find a better way to type this component + const Icon: FC = (StorybookIcons as any)[findIcon]; -export type IconType = keyof typeof icons; + return ; +}; -export interface SymbolsProps extends ComponentProps { - icons?: IconKey[]; +export interface SymbolsProps { + icons?: IconType[]; } +/** + * @deprecated No longer used, will be removed in Storybook 9.0 + * Please use the `@storybook/icons` package instead. + * */ export const Symbols = memo(function Symbols({ icons: keys = Object.keys(icons) }) { return ( (function Symbols({ icons: keys = Objec style={{ position: 'absolute', width: 0, height: 0 }} data-chromatic="ignore" > - {keys.map((key: IconKey) => ( + {keys.map((key: IconType) => ( {icons[key]} @@ -49,3 +71,211 @@ export const Symbols = memo(function Symbols({ icons: keys = Objec ); }); + +export const icons = { + user: 'UserIcon', + useralt: 'UserAltIcon', + useradd: 'UserAddIcon', + users: 'UsersIcon', + profile: 'ProfileIcon', + facehappy: 'FaceHappyIcon', + faceneutral: 'FaceNeutralIcon', + facesad: 'FaceSadIcon', + accessibility: 'AccessibilityIcon', + accessibilityalt: 'AccessibilityAltIcon', + arrowup: 'ChevronUpIcon', + arrowdown: 'ChevronDownIcon', + arrowleft: 'ChevronLeftIcon', + arrowright: 'ChevronRightIcon', + arrowupalt: 'ArrowUpIcon', + arrowdownalt: 'ArrowDownIcon', + arrowleftalt: 'ArrowLeftIcon', + arrowrightalt: 'ArrowRightIcon', + expandalt: 'ExpandAltIcon', + collapse: 'CollapseIcon', + expand: 'ExpandIcon', + unfold: 'UnfoldIcon', + transfer: 'TransferIcon', + redirect: 'RedirectIcon', + undo: 'UndoIcon', + reply: 'ReplyIcon', + sync: 'SyncIcon', + upload: 'UploadIcon', + download: 'DownloadIcon', + back: 'BackIcon', + proceed: 'ProceedIcon', + refresh: 'RefreshIcon', + globe: 'GlobeIcon', + compass: 'CompassIcon', + location: 'LocationIcon', + pin: 'PinIcon', + time: 'TimeIcon', + dashboard: 'DashboardIcon', + timer: 'TimerIcon', + home: 'HomeIcon', + admin: 'AdminIcon', + info: 'InfoIcon', + question: 'QuestionIcon', + support: 'SupportIcon', + alert: 'AlertIcon', + email: 'EmailIcon', + phone: 'PhoneIcon', + link: 'LinkIcon', + unlink: 'LinkBrokenIcon', + bell: 'BellIcon', + rss: 'RSSIcon', + sharealt: 'ShareAltIcon', + share: 'ShareIcon', + circle: 'CircleIcon', + circlehollow: 'CircleHollowIcon', + bookmarkhollow: 'BookmarkHollowIcon', + bookmark: 'BookmarkIcon', + hearthollow: 'HeartHollowIcon', + heart: 'HeartIcon', + starhollow: 'StarHollowIcon', + star: 'StarIcon', + certificate: 'CertificateIcon', + verified: 'VerifiedIcon', + thumbsup: 'ThumbsUpIcon', + shield: 'ShieldIcon', + basket: 'BasketIcon', + beaker: 'BeakerIcon', + hourglass: 'HourglassIcon', + flag: 'FlagIcon', + cloudhollow: 'CloudHollowIcon', + edit: 'EditIcon', + cog: 'CogIcon', + nut: 'NutIcon', + wrench: 'WrenchIcon', + ellipsis: 'EllipsisIcon', + check: 'CheckIcon', + form: 'FormIcon', + batchdeny: 'BatchDenyIcon', + batchaccept: 'BatchAcceptIcon', + controls: 'ControlsIcon', + plus: 'PlusIcon', + closeAlt: 'CloseAltIcon', + cross: 'CrossIcon', + trash: 'TrashIcon', + pinalt: 'PinAltIcon', + unpin: 'UnpinIcon', + add: 'AddIcon', + subtract: 'SubtractIcon', + close: 'CloseIcon', + delete: 'DeleteIcon', + passed: 'PassedIcon', + changed: 'ChangedIcon', + failed: 'FailedIcon', + clear: 'ClearIcon', + comment: 'CommentIcon', + commentadd: 'CommentAddIcon', + requestchange: 'RequestChangeIcon', + comments: 'CommentsIcon', + lock: 'LockIcon', + unlock: 'UnlockIcon', + key: 'KeyIcon', + outbox: 'OutboxIcon', + credit: 'CreditIcon', + button: 'ButtonIcon', + type: 'TypeIcon', + pointerdefault: 'PointerDefaultIcon', + pointerhand: 'PointerHandIcon', + browser: 'BrowserIcon', + tablet: 'TabletIcon', + mobile: 'MobileIcon', + watch: 'WatchIcon', + sidebar: 'SidebarIcon', + sidebaralt: 'SidebarAltIcon', + sidebaralttoggle: 'SidebarAltToggleIcon', + sidebartoggle: 'SidebarToggleIcon', + bottombar: 'BottomBarIcon', + bottombartoggle: 'BottomBarToggleIcon', + cpu: 'CPUIcon', + database: 'DatabaseIcon', + memory: 'MemoryIcon', + structure: 'StructureIcon', + box: 'BoxIcon', + power: 'PowerIcon', + photo: 'PhotoIcon', + component: 'ComponentIcon', + grid: 'GridIcon', + outline: 'OutlineIcon', + photodrag: 'PhotoDragIcon', + search: 'SearchIcon', + zoom: 'ZoomIcon', + zoomout: 'ZoomOutIcon', + zoomreset: 'ZoomResetIcon', + eye: 'EyeIcon', + eyeclose: 'EyeCloseIcon', + lightning: 'LightningIcon', + lightningoff: 'LightningOffIcon', + contrast: 'ContrastIcon', + switchalt: 'SwitchAltIcon', + mirror: 'MirrorIcon', + grow: 'GrowIcon', + paintbrush: 'PaintBrushIcon', + ruler: 'RulerIcon', + stop: 'StopIcon', + camera: 'CameraIcon', + video: 'VideoIcon', + speaker: 'SpeakerIcon', + play: 'PlayIcon', + playback: 'PlayBackIcon', + playnext: 'PlayNextIcon', + rewind: 'RewindIcon', + fastforward: 'FastForwardIcon', + stopalt: 'StopAltIcon', + sidebyside: 'SideBySideIcon', + stacked: 'StackedIcon', + sun: 'SunIcon', + moon: 'MoonIcon', + book: 'BookIcon', + document: 'DocumentIcon', + copy: 'CopyIcon', + category: 'CategoryIcon', + folder: 'FolderIcon', + print: 'PrintIcon', + graphline: 'GraphLineIcon', + calendar: 'CalendarIcon', + graphbar: 'GraphBarIcon', + menu: 'MenuIcon', + menualt: 'MenuIcon', + filter: 'FilterIcon', + docchart: 'DocChartIcon', + doclist: 'DocListIcon', + markup: 'MarkupIcon', + bold: 'BoldIcon', + paperclip: 'PaperClipIcon', + listordered: 'ListOrderedIcon', + listunordered: 'ListUnorderedIcon', + paragraph: 'ParagraphIcon', + markdown: 'MarkdownIcon', + repository: 'RepoIcon', + commit: 'CommitIcon', + branch: 'BranchIcon', + pullrequest: 'PullRequestIcon', + merge: 'MergeIcon', + apple: 'AppleIcon', + linux: 'LinuxIcon', + ubuntu: 'UbuntuIcon', + windows: 'WindowsIcon', + storybook: 'StorybookIcon', + azuredevops: 'AzureDevOpsIcon', + bitbucket: 'BitbucketIcon', + chrome: 'ChromeIcon', + chromatic: 'ChromaticIcon', + componentdriven: 'ComponentDrivenIcon', + discord: 'DiscordIcon', + facebook: 'FacebookIcon', + figma: 'FigmaIcon', + gdrive: 'GDriveIcon', + github: 'GithubIcon', + gitlab: 'GitlabIcon', + google: 'GoogleIcon', + graphql: 'GraphqlIcon', + medium: 'MediumIcon', + redux: 'ReduxIcon', + twitter: 'TwitterIcon', + youtube: 'YoutubeIcon', + vscode: 'VSCodeIcon', +} as const; diff --git a/code/ui/components/src/components/icon/icons.tsx b/code/ui/components/src/components/icon/icons.tsx deleted file mode 100644 index ed235f5cd672..000000000000 --- a/code/ui/components/src/components/icon/icons.tsx +++ /dev/null @@ -1,1463 +0,0 @@ -import React from 'react'; - -// Icon paths -export const icons = { - user: ( - <> - - - ), - useralt: ( - <> - - - ), - useradd: ( - <> - - - ), - users: ( - <> - - - - ), - profile: ( - <> - - - - ), - facehappy: ( - <> - - - - ), - faceneutral: ( - <> - - - - ), - facesad: ( - <> - - - - ), - accessibility: ( - <> - - - - - ), - accessibilityalt: ( - <> - - - ), - arrowup: ( - <> - - - ), - arrowdown: ( - <> - - - ), - arrowleft: ( - <> - - - ), - arrowright: ( - <> - - - ), - arrowupalt: ( - <> - - - ), - arrowdownalt: ( - <> - - - ), - arrowleftalt: ( - <> - - - ), - arrowrightalt: ( - <> - - - ), - expandalt: ( - <> - - - ), - collapse: ( - <> - - - ), - expand: ( - <> - - - ), - unfold: ( - <> - - - - - ), - transfer: ( - <> - - - ), - redirect: ( - <> - - - ), - undo: ( - <> - - - ), - reply: ( - <> - - - ), - sync: ( - <> - - - ), - upload: ( - <> - - - - ), - download: ( - <> - - - - ), - back: ( - <> - - - - ), - proceed: ( - <> - - - - ), - refresh: ( - <> - - - ), - globe: ( - <> - - - ), - compass: ( - <> - - - - ), - location: ( - <> - - - ), - pin: ( - <> - - - - ), - time: ( - <> - - - - ), - dashboard: ( - <> - - - - ), - timer: ( - <> - - - - ), - home: ( - <> - - - ), - admin: ( - <> - - - - ), - info: ( - <> - - - - ), - question: ( - <> - - - - ), - support: ( - <> - - - ), - alert: ( - <> - - - - ), - email: ( - <> - - - ), - phone: ( - <> - - - ), - link: ( - <> - - - - ), - unlink: ( - <> - - - ), - bell: ( - <> - - - ), - rss: ( - <> - - - - - ), - sharealt: ( - <> - - - - ), - share: ( - <> - - - - ), - circlehollow: ( - <> - - - ), - circle: , - bookmarkhollow: ( - <> - - - ), - bookmark: ( - <> - - - ), - hearthollow: ( - <> - - - ), - heart: ( - <> - - - ), - starhollow: ( - <> - - - ), - star: ( - <> - - - ), - certificate: ( - <> - - - ), - verified: ( - <> - - - ), - thumbsup: ( - <> - - - ), - shield: ( - <> - - - ), - basket: ( - <> - - - - - ), - beaker: ( - <> - - - ), - hourglass: ( - <> - - - - ), - flag: ( - <> - - - ), - cloudhollow: ( - <> - - - ), - cloud: , - edit: ( - <> - - - ), - cog: ( - <> - - - - ), - nut: ( - <> - - - - ), - wrench: ( - <> - - - ), - ellipsis: ( - <> - - - ), - check: ( - <> - - - ), - form: ( - <> - - - - ), - batchdeny: ( - <> - - - ), - batchaccept: ( - <> - - - ), - controls: ( - <> - - - ), - plus: ( - <> - - - ), - closeAlt: ( - <> - - - ), - cross: ( - <> - - - ), - trash: ( - <> - - - - ), - pinalt: ( - <> - - - ), - unpin: ( - <> - - - ), - add: ( - <> - - - - ), - subtract: ( - <> - - - - ), - close: ( - <> - - - - ), - delete: ( - <> - - - ), - passed: ( - <> - - - ), - changed: ( - <> - - - ), - failed: ( - <> - - - ), - clear: ( - <> - - - ), - comment: ( - <> - - - - ), - commentadd: ( - <> - - - - ), - requestchange: ( - <> - - - - ), - comments: ( - <> - - - - ), - lock: ( - <> - - - - ), - unlock: ( - <> - - - - ), - key: ( - <> - - - - ), - outbox: ( - <> - - - - ), - credit: ( - <> - - - - ), - button: ( - <> - - - - ), - type: ( - <> - - - - ), - pointerdefault: ( - <> - - - ), - pointerhand: ( - <> - - - ), - browser: ( - <> - - - ), - tablet: ( - <> - - - ), - mobile: ( - <> - - - ), - watch: ( - <> - - - ), - sidebar: ( - <> - - - - ), - sidebaralt: ( - <> - - - - ), - sidebaralttoggle: ( - <> - - - - ), - sidebartoggle: ( - <> - - - - ), - bottombar: ( - <> - - - - ), - bottombartoggle: ( - <> - - - - ), - cpu: ( - <> - - - - ), - database: ( - <> - - - ), - memory: ( - <> - - - - ), - structure: ( - <> - - - ), - box: ( - <> - - - ), - power: ( - <> - - - - ), - photo: ( - <> - - - - ), - component: ( - <> - - - ), - grid: ( - <> - - - ), - outline: ( - <> - - - ), - photodrag: ( - <> - - - - - ), - search: ( - <> - - - ), - zoom: ( - <> - - - - ), - zoomout: ( - <> - - - - ), - zoomreset: ( - <> - - - ), - eye: ( - <> - - - - ), - eyeclose: ( - <> - - - - ), - lightning: ( - <> - - - ), - lightningoff: ( - <> - - - ), - contrast: ( - <> - - - ), - switchalt: ( - <> - - - ), - mirror: ( - <> - - - ), - grow: ( - <> - - - - - ), - paintbrush: ( - <> - - - ), - ruler: ( - <> - - - - ), - stop: ( - <> - - - - ), - camera: ( - <> - - - - ), - video: ( - <> - - - - ), - speaker: ( - <> - - - - - ), - play: ( - <> - - - ), - playback: ( - <> - - - ), - playnext: ( - <> - - - ), - rewind: ( - <> - - - ), - fastforward: ( - <> - - - ), - stopalt: ( - <> - - - ), - sidebyside: ( - <> - - - ), - stacked: ( - <> - - - ), - sun: ( - <> - - - - - ), - moon: ( - <> - - - ), - book: ( - <> - - - ), - document: ( - <> - - - - ), - copy: ( - <> - - - ), - category: ( - <> - - - - ), - folder: ( - <> - - - ), - print: ( - <> - - - - ), - graphline: ( - <> - - - - ), - calendar: ( - <> - - - ), - graphbar: ( - <> - - - ), - menu: ( - <> - - - ), - menualt: ( - <> - - - ), - filter: ( - <> - - - ), - docchart: ( - <> - - - ), - doclist: ( - <> - - - - ), - markup: ( - <> - - - ), - bold: ( - <> - - - ), - italic: , - paperclip: ( - <> - - - ), - listordered: ( - <> - - - ), - listunordered: ( - <> - - - ), - paragraph: ( - <> - - - ), - markdown: ( - <> - - - - ), - repository: ( - <> - - - - - - ), - commit: ( - <> - - - ), - branch: ( - <> - - - ), - pullrequest: ( - <> - - - ), - merge: ( - <> - - - ), - apple: ( - <> - - - ), - linux: ( - <> - - - ), - ubuntu: ( - <> - - - ), - windows: ( - <> - - - ), - storybook: ( - <> - - - ), - azuredevops: ( - <> - - - ), - bitbucket: ( - <> - - - ), - chrome: ( - <> - - - ), - chromatic: ( - <> - - - ), - componentdriven: ( - <> - - - ), - discord: ( - <> - - - ), - facebook: ( - <> - - - ), - figma: ( - <> - - - ), - gdrive: ( - <> - - - ), - github: ( - <> - - - ), - gitlab: ( - <> - - - ), - google: ( - <> - - - ), - graphql: ( - <> - - - ), - medium: ( - <> - - - ), - redux: ( - <> - - - ), - twitter: ( - <> - - - ), - youtube: ( - <> - - - ), - vscode: ( - <> - - - ), -} as const; - -export type IconKey = keyof typeof icons; diff --git a/code/ui/components/src/components/icon/svg.tsx b/code/ui/components/src/components/icon/svg.tsx deleted file mode 100644 index 3e2eb66254c5..000000000000 --- a/code/ui/components/src/components/icon/svg.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { styled } from '@storybook/theming'; - -interface SvgProps { - inline?: boolean; -} - -const Svg = styled.svg( - { - // Fix rendering bugs in Chrome for hdpi - shapeRendering: 'inherit', - transform: 'translate3d(0,0,0)', - }, - ({ inline }) => - inline - ? { - display: 'inline-block', - } - : { - display: 'block', - } -); -Svg.displayName = 'Svg'; - -export { Svg as default }; diff --git a/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.stories.tsx b/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.stories.tsx index 12d76391f6cf..06f2a3a2cb43 100644 --- a/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.stories.tsx +++ b/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.stories.tsx @@ -179,36 +179,34 @@ export const UnsupportedDark = { export const Story = { args: { language: 'jsx', - children: `import React from 'react'; - import { storiesOf } from '@storybook/react'; - import { styled } from '@storybook/theming'; - - import Heading from './heading'; - - const Holder = styled.div({ - margin: 10, - border: '1px dashed deepskyblue', - // overflow: 'hidden', - }); - - storiesOf('Basics|Heading', module).add('types', () => ( -

- - DEFAULT WITH ALL CAPS - - - THIS LONG DEFAULT WITH ALL CAPS & SUB - - - page type - - - - page type - - -
- ));`, + children: `import type { Meta, StoryObj } from '@storybook/react'; + + import { Header } from './Header'; + + const meta = { + title: 'Example/Header', + component: Header, + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/react/writing-docs/autodocs + tags: ['autodocs'], + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/react/configure/story-layout + layout: 'fullscreen', + }, + } satisfies Meta; + + export default meta; + type Story = StoryObj; + + export const LoggedIn: Story = { + args: { + user: { + name: 'Jane Doe', + }, + }, + }; + + export const LoggedOut: Story = {}; + `, }, }; diff --git a/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.tsx b/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.tsx index 00c5b6629cb1..0c0661aecebf 100644 --- a/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.tsx +++ b/code/ui/components/src/components/syntaxhighlighter/syntaxhighlighter.tsx @@ -100,10 +100,7 @@ const Wrapper = styled.div( : {} ); -const UnstyledScroller: FC> = ({ - children, - className, -}): JSX.Element => ( +const UnstyledScroller: FC> = ({ children, className }) => ( {children} @@ -135,6 +132,7 @@ const Code = styled.div(({ theme }) => ({ paddingLeft: 2, // TODO: To match theming/global.ts for now paddingRight: theme.layoutMargin, opacity: 1, + fontFamily: theme.typography.fonts.mono, })); const processLineNumber = (row: any) => { diff --git a/code/ui/components/src/components/tabs/tabs.helpers.tsx b/code/ui/components/src/components/tabs/tabs.helpers.tsx index fe41cc47be91..b64b548d3f9c 100644 --- a/code/ui/components/src/components/tabs/tabs.helpers.tsx +++ b/code/ui/components/src/components/tabs/tabs.helpers.tsx @@ -1,5 +1,5 @@ import { styled } from '@storybook/theming'; -import type { FC, ReactChild, ReactElement, ReactNode } from 'react'; +import type { FC, PropsWithChildren, ReactChild, ReactElement, ReactNode } from 'react'; import React, { Children } from 'react'; import type { Addon_RenderOptions } from '@storybook/types'; import type { TabsProps } from './tabs'; @@ -17,16 +17,18 @@ export const childrenToList = (children: TabsProps['children']) => ({ props: { title, id, color, children: childrenOfChild }, }: ReactElement<{ - children: FC | ReactChild | null; + children: FC | ReactChild | null; title: ReactChild | null | FC; id: string; color?: string; }>) => { - const content: FC | ReactNode = Array.isArray(childrenOfChild) + const content: FC | ReactNode = Array.isArray( + childrenOfChild + ) ? childrenOfChild[0] : childrenOfChild; - const render: FC = ( + const render: FC = ( typeof content === 'function' ? content : ({ active }) => ( @@ -34,7 +36,7 @@ export const childrenToList = (children: TabsProps['children']) => {content} ) - ) as FC; + ) as FC; return { title, id, diff --git a/code/ui/components/src/components/tabs/tabs.hooks.tsx b/code/ui/components/src/components/tabs/tabs.hooks.tsx index 0afb81ea9186..f5fbd7272fe6 100644 --- a/code/ui/components/src/components/tabs/tabs.hooks.tsx +++ b/code/ui/components/src/components/tabs/tabs.hooks.tsx @@ -115,6 +115,7 @@ export function useList(list: ChildrenListComplete) { textColor={color} role="tab" > + {/* @ts-expect-error (we know this is broken) */} {title} ); diff --git a/code/ui/components/src/components/tabs/tabs.stories.tsx b/code/ui/components/src/components/tabs/tabs.stories.tsx index cac0a76b4deb..b6a28dbd5119 100644 --- a/code/ui/components/src/components/tabs/tabs.stories.tsx +++ b/code/ui/components/src/components/tabs/tabs.stories.tsx @@ -10,10 +10,10 @@ import { userEvent, findByText, } from '@storybook/testing-library'; +import { CPUIcon, MemoryIcon } from '@storybook/icons'; import { Tabs, TabsState, TabWrapper } from './tabs'; import type { ChildrenList } from './tabs.helpers'; -import { IconButton } from '../bar/button'; -import { Icons } from '../icon/icon'; +import { IconButton } from '../IconButton/IconButton'; const colours = Array.from(new Array(15), (val, index) => index).map((i) => Math.floor((1 / 15) * i * 16777215) @@ -99,6 +99,7 @@ const onSelect = action('onSelect'); const content = Object.entries(panels).map(([k, v]) => (
+ {/* @ts-expect-error (we know this is broken) */} {v.render}
)); @@ -116,8 +117,9 @@ export const StatefulStatic = { render: (args) => (
- {({ active, selected }: { active: boolean; selected: string }) => - active ?
{selected} is selected
: null + { + (({ active, selected }: { active: boolean; selected: string }) => + active ?
{selected} is selected
: null) as any }
@@ -132,8 +134,9 @@ export const StatefulStaticWithSetButtonTextColors = {
- {({ active, selected }: { active: boolean; selected: string }) => - active ?
{selected} is selected
: null + { + (({ active, selected }: { active: boolean; selected: string }) => + active ?
{selected} is selected
: null) as any }
@@ -149,8 +152,9 @@ export const StatefulStaticWithSetBackgroundColor = {
- {({ active, selected }: { active: boolean; selected: string }) => - active ?
{selected} is selected
: null + { + (({ active, selected }: { active: boolean; selected: string }) => + active ?
{selected} is selected
: null) as any }
@@ -207,6 +211,7 @@ export const StatefulDynamicWithOpenTooltip = { {Object.entries(panels).map(([k, v]) => (
+ {/* @ts-expect-error (we know this is broken) */} {v.render}
))} @@ -235,6 +240,7 @@ export const StatefulDynamicWithSelectedAddon = { {Object.entries(panels).map(([k, v]) => (
+ {/* @ts-expect-error (we know this is broken) */} {v.render}
))} @@ -275,10 +281,10 @@ export const StatelessWithTools = { tools={ - + - + } diff --git a/code/ui/components/src/components/tabs/tabs.tsx b/code/ui/components/src/components/tabs/tabs.tsx index c8a18bf29c06..0e3484eab4ba 100644 --- a/code/ui/components/src/components/tabs/tabs.tsx +++ b/code/ui/components/src/components/tabs/tabs.tsx @@ -1,4 +1,4 @@ -import type { FC, MouseEvent, ReactElement, ReactNode } from 'react'; +import type { FC, PropsWithChildren, ReactElement, ReactNode, SyntheticEvent } from 'react'; import React, { useMemo, Component, Fragment, memo } from 'react'; import { styled } from '@storybook/theming'; import { sanitize } from '@storybook/csf'; @@ -102,7 +102,7 @@ const Content = styled.div( export interface TabWrapperProps { active: boolean; - render?: () => JSX.Element; + render?: () => ReactElement; children?: ReactNode; } @@ -114,8 +114,8 @@ export const panelProps = {}; export interface TabsProps { children?: ReactElement<{ - children: FC; - title: ReactNode | FC; + children: FC; + title: ReactNode | FC; }>[]; id?: string; tools?: ReactNode; @@ -141,14 +141,18 @@ export const Tabs: FC = memo( id: htmlId, menuName, }) => { - const idList = childrenToList(children).map((i) => i.id); + const idList = childrenToList(children) + .map((i) => i.id) + .join(','); + const list = useMemo( () => childrenToList(children).map((i, index) => ({ ...i, active: selected ? i.id === selected : index === 0, })), - [selected, ...idList] + // eslint-disable-next-line react-hooks/exhaustive-deps -- we're using idList as a replacement for children + [selected, idList] ); const { visibleList, tabBarRef, tabRefs, AddonTab } = useList(list); @@ -171,7 +175,7 @@ export const Tabs: FC = memo( key={id} active={active} textColor={color} - onClick={(e: MouseEvent) => { + onClick={(e: SyntheticEvent) => { e.preventDefault(); actions.onSelect(id); }} diff --git a/code/ui/components/src/components/tooltip/ListItem.stories.tsx b/code/ui/components/src/components/tooltip/ListItem.stories.tsx index 8ffeaf322516..ab68b8444ba8 100644 --- a/code/ui/components/src/components/tooltip/ListItem.stories.tsx +++ b/code/ui/components/src/components/tooltip/ListItem.stories.tsx @@ -1,6 +1,6 @@ import React, { Fragment } from 'react'; +import { EyeIcon } from '@storybook/icons'; import ListItem from './ListItem'; -import { Icons } from '../icon/icon'; export default { component: ListItem, @@ -11,17 +11,11 @@ export const All = {
- } /> - - - } - /> - + } /> + + + } /> +
), }; @@ -41,28 +35,28 @@ export const Loading = { export const DefaultIcon = { args: { title: 'Default icon', - right: , + right: , }, }; export const ActiveIcon = { args: { title: 'Active icon', active: true, - right: , + right: , }, }; export const ActiveIconLeft = { args: { title: 'Active icon', active: true, - left: , + icon: , }, }; export const ActiveIconLeftColored = { args: { title: 'Active icon', active: true, - left: ( + icon: ( ( ({ active, theme }) => active ? { - '& svg': { - opacity: 1, - }, - '& svg path:not([fill])': { - fill: theme.color.secondary, - }, + color: theme.color.secondary, } : {}, () => ({ @@ -181,15 +174,10 @@ export type LinkWrapperType = FC; export interface ListItemProps extends Omit, 'href' | 'title'> { loading?: boolean; - /** - * @deprecated This property will be removed in SB 8.0 - * Use `icon` property instead. - */ - left?: ReactNode; title?: ReactNode; center?: ReactNode; right?: ReactNode; - icon?: keyof typeof icons | ReactElement; + icon?: ReactNode; active?: boolean; disabled?: boolean; href?: string; @@ -199,7 +187,6 @@ export interface ListItemProps extends Omit, 'href' const ListItem: FC = ({ loading, - left, title, center, right, @@ -215,17 +202,11 @@ const ListItem: FC = ({ const itemProps = getItemProps(onClick, href, LinkWrapper); const commonProps = { active, disabled }; - const isStorybookIcon = typeof icon === 'string' && icons[icon]; - return ( - {icon ? ( - {isStorybookIcon ? : icon} - ) : ( - left && {left} - )} + {icon && {icon}} {title || center ? ( -
+
{title && ( {title} @@ -241,7 +222,6 @@ const ListItem: FC<ListItemProps> = ({ ListItem.defaultProps = { loading: false, - left: null, title: <span>Loading state</span>, center: null, right: null, diff --git a/code/ui/components/src/components/tooltip/TooltipLinkList.stories.tsx b/code/ui/components/src/components/tooltip/TooltipLinkList.stories.tsx index 3691e91239af..84186de35444 100644 --- a/code/ui/components/src/components/tooltip/TooltipLinkList.stories.tsx +++ b/code/ui/components/src/components/tooltip/TooltipLinkList.stories.tsx @@ -1,10 +1,10 @@ -import type { FunctionComponent, MouseEvent, ReactElement } from 'react'; +import type { FunctionComponent, MouseEvent, PropsWithChildren, ReactElement } from 'react'; import React, { Children, cloneElement } from 'react'; import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; +import { LinkIcon, LinuxIcon } from '@storybook/icons'; import { WithTooltip } from './WithTooltip'; import { TooltipLinkList } from './TooltipLinkList'; -import { Icons } from '../icon/icon'; import ellipseUrl from './assets/ellipse.png'; const onLinkClick = action('onLinkClick'); @@ -14,7 +14,7 @@ interface StoryLinkWrapperProps { passHref?: boolean; } -const StoryLinkWrapper: FunctionComponent<StoryLinkWrapperProps> = ({ +const StoryLinkWrapper: FunctionComponent<PropsWithChildren<StoryLinkWrapperProps>> = ({ href, passHref = false, children, @@ -76,7 +76,7 @@ export const WithOneIcon = { id: '1', title: 'Link 1', center: 'This is an addition description', - icon: 'link', + icon: <LinkIcon />, href: 'http://google.com', }, { @@ -117,7 +117,7 @@ export const ActiveWithSeparateIcon = { { id: '1', title: 'Link 1', - icon: 'link', + icon: <LinkIcon />, center: 'This is an addition description', href: 'http://google.com', }, @@ -140,7 +140,7 @@ export const ActiveAndIcon = { id: '1', title: 'Link 1', active: true, - icon: 'link', + icon: <LinkIcon />, center: 'This is an addition description', href: 'http://google.com', }, @@ -162,7 +162,7 @@ export const WithIllustration = { id: '1', title: 'Link 1', active: true, - icon: 'link', + icon: <LinkIcon />, right: <img src={ellipseUrl} width="16" height="16" alt="ellipse" />, center: 'This is an addition description', href: 'http://google.com', @@ -186,7 +186,7 @@ export const WithCustomIcon = { id: '1', title: 'Link 1', active: true, - icon: <Icons icon="linux" />, + icon: <LinuxIcon />, right: <img src={ellipseUrl} width="16" height="16" alt="ellipse" />, center: 'This is an addition description', href: 'http://google.com', diff --git a/code/ui/components/src/components/tooltip/TooltipLinkList.tsx b/code/ui/components/src/components/tooltip/TooltipLinkList.tsx index 2311ca458a5c..347e6d291789 100644 --- a/code/ui/components/src/components/tooltip/TooltipLinkList.tsx +++ b/code/ui/components/src/components/tooltip/TooltipLinkList.tsx @@ -55,16 +55,11 @@ const Item: FC<Link & { isIndented?: boolean }> = (props) => { }; export const TooltipLinkList: FC<TooltipLinkListProps> = ({ links, LinkWrapper }) => { - const hasOneLeftElement = links.some((link) => link.left || link.icon); + const hasIcon = links.some((link) => link.icon); return ( <List> {links.map(({ isGatsby, ...p }) => ( - <Item - key={p.id} - LinkWrapper={isGatsby ? LinkWrapper : null} - isIndented={hasOneLeftElement} - {...p} - /> + <Item key={p.id} LinkWrapper={isGatsby ? LinkWrapper : null} isIndented={hasIcon} {...p} /> ))} </List> ); diff --git a/code/ui/components/src/components/typography/link/link.stories.tsx b/code/ui/components/src/components/typography/link/link.stories.tsx index 7df61e61995f..0ee21b793143 100644 --- a/code/ui/components/src/components/typography/link/link.stories.tsx +++ b/code/ui/components/src/components/typography/link/link.stories.tsx @@ -1,8 +1,8 @@ import type { ComponentProps } from 'react'; import React from 'react'; import { action } from '@storybook/addon-actions'; +import { DiscordIcon, SidebarIcon } from '@storybook/icons'; import { Link } from './link'; -import { Icons } from '../../icon/icon'; const onClick = action('onClick'); @@ -64,13 +64,13 @@ export const StyledLinks = { </Link> <br /> <Link href="http://google.com" {...args}> - <Icons icon="discord" /> + <DiscordIcon /> With icon in front </Link> <br /> <Link title="Toggle sidebar" containsIcon href="http://google.com" {...args}> {/* A linked icon by itself */} - <Icons icon="sidebar" /> + <SidebarIcon /> </Link> <br /> <Link containsIcon withArrow href="http://google.com" {...args}> diff --git a/code/ui/components/src/components/typography/link/link.test.tsx b/code/ui/components/src/components/typography/link/link.test.tsx index 8c909ab48cad..007a0ab3d374 100644 --- a/code/ui/components/src/components/typography/link/link.test.tsx +++ b/code/ui/components/src/components/typography/link/link.test.tsx @@ -6,10 +6,6 @@ import { ThemeProvider, themes, convert } from '@storybook/theming'; import type { LinkProps } from './link'; import { Link } from './link'; -const LEFT_BUTTON = 0; -const MIDDLE_BUTTON = 1; -const RIGHT_BUTTON = 2; - function ThemedLink(props: LinkProps & AnchorHTMLAttributes<HTMLAnchorElement>) { return ( <ThemeProvider theme={convert(themes.light)}> @@ -18,54 +14,67 @@ function ThemedLink(props: LinkProps & AnchorHTMLAttributes<HTMLAnchorElement>) ); } +async function click(target: Element, button: string, modifier?: string) { + const user = userEvent.setup(); + if (modifier) { + // Trailing > means to leave it pressed + await user.keyboard(`{${modifier}>}`); + } + await user.pointer([{ target }, { keys: `[${button}]`, target }]); + if (modifier) { + // Leading / means to release it + await user.keyboard(`{/${modifier}}`); + } +} + describe('Link', () => { describe('events', () => { - it('should call onClick on a plain left click', () => { + it('should call onClick on a plain left click', async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { button: LEFT_BUTTON }); + await click(screen.getByText('Content'), 'MouseLeft'); expect(handleClick).toHaveBeenCalled(); }); - it("shouldn't call onClick on a middle click", () => { + it("shouldn't call onClick on a middle click", async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { button: MIDDLE_BUTTON }); + await click(screen.getByText('Content'), 'MouseMiddle'); expect(handleClick).not.toHaveBeenCalled(); }); - it("shouldn't call onClick on a right click", () => { + it("shouldn't call onClick on a right click", async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { button: RIGHT_BUTTON }); + await click(screen.getByText('Content'), 'MouseRight'); expect(handleClick).not.toHaveBeenCalled(); }); - it("shouldn't call onClick on alt+click", () => { + it("shouldn't call onClick on alt+click", async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { altKey: true }); + await click(screen.getByText('Content'), 'MouseLeft', 'Alt'); expect(handleClick).not.toHaveBeenCalled(); }); - it("shouldn't call onClick on ctrl+click", () => { + it("shouldn't call onClick on ctrl+click", async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { ctrlKey: true }); + await click(screen.getByText('Content'), 'MouseLeft', 'Control'); expect(handleClick).not.toHaveBeenCalled(); }); - it("shouldn't call onClick on cmd+click / win+click", () => { + it("shouldn't call onClick on cmd+click / win+click", async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { metaKey: true }); + await click(screen.getByText('Content'), 'MouseLeft', 'Meta'); expect(handleClick).not.toHaveBeenCalled(); }); - it("shouldn't call onClick on shift+click", () => { + it("shouldn't call onClick on shift+click", async () => { const handleClick = jest.fn(); render(<ThemedLink onClick={handleClick}>Content</ThemedLink>); - userEvent.click(screen.getByText('Content'), { shiftKey: true }); + await click(screen.getByText('Content'), 'MouseLeft', 'Shift'); expect(handleClick).not.toHaveBeenCalled(); }); }); diff --git a/code/ui/components/src/components/typography/link/link.tsx b/code/ui/components/src/components/typography/link/link.tsx index 193fca15e976..fb26a03a0df4 100644 --- a/code/ui/components/src/components/typography/link/link.tsx +++ b/code/ui/components/src/components/typography/link/link.tsx @@ -2,8 +2,7 @@ import type { AnchorHTMLAttributes, FC, MouseEvent } from 'react'; import React from 'react'; import { styled } from '@storybook/theming'; import { darken } from 'polished'; - -import { Icons } from '../../icon/icon'; +import { ChevronRightIcon } from '@storybook/icons'; // Cmd/Ctrl/Shift/Alt + Click should trigger default browser behavior. Same applies to non-left clicks const LEFT_BUTTON = 0; @@ -200,7 +199,7 @@ export const Link: FC<LinkProps & AProps> = ({ > <LinkInner withArrow={withArrow} containsIcon={containsIcon}> {children} - {withArrow && <Icons icon="arrowright" />} + {withArrow && <ChevronRightIcon />} </LinkInner> </A> ); diff --git a/code/ui/components/src/index.ts b/code/ui/components/src/index.ts index 44934fc3ad00..e134b5e5bf02 100644 --- a/code/ui/components/src/index.ts +++ b/code/ui/components/src/index.ts @@ -50,6 +50,7 @@ export { ErrorFormatter } from './components/ErrorFormatter/ErrorFormatter'; // Forms export { Button } from './components/Button/Button'; +export { IconButton } from './components/IconButton/IconButton'; export { Form } from './components/form/index'; // Tooltips @@ -64,7 +65,7 @@ export { default as ListItem } from './components/tooltip/ListItem'; // Toolbar and subcomponents export { Tabs, TabsState, TabBar, TabWrapper } from './components/tabs/tabs'; -export { IconButton, IconButtonSkeleton, TabButton } from './components/bar/button'; +export { IconButtonSkeleton, TabButton } from './components/bar/button'; export { Separator, interleaveSeparators } from './components/bar/separator'; export { Bar, FlexBar } from './components/bar/bar'; export { AddonPanel } from './components/addon-panel/addon-panel'; @@ -72,7 +73,7 @@ export { AddonPanel } from './components/addon-panel/addon-panel'; // Graphics export type { IconsProps } from './components/icon/icon'; export { Icons, Symbols } from './components/icon/icon'; -export { icons } from './components/icon/icons'; +export { icons } from './components/icon/icon'; export { StorybookLogo } from './components/brand/StorybookLogo'; export { StorybookIcon } from './components/brand/StorybookIcon'; diff --git a/code/ui/manager/package.json b/code/ui/manager/package.json index 4a203b75f2d4..03c299260ecc 100644 --- a/code/ui/manager/package.json +++ b/code/ui/manager/package.json @@ -74,18 +74,19 @@ "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", "@storybook/addon-designs": "^7.0.4", - "@storybook/addons": "workspace:*", "@storybook/channels": "workspace:*", "@storybook/client-logger": "workspace:*", "@storybook/components": "workspace:*", "@storybook/core-events": "workspace:*", "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.1", "@storybook/manager-api": "workspace:*", "@storybook/router": "workspace:*", "@storybook/test": "workspace:*", "@storybook/theming": "workspace:*", "@storybook/types": "workspace:*", "@testing-library/react": "^11.2.2", + "@types/react-transition-group": "^4", "@types/semver": "^7.3.4", "browser-dtector": "^3.4.0", "copy-to-clipboard": "^3.3.1", @@ -97,16 +98,17 @@ "memoizerific": "^1.11.3", "polished": "^4.2.2", "qs": "^6.10.0", - "react": "^16.14.0", - "react-dom": "^16.8.0", - "react-draggable": "^4.4.3", - "react-helmet-async": "^1.0.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-draggable": "^4.4.5", + "react-helmet-async": "^1.3.0", "react-resize-detector": "^7.1.2", + "react-transition-group": "^4.4.5", "resolve-from": "^5.0.0", "semver": "^7.3.7", "store2": "^2.14.2", "ts-dedent": "^2.0.0", - "typescript": "~4.9.3" + "typescript": "^5.3.2" }, "publishConfig": { "access": "public" @@ -115,7 +117,8 @@ "pre": "./scripts/generate-exports-file.ts", "browserEntries": [ "./src/index.tsx", - "./src/runtime.ts" + "./src/runtime.ts", + "./src/globals-runtime.ts" ], "nodeEntries": [ "./src/globals.ts", diff --git a/code/ui/manager/paths.js b/code/ui/manager/paths.js index 0ad1bef88de3..b259dd1b1881 100644 --- a/code/ui/manager/paths.js +++ b/code/ui/manager/paths.js @@ -6,7 +6,6 @@ const resolve = resolveFrom.bind(null, __dirname); // These paths need to be aliased in the manager webpack config to ensure that all // code running inside the manager uses the *same* version of react[-dom] that we use. module.exports = { - '@storybook/addons': dirname(resolve('@storybook/addons/package.json')), '@storybook/channels': dirname(resolve('@storybook/channels/package.json')), '@storybook/components': dirname(resolve('@storybook/components/package.json')), '@storybook/core-events': dirname(resolve('@storybook/core-events/package.json')), diff --git a/code/ui/manager/src/App.tsx b/code/ui/manager/src/App.tsx new file mode 100644 index 000000000000..394016ff5708 --- /dev/null +++ b/code/ui/manager/src/App.tsx @@ -0,0 +1,43 @@ +import type { ComponentProps } from 'react'; +import React from 'react'; + +import { Route } from '@storybook/router'; + +import { Global, createGlobal } from '@storybook/theming'; +import type { Addon_PageType } from '@storybook/types'; +import Sidebar from './container/Sidebar'; +import Preview from './container/Preview'; +import Panel from './container/Panel'; + +import { Layout } from './components/layout/Layout'; +import { useLayout } from './components/layout/LayoutProvider'; + +type Props = { + managerLayoutState: ComponentProps<typeof Layout>['managerLayoutState']; + setManagerLayoutState: ComponentProps<typeof Layout>['setManagerLayoutState']; + pages: Addon_PageType[]; +}; + +export const App = ({ managerLayoutState, setManagerLayoutState, pages }: Props) => { + const { setMobileAboutOpen } = useLayout(); + + return ( + <> + <Global styles={createGlobal} /> + <Layout + managerLayoutState={managerLayoutState} + setManagerLayoutState={setManagerLayoutState} + slotMain={ + <Route path={/(^\/story|docs|onboarding\/|^\/$)/} hideOnly> + <Preview id="main" withLoader /> + </Route> + } + slotSidebar={<Sidebar onMenuClick={() => setMobileAboutOpen((state) => !state)} />} + slotPanel={<Panel />} + slotPages={pages.map(({ id, render: Content }) => ( + <Content key={id} /> + ))} + /> + </> + ); +}; diff --git a/code/ui/manager/src/app.stories.tsx b/code/ui/manager/src/app.stories.tsx deleted file mode 100644 index aef6a9133aa0..000000000000 --- a/code/ui/manager/src/app.stories.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import React, { useEffect } from 'react'; - -import { useStorybookApi, Provider as ManagerProvider } from '@storybook/manager-api'; -import { BaseLocationProvider } from '@storybook/router'; -import { HelmetProvider } from 'react-helmet-async'; -import { styled } from '@storybook/theming'; -import App from './app'; -import { FakeProvider, PrettyFakeProvider } from './FakeProvider'; - -export default { - component: App, - parameters: { - layout: 'fullscreen', - theme: 'light', - viewport: { - viewports: { - tablet: { - name: 'Tablet', - styles: { - height: '1112px', - width: '834px', - }, - type: 'tablet', - }, - }, - defaultViewport: 'tablet', - defaultOrientation: 'landscape', - }, - chromatic: { viewports: [1112] }, - }, - decorators: [ - (StoryFn: any) => ( - <HelmetProvider key="helmet.Provider"> - <BaseLocationProvider location="/?path=/story/my-id" navigator={{} as any}> - <Background> - <StoryFn /> - </Background> - </BaseLocationProvider> - </HelmetProvider> - ), - ], -}; - -const Background = styled.div( - { - position: 'relative', - minHeight: '100vh', - height: '100vw', - }, - ({ theme }) => ({ - background: theme.background.app, - color: theme.color.defaultText, - }) -); - -function SetPreviewInitialized(): JSX.Element { - const api = useStorybookApi(); - useEffect(() => { - api.setPreviewInitialized(); - }, [api]); - return null; -} - -export const Default = () => { - const provider = new FakeProvider(); - - return ( - <ManagerProvider - key="manager" - provider={provider} - path="/story/ui-app--loading-state" - viewMode="story" - storyId="ui-app--loading-state" - location={{ search: '' }} - navigate={() => {}} - docsOptions={{ docsMode: false }} - > - <SetPreviewInitialized /> - <App - key="app" - viewMode="story" - layout={{ - initialActive: 'sidebar', - isFullscreen: false, - showToolbar: true, - panelPosition: 'right', - showNav: true, - showPanel: true, - showTabs: true, - }} - pages={[]} - panelCount={0} - /> - </ManagerProvider> - ); -}; - -export const LoadingState = () => ( - <ManagerProvider - key="manager" - provider={new PrettyFakeProvider()} - path="" - storyId="ui-app--loading-state" - location={{ search: '' }} - navigate={() => {}} - docsOptions={{ docsMode: false }} - > - <App - key="app" - viewMode="story" - layout={{ - initialActive: 'sidebar', - isFullscreen: false, - showToolbar: true, - panelPosition: 'right', - showNav: true, - showPanel: true, - showTabs: true, - }} - pages={[]} - panelCount={0} - /> - </ManagerProvider> -); - -export const Dark = () => LoadingState(); -Dark.parameters = { - theme: 'dark', -}; -export const Mobile = () => LoadingState(); -Mobile.parameters = { - theme: 'light', - viewport: { - viewports: { - mobile1: { - name: 'Small mobile', - styles: { - height: '568px', - width: '320px', - }, - type: 'mobile', - }, - }, - defaultViewport: 'mobile1', - defaultOrientation: 'portrait', - }, - chromatic: { viewports: [320] }, -}; diff --git a/code/ui/manager/src/app.tsx b/code/ui/manager/src/app.tsx deleted file mode 100644 index 607661b56a28..000000000000 --- a/code/ui/manager/src/app.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React, { useMemo } from 'react'; -import { useResizeDetector } from 'react-resize-detector'; - -import { type State } from '@storybook/manager-api'; -import { Symbols } from '@storybook/components'; -import { Global, createGlobal, styled } from '@storybook/theming'; - -import type { Addon_PageType } from '@storybook/types'; -import { Mobile } from './components/layout/mobile'; -import { Desktop } from './components/layout/desktop'; -import Sidebar from './containers/sidebar'; -import Preview from './containers/preview'; -import Panel from './containers/panel'; -import Notifications from './containers/notifications'; - -const View = styled.div({ - position: 'fixed', - overflow: 'hidden', - height: '100vh', - width: '100vw', -}); - -export interface AppProps { - viewMode: State['viewMode']; - layout: State['layout']; - panelCount: number; - pages: Addon_PageType[]; -} - -const App: React.FC<AppProps> = ({ viewMode, layout, panelCount, pages }) => { - const { width, height, ref } = useResizeDetector(); - let content; - - const props = useMemo( - () => ({ - Sidebar, - Preview, - Panel, - Notifications, - }), - [] - ); - - if (!width || !height) { - content = <div />; - } else if (width < 600) { - content = <Mobile {...props} viewMode={viewMode} options={layout} pages={pages} />; - } else { - content = ( - <Desktop - {...props} - viewMode={viewMode} - options={layout} - width={width} - height={height} - panelCount={panelCount} - pages={pages} - /> - ); - } - - return ( - <View ref={ref}> - <Global styles={createGlobal} /> - <Symbols icons={['folder', 'component', 'document', 'bookmarkhollow']} /> - {content} - </View> - ); -}; - -App.displayName = 'App'; - -export default App; diff --git a/code/ui/manager/src/components/hooks/useMedia.tsx b/code/ui/manager/src/components/hooks/useMedia.tsx index 240629e79cfe..45d80654e4aa 100644 --- a/code/ui/manager/src/components/hooks/useMedia.tsx +++ b/code/ui/manager/src/components/hooks/useMedia.tsx @@ -1,19 +1,38 @@ -import { useState, useEffect } from 'react'; +import { useEffect, useState } from 'react'; -const useMediaQuery = (query: string) => { - const [matches, setMatches] = useState(false); +// The hook is taken from this library: +// https://usehooks-ts.com/react-hook/use-media-query +// The good thing about it is that is uses window.matchMedia - useEffect(() => { - const media = window.matchMedia(query); - if (media.matches !== matches) { - setMatches(media.matches); +export function useMediaQuery(query: string): boolean { + const getMatches = (queryMatch: string): boolean => { + // Prevents SSR issues + if (typeof window !== 'undefined') { + return window.matchMedia(queryMatch).matches; } - const listener = () => setMatches(media.matches); - window.addEventListener('resize', listener); - return () => window.removeEventListener('resize', listener); - }, [matches, query]); + return false; + }; - return matches; -}; + const [matches, setMatches] = useState<boolean>(getMatches(query)); + + function handleChange() { + setMatches(getMatches(query)); + } + + useEffect(() => { + const matchMedia = window.matchMedia(query); -export default useMediaQuery; + // Triggered at the first client-side load and if query changes + handleChange(); + + // Listen matchMedia + matchMedia.addEventListener('change', handleChange); + + return () => { + matchMedia.removeEventListener('change', handleChange); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [query]); + + return matches; +} diff --git a/code/ui/manager/src/components/layout/Layout.stories.tsx b/code/ui/manager/src/components/layout/Layout.stories.tsx new file mode 100644 index 000000000000..593e83dea5ab --- /dev/null +++ b/code/ui/manager/src/components/layout/Layout.stories.tsx @@ -0,0 +1,133 @@ +import { action } from '@storybook/addon-actions'; +import type { FC, PropsWithChildren } from 'react'; +import React, { useState } from 'react'; + +import { styled } from '@storybook/theming'; +import type { Meta, StoryObj } from '@storybook/react'; +import { Layout } from './Layout'; +import { LayoutProvider } from './LayoutProvider'; +import MobileNavigationStoriesMeta from '../mobile/navigation/MobileNavigation.stories'; + +const PlaceholderBlock = styled.div({ + width: '100%', + height: '100%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + overflow: 'hidden', +}); + +const PlaceholderClock: FC<PropsWithChildren> = ({ children }) => { + const [count, setCount] = React.useState(0); + React.useEffect(() => { + const interval = setInterval(() => { + setCount(count + 1); + }, 1000); + return () => clearInterval(interval); + }, [count]); + return ( + <PlaceholderBlock> + <h2>{count}</h2> + {children} + </PlaceholderBlock> + ); +}; + +const MockSidebar: FC<any> = () => <PlaceholderClock />; + +const MockPreview: FC<any> = () => <PlaceholderClock />; + +const MockPanel: FC<any> = () => <PlaceholderClock />; + +const MockPage: FC<any> = () => <PlaceholderClock />; + +const defaultState = { + navSize: 150, + bottomPanelHeight: 150, + rightPanelWidth: 150, + panelPosition: 'bottom', + viewMode: 'story', +} as const; + +const meta = { + title: 'Layout', + component: Layout, + args: { + managerLayoutState: defaultState, + slotMain: <MockPreview />, + slotSidebar: <MockSidebar />, + slotPanel: <MockPanel />, + slotPages: <MockPage />, + }, + parameters: { + theme: 'light', + layout: 'fullscreen', + }, + decorators: [ + MobileNavigationStoriesMeta.decorators[0] as any, + (storyFn) => <LayoutProvider>{storyFn()}</LayoutProvider>, + ], + render: (args) => { + const [managerLayoutState, setManagerLayoutState] = useState(args.managerLayoutState); + + return ( + <Layout + {...args} + managerLayoutState={managerLayoutState} + setManagerLayoutState={(nextPartialState) => { + setManagerLayoutState({ ...managerLayoutState, ...nextPartialState }); + action('setManagerStoreState')(nextPartialState); + }} + /> + ); + }, +} satisfies Meta<typeof Layout>; + +export default meta; + +type Story = StoryObj<typeof meta>; + +export const Desktop: Story = {}; +export const Dark: Story = { + parameters: { theme: 'dark' }, +}; +export const DesktopHorizontal: Story = { + args: { + managerLayoutState: { ...defaultState, panelPosition: 'right' }, + }, +}; + +export const DesktopDocs: Story = { + args: { + managerLayoutState: { ...defaultState, viewMode: 'docs' }, + }, +}; + +export const DesktopPages: Story = { + args: { + managerLayoutState: { ...defaultState, viewMode: 'settings' }, + }, +}; + +export const Mobile = { + parameters: { + viewport: { + defaultViewport: 'mobile1', + }, + chromatic: { viewports: [320] }, + }, +}; +export const MobileDark = { + ...Mobile, + parameters: { + ...Mobile.parameters, + theme: 'dark', + }, +}; + +export const MobileDocs = { + ...Mobile, + args: { + managerLayoutState: { ...defaultState, viewMode: 'docs' }, + }, +}; diff --git a/code/ui/manager/src/components/layout/Layout.tsx b/code/ui/manager/src/components/layout/Layout.tsx new file mode 100644 index 000000000000..726b535e7f37 --- /dev/null +++ b/code/ui/manager/src/components/layout/Layout.tsx @@ -0,0 +1,297 @@ +import React, { useEffect, useLayoutEffect, useState } from 'react'; +import { styled } from '@storybook/theming'; +import type { API_Layout, API_ViewMode } from '@storybook/types'; +import { useDragging } from './useDragging'; +import { MobileNavigation } from '../mobile/navigation/MobileNavigation'; +import { MEDIA_DESKTOP_BREAKPOINT } from '../../constants'; +import { useLayout } from './LayoutProvider'; +import { Notifications } from '../../container/Notifications'; + +interface InternalLayoutState { + isDragging: boolean; +} + +interface ManagerLayoutState + extends Pick<API_Layout, 'navSize' | 'bottomPanelHeight' | 'rightPanelWidth' | 'panelPosition'> { + viewMode: API_ViewMode; +} + +export type LayoutState = InternalLayoutState & ManagerLayoutState; + +interface Props { + managerLayoutState: ManagerLayoutState; + setManagerLayoutState: (state: Partial<Omit<ManagerLayoutState, 'viewMode'>>) => void; + slotMain?: React.ReactNode; + slotSidebar?: React.ReactNode; + slotPanel?: React.ReactNode; + slotPages?: React.ReactNode; +} +const MINIMUM_CONTENT_WIDTH_PX = 100; + +const layoutStateIsEqual = (state: ManagerLayoutState, other: ManagerLayoutState) => + state.navSize === other.navSize && + state.bottomPanelHeight === other.bottomPanelHeight && + state.rightPanelWidth === other.rightPanelWidth && + state.panelPosition === other.panelPosition; + +/** + * Manages the internal state of panels while dragging, and syncs it with the + * layout state in the global manager store when the user is done dragging. + * Also syncs the layout state from the global manager store to the internal state + * here when necessary + */ +const useLayoutSyncingState = ({ + managerLayoutState, + setManagerLayoutState, + isDesktop, +}: { + managerLayoutState: Props['managerLayoutState']; + setManagerLayoutState: Props['setManagerLayoutState']; + isDesktop: boolean; +}) => { + // ref to keep track of previous managerLayoutState, to check if the props change + const prevManagerLayoutStateRef = React.useRef<ManagerLayoutState>(managerLayoutState); + + const [internalDraggingSizeState, setInternalDraggingSizeState] = useState<LayoutState>({ + ...managerLayoutState, + isDragging: false, + }); + + /** + * Sync FROM managerLayoutState to internalDraggingState if user is not dragging + */ + useEffect(() => { + if ( + internalDraggingSizeState.isDragging || // don't interrupt user's drag + layoutStateIsEqual(managerLayoutState, prevManagerLayoutStateRef.current) // don't set any state if managerLayoutState hasn't changed + ) { + return; + } + prevManagerLayoutStateRef.current = managerLayoutState; + setInternalDraggingSizeState((state) => ({ ...state, ...managerLayoutState })); + }, [internalDraggingSizeState.isDragging, managerLayoutState, setInternalDraggingSizeState]); + + /** + * Sync size changes TO managerLayoutState when drag is done + */ + useLayoutEffect(() => { + if ( + internalDraggingSizeState.isDragging || // wait with syncing managerLayoutState until user is done dragging + layoutStateIsEqual(prevManagerLayoutStateRef.current, internalDraggingSizeState) // don't sync managerLayoutState if it doesn't differ from internalDraggingSizeState + ) { + return; + } + const nextState = { + navSize: internalDraggingSizeState.navSize, + bottomPanelHeight: internalDraggingSizeState.bottomPanelHeight, + rightPanelWidth: internalDraggingSizeState.rightPanelWidth, + }; + prevManagerLayoutStateRef.current = { + ...prevManagerLayoutStateRef.current, + ...nextState, + }; + setManagerLayoutState(nextState); + }, [internalDraggingSizeState, setManagerLayoutState]); + + const isPagesShown = + managerLayoutState.viewMode !== 'story' && managerLayoutState.viewMode !== 'docs'; + const isPanelShown = managerLayoutState.viewMode === 'story'; + + const { panelResizerRef, sidebarResizerRef } = useDragging({ + setState: setInternalDraggingSizeState, + isPanelShown, + isDesktop, + }); + const { navSize, rightPanelWidth, bottomPanelHeight } = internalDraggingSizeState.isDragging + ? internalDraggingSizeState + : managerLayoutState; + + return { + navSize, + rightPanelWidth, + bottomPanelHeight, + panelPosition: managerLayoutState.panelPosition, + panelResizerRef, + sidebarResizerRef, + showPages: isPagesShown, + showPanel: isPanelShown, + isDragging: internalDraggingSizeState.isDragging, + }; +}; + +export const Layout = ({ managerLayoutState, setManagerLayoutState, ...slots }: Props) => { + const { isDesktop, isMobile } = useLayout(); + + const { + navSize, + rightPanelWidth, + bottomPanelHeight, + panelPosition, + panelResizerRef, + sidebarResizerRef, + showPages, + showPanel, + isDragging, + } = useLayoutSyncingState({ managerLayoutState, setManagerLayoutState, isDesktop }); + + return ( + <LayoutContainer + navSize={navSize} + rightPanelWidth={rightPanelWidth} + bottomPanelHeight={bottomPanelHeight} + panelPosition={managerLayoutState.panelPosition} + isDragging={isDragging} + viewMode={managerLayoutState.viewMode} + > + <Notifications /> + {showPages && <PagesContainer>{slots.slotPages}</PagesContainer>} + <ContentContainer>{slots.slotMain}</ContentContainer> + {isDesktop && ( + <> + <SidebarContainer> + <Drag ref={sidebarResizerRef} /> + {slots.slotSidebar} + </SidebarContainer> + {showPanel && ( + <PanelContainer position={panelPosition}> + <Drag + orientation={panelPosition === 'bottom' ? 'horizontal' : 'vertical'} + position={panelPosition === 'bottom' ? 'left' : 'right'} + ref={panelResizerRef} + /> + {slots.slotPanel} + </PanelContainer> + )} + </> + )} + {isMobile && ( + <MobileNavigation menu={slots.slotSidebar} panel={slots.slotPanel} showPanel={showPanel} /> + )} + </LayoutContainer> + ); +}; + +const LayoutContainer = styled.div<LayoutState>( + ({ navSize, rightPanelWidth, bottomPanelHeight, viewMode, panelPosition }) => { + return { + width: '100%', + height: ['100vh', '100dvh'], // This array is a special Emotion syntax to set a fallback if 100dvh is not supported + overflow: 'hidden', + display: 'flex', + flexDirection: 'column', + + [MEDIA_DESKTOP_BREAKPOINT]: { + display: 'grid', + gap: 0, + gridTemplateColumns: `minmax(0, ${navSize}px) minmax(${MINIMUM_CONTENT_WIDTH_PX}px, 1fr) minmax(0, ${rightPanelWidth}px)`, + gridTemplateRows: `1fr minmax(0, ${bottomPanelHeight}px)`, + gridTemplateAreas: (() => { + if (viewMode === 'docs') { + // remove panel in docs viewMode + return `"sidebar content content" + "sidebar content content"`; + } + if (panelPosition === 'right') { + return `"sidebar content panel" + "sidebar content panel"`; + } + return `"sidebar content content" + "sidebar panel panel"`; + })(), + }, + }; + } +); + +const SidebarContainer = styled.div(({ theme }) => ({ + backgroundColor: theme.background.app, + gridArea: 'sidebar', + position: 'relative', + borderRight: `1px solid ${theme.color.border}`, +})); + +const ContentContainer = styled.div(({ theme }) => ({ + flex: 1, + position: 'relative', + backgroundColor: theme.background.content, + display: 'grid', // This is needed to make the content container fill the available space + + [MEDIA_DESKTOP_BREAKPOINT]: { + flex: 'auto', + gridArea: 'content', + }, +})); + +const PagesContainer = styled.div(({ theme }) => ({ + gridRowStart: 'sidebar-start', + gridRowEnd: '-1', + gridColumnStart: 'sidebar-end', + gridColumnEnd: '-1', + backgroundColor: theme.background.content, + zIndex: 1, +})); + +const PanelContainer = styled.div<{ position: LayoutState['panelPosition'] }>( + ({ theme, position }) => ({ + gridArea: 'panel', + position: 'relative', + backgroundColor: theme.background.content, + borderTop: position === 'bottom' ? `1px solid ${theme.color.border}` : null, + borderLeft: position === 'right' ? `1px solid ${theme.color.border}` : null, + }) +); + +const Drag = styled.div<{ orientation?: 'horizontal' | 'vertical'; position?: 'left' | 'right' }>( + ({ theme }) => ({ + position: 'absolute', + opacity: 0, + transition: 'opacity 0.2s ease-in-out', + zIndex: 100, + + '&:after': { + content: '""', + display: 'block', + backgroundColor: theme.color.secondary, + }, + + '&:hover': { + opacity: 1, + }, + }), + ({ orientation = 'vertical', position = 'left' }) => { + if (orientation === 'vertical') + return { + width: position === 'left' ? 10 : 13, + height: '100%', + top: 0, + right: position === 'left' ? '-7px' : null, + left: position === 'right' ? '-7px' : null, + + '&:after': { + width: 1, + height: '100%', + marginLeft: position === 'left' ? 3 : 6, + }, + + '&:hover': { + cursor: 'col-resize', + }, + }; + return { + width: '100%', + height: '13px', + top: '-7px', + left: 0, + + '&:after': { + width: '100%', + height: 1, + marginTop: 6, + }, + + '&:hover': { + cursor: 'row-resize', + }, + }; + } +); diff --git a/code/ui/manager/src/components/layout/LayoutProvider.tsx b/code/ui/manager/src/components/layout/LayoutProvider.tsx new file mode 100644 index 000000000000..ae088f6358d0 --- /dev/null +++ b/code/ui/manager/src/components/layout/LayoutProvider.tsx @@ -0,0 +1,53 @@ +import type { FC, PropsWithChildren } from 'react'; +import React, { createContext, useContext, useState } from 'react'; +import { useMediaQuery } from '../hooks/useMedia'; +import { BREAKPOINT } from '../../constants'; + +type LayoutContextType = { + isMobileMenuOpen: boolean; + setMobileMenuOpen: React.Dispatch<React.SetStateAction<boolean>>; + isMobileAboutOpen: boolean; + setMobileAboutOpen: React.Dispatch<React.SetStateAction<boolean>>; + isMobilePanelOpen: boolean; + setMobilePanelOpen: React.Dispatch<React.SetStateAction<boolean>>; + isDesktop: boolean; + isMobile: boolean; +}; + +const LayoutContext = createContext<LayoutContextType>({ + isMobileMenuOpen: false, + setMobileMenuOpen: () => {}, + isMobileAboutOpen: false, + setMobileAboutOpen: () => {}, + isMobilePanelOpen: false, + setMobilePanelOpen: () => {}, + isDesktop: false, + isMobile: false, +}); + +export const LayoutProvider: FC<PropsWithChildren> = ({ children }) => { + const [isMobileMenuOpen, setMobileMenuOpen] = useState(false); + const [isMobileAboutOpen, setMobileAboutOpen] = useState(false); + const [isMobilePanelOpen, setMobilePanelOpen] = useState(false); + const isDesktop = useMediaQuery(`(min-width: ${BREAKPOINT}px)`); + const isMobile = !isDesktop; + + return ( + <LayoutContext.Provider + value={{ + isMobileMenuOpen, + setMobileMenuOpen, + isMobileAboutOpen, + setMobileAboutOpen, + isMobilePanelOpen, + setMobilePanelOpen, + isDesktop, + isMobile, + }} + > + {children} + </LayoutContext.Provider> + ); +}; + +export const useLayout = () => useContext(LayoutContext); diff --git a/code/ui/manager/src/components/layout/Root.tsx b/code/ui/manager/src/components/layout/Root.tsx deleted file mode 100644 index 9a940b999f8d..000000000000 --- a/code/ui/manager/src/components/layout/Root.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { styled } from '@storybook/theming'; - -export const Root = styled.div({ - position: 'fixed', - left: 0, - top: 0, - width: '100vw', - height: '100vh', - overflow: 'hidden', -}); diff --git a/code/ui/manager/src/components/layout/app.mockdata.tsx b/code/ui/manager/src/components/layout/app.mockdata.tsx deleted file mode 100644 index f41596303ed7..000000000000 --- a/code/ui/manager/src/components/layout/app.mockdata.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import { global } from '@storybook/global'; -import type { FC } from 'react'; -import React, { Component } from 'react'; -import { styled } from '@storybook/theming'; -import type { Addon_BaseType, Addon_Collection } from '@storybook/types'; -import { Addon_TypesEnum } from '@storybook/types'; -import type { State } from '@storybook/manager-api'; -import type { SidebarProps } from '../sidebar/Sidebar'; -import { Sidebar } from '../sidebar/Sidebar'; -import Panel from '../panel/panel'; -import { Preview } from '../preview/preview'; - -import { previewProps } from '../preview/preview.mockdata'; -import { mockDataset } from '../sidebar/mockdata'; -import type { DesktopProps } from './desktop'; - -const { setInterval } = global; - -export const shortcuts: State['shortcuts'] = { - fullScreen: ['F'], - togglePanel: ['A'], - panelPosition: ['D'], - toggleNav: ['S'], - toolbar: ['T'], - search: ['/'], - focusNav: ['1'], - focusIframe: ['2'], - focusPanel: ['3'], - prevComponent: ['alt', 'ArrowUp'], - nextComponent: ['alt', 'ArrowDown'], - prevStory: ['alt', 'ArrowLeft'], - nextStory: ['alt', 'ArrowRight'], - shortcutsPage: ['ctrl', 'shift', ','], - aboutPage: [','], - escape: ['escape'], - collapseAll: ['ctrl', 'shift', 'ArrowUp'], - expandAll: ['ctrl', 'shift', 'ArrowDown'], - remount: ['alt', 'R'], -}; - -export const panels: Addon_Collection<Addon_BaseType> = { - test1: { - title: 'Test 1', - type: Addon_TypesEnum.PANEL, - render: ({ active }) => (active ? <div id="test1">TEST 1</div> : null), - }, - test2: { - title: 'Test 2', - type: Addon_TypesEnum.PANEL, - render: ({ active }) => (active ? <div id="test2">TEST 2</div> : null), - }, -}; - -const realSidebarProps: SidebarProps = { - index: mockDataset.withRoot as SidebarProps['index'], - menu: [], - refs: {}, - status: {}, - previewInitialized: true, - extra: [], -}; - -const PlaceholderBlock = styled.div(({ color }) => ({ - background: color || 'hotpink', - position: 'absolute', - top: 0, - right: 0, - bottom: 0, - left: 0, - width: '100%', - height: '100%', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - overflow: 'hidden', -})); - -class PlaceholderClock extends Component<{ color: string }, { count: number }> { - state = { - count: 1, - }; - - interval: ReturnType<typeof setTimeout>; - - componentDidMount() { - this.interval = setInterval(() => { - const { count } = this.state; - this.setState({ count: count + 1 }); - }, 1000); - } - - componentWillUnmount() { - const { interval } = this; - clearInterval(interval); - } - - render() { - const { children, color } = this.props; - const { count } = this.state; - return ( - <PlaceholderBlock color={color}> - <h2 - data-chromatic="ignore" - style={{ - position: 'absolute', - bottom: 0, - right: 0, - color: 'rgba(0,0,0,0.2)', - fontSize: '150px', - lineHeight: '150px', - margin: '-20px', - }} - > - {count} - </h2> - {children} - </PlaceholderBlock> - ); - } -} - -const MockSidebar: FC<any> = (props) => ( - <PlaceholderClock color="hotpink"> - <pre>{JSON.stringify(props, null, 2)}</pre> - </PlaceholderClock> -); -const MockPreview: FC<any> = (props) => ( - <PlaceholderClock color="deepskyblue"> - <pre>{JSON.stringify(props, null, 2)}</pre> - </PlaceholderClock> -); -const MockPanel: FC<any> = (props) => ( - <PlaceholderClock color="orangered"> - <pre>{JSON.stringify(props, null, 2)}</pre> - </PlaceholderClock> -); -export const MockPage: FC<any> = (props) => ( - <PlaceholderClock color="cyan"> - <pre>{JSON.stringify(props, null, 2)}</pre> - </PlaceholderClock> -); - -export const mockProps: DesktopProps = { - Sidebar: MockSidebar, - Preview: MockPreview, - Panel: MockPanel, - Notifications: () => null, - pages: [], - options: { - isFullscreen: false, - showNav: true, - showPanel: true, - panelPosition: 'right', - showToolbar: true, - initialActive: 'canvas', - showTabs: true, - }, - viewMode: 'story', - panelCount: 2, - width: 1112, - height: 834, -}; - -export const realProps: DesktopProps = { - Sidebar: () => <Sidebar {...realSidebarProps} />, - Preview: () => <Preview {...previewProps} />, - Notifications: () => null, - Panel: () => ( - <Panel - panels={panels} - actions={{ onSelect: () => {}, toggleVisibility: () => {}, togglePosition: () => {} }} - selectedPanel="test2" - panelPosition="bottom" - shortcuts={shortcuts} - absolute={false} - /> - ), - pages: [], - options: { - isFullscreen: false, - showNav: true, - showPanel: true, - panelPosition: 'right', - showToolbar: true, - initialActive: 'canvas', - showTabs: true, - }, - viewMode: 'story', - panelCount: 2, - width: 900, - height: 600, -}; diff --git a/code/ui/manager/src/components/layout/container.tsx b/code/ui/manager/src/components/layout/container.tsx deleted file mode 100644 index d9e482b162c8..000000000000 --- a/code/ui/manager/src/components/layout/container.tsx +++ /dev/null @@ -1,648 +0,0 @@ -import type { FC, CSSProperties, ReactNode } from 'react'; -import React, { Component, Fragment } from 'react'; -import { styled, withTheme } from '@storybook/theming'; -import type { Theme } from '@storybook/theming'; -import type { State } from '@storybook/manager-api'; -import * as persistence from './persist'; - -import type { DraggableData, DraggableEvent } from './draggers'; -import { Draggable, Handle } from './draggers'; - -const MIN_NAV_WIDTH = 200; // visually there's an additional 10px due to the canvas' left margin -const MIN_CANVAS_WIDTH = 200; -const MIN_CANVAS_HEIGHT = 200; // visually it's 50px less due to the canvas toolbar and top margin -const MIN_PANEL_WIDTH = 220; -const MIN_PANEL_HEIGHT = 200; // visually it's 50px less due to the panel toolbar -const DEFAULT_NAV_WIDTH = 230; -const DEFAULT_PANEL_WIDTH = 400; - -const Pane = styled.div<{ - border?: 'left' | 'right' | 'top' | 'bottom'; - animate?: boolean; - top?: boolean; - hidden?: boolean; - children: ReactNode; -}>( - { - position: 'absolute', - boxSizing: 'border-box', - top: 0, - left: 0, - width: '100%', - height: '100%', - }, - ({ hidden }) => - hidden - ? { - opacity: 0, - } - : { - opacity: 1, - }, - ({ top }) => - top - ? { - zIndex: 9, - } - : {}, - ({ border, theme }) => { - switch (border) { - case 'left': { - return { - borderLeft: `1px solid ${theme.appBorderColor}`, - }; - } - case 'right': { - return { - borderRight: `1px solid ${theme.appBorderColor}`, - }; - } - case 'top': { - return { - borderTop: `1px solid ${theme.appBorderColor}`, - }; - } - case 'bottom': { - return { - borderBottom: `1px solid ${theme.appBorderColor}`, - }; - } - default: { - return {}; - } - } - }, - ({ animate }) => - animate - ? { - transition: ['width', 'height', 'top', 'left', 'background', 'opacity', 'transform'] - .map((p) => `${p} 0.1s ease-out`) - .join(','), - } - : {} -); - -const Paper = styled.div<{ isFullscreen: boolean }>( - { - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: '100%', - }, - ({ isFullscreen, theme }) => - isFullscreen - ? { - boxShadow: 'none', - borderRadius: 0, - } - : { - borderTopLeftRadius: - theme.appBorderRadius === 0 ? theme.appBorderRadius : theme.appBorderRadius + 1, - borderBottomLeftRadius: - theme.appBorderRadius === 0 ? theme.appBorderRadius : theme.appBorderRadius + 1, - overflow: 'hidden', - boxShadow: - theme.base === 'light' - ? '0 1px 3px 1px rgba(0, 0, 0, 0.05), 0px 0 0px 1px rgba(0, 0, 0, 0.05)' - : `0px 0 0px 1px ${theme.appBorderColor}`, - transform: 'translateZ(0)', - } -); - -export const Sidebar: FC<{ hidden: boolean; position: CSSProperties }> = ({ - hidden = false, - children, - position = undefined, - ...props -}) => - hidden ? null : ( - <Pane style={position} {...props}> - {children} - </Pane> - ); - -export const Main: FC<{ isFullscreen: boolean; position: CSSProperties }> = ({ - isFullscreen = false, - children, - position = undefined, - ...props -}) => ( - <Pane style={position} top {...props} role="main"> - <Paper isFullscreen={isFullscreen}>{children}</Paper> - </Pane> -); - -export const Preview: FC<{ hidden: boolean; position: CSSProperties }> = ({ - hidden = false, - children, - position = undefined, - ...props -}) => ( - <Pane style={position} top hidden={hidden} {...props}> - {children} - </Pane> -); - -export const Panel: FC<{ - hidden: boolean; - position: CSSProperties; - align: 'bottom' | 'right'; -}> = ({ hidden = false, children, position = undefined, align = 'right', ...props }) => ( - <Pane style={position} hidden={hidden} {...props} border={align === 'bottom' ? 'top' : 'left'}> - {children} - </Pane> -); - -const HoverBlocker = styled.div({ - position: 'absolute', - left: 0, - top: 0, - zIndex: 15, - height: '100vh', - width: '100vw', -}); - -export type PanelPosition = 'right' | 'bottom'; -export interface Bounds { - top: number; - width: number; - left: number; - height: number; -} - -export interface Coordinates { - x: number; - y: number; -} - -const getPreviewPosition = ({ - panelPosition, - isPanelHidden, - isNavHidden, - isFullscreen, - bounds, - resizerPanel, - resizerNav, - margin, -}: { - panelPosition: PanelPosition; - isPanelHidden: boolean; - isNavHidden: boolean; - isFullscreen: boolean; - bounds: Bounds; - resizerPanel: Coordinates; - resizerNav: Coordinates; - margin: number; -}): Bounds => { - if (isFullscreen || isPanelHidden) { - return {} as Bounds; - } - - const navX = isNavHidden ? 0 : resizerNav.x; - const panelX = resizerPanel.x; - const panelY = resizerPanel.y; - - return panelPosition === 'bottom' - ? { - height: panelY - margin, - left: 0, - top: 0, - width: bounds.width - navX - 2 * margin, - } - : { - height: bounds.height - 2 * margin, - left: 0, - top: 0, - width: panelX - navX - margin, - }; -}; - -const getMainPosition = ({ - bounds, - resizerNav, - isNavHidden, - isFullscreen, - margin, -}: { - bounds: Bounds; - resizerNav: Coordinates; - isNavHidden: boolean; - isFullscreen: boolean; - margin: number; -}): Bounds => { - if (isFullscreen) { - return {} as Bounds; - } - - const navX = isNavHidden ? 0 : resizerNav.x; - - return { - height: bounds.height - margin * 2, - left: navX + margin, - top: margin, - width: bounds.width - navX - margin * 2, - }; -}; - -const getPanelPosition = ({ - isPanelBottom, - isPanelHidden, - isNavHidden, - bounds, - resizerPanel, - resizerNav, - margin, -}: { - isPanelBottom: boolean; - isPanelHidden: boolean; - isNavHidden: boolean; - bounds: Bounds; - resizerPanel: Coordinates; - resizerNav: Coordinates; - margin: number; -}): Bounds => { - const navX = isNavHidden ? 0 : resizerNav.x; - const panelX = resizerPanel.x; - const panelY = resizerPanel.y; - - if (isPanelBottom && isPanelHidden) { - return { - height: bounds.height - panelY - margin, - left: 0, - top: panelY - margin, - width: bounds.width - navX - 2 * margin, - }; - } - if (!isPanelBottom && isPanelHidden) { - return { - height: bounds.height - 2 * margin, - left: panelX - navX - margin, - top: 0, - width: bounds.width - panelX - margin, - }; - } - - return isPanelBottom - ? { - height: bounds.height - panelY - margin, - left: 0, - top: panelY - margin, - width: bounds.width - navX - 2 * margin, - } - : { - height: bounds.height - 2 * margin, - left: panelX - navX - margin, - top: 0, - width: bounds.width - panelX - margin, - }; -}; - -export interface BasePanelRenderProps { - viewMode?: State['viewMode']; - animate: boolean; - isFullscreen?: boolean; - position: Bounds; -} - -export interface LayoutRenderProps { - mainProps: BasePanelRenderProps; - previewProps: BasePanelRenderProps & { - showToolbar: boolean; - }; - navProps: BasePanelRenderProps & { - hidden: boolean; - }; - panelProps: BasePanelRenderProps & { - align: PanelPosition; - hidden: boolean; - }; -} - -export interface LayoutState { - isDragging: 'nav' | 'panel' | false; - resizerNav: Coordinates; - resizerPanel: Coordinates; -} -export interface LayoutProps { - children: (data: LayoutRenderProps) => ReactNode; - panelCount: number; - bounds: { - width: number; - height: number; - top: number; - left: number; - }; - options: { - isFullscreen: boolean; - showNav: boolean; - showPanel: boolean; - panelPosition: 'bottom' | 'right'; - showToolbar: boolean; - }; - viewMode: State['viewMode']; - theme: Theme; -} - -class Layout extends Component<LayoutProps, LayoutState> { - static defaultProps: Partial<LayoutProps> = { - viewMode: undefined, - }; - - navRef: React.RefObject<HTMLDivElement>; - - panelRef: React.RefObject<HTMLDivElement>; - - constructor(props: LayoutProps) { - super(props); - this.navRef = React.createRef(); - this.panelRef = React.createRef(); - const { bounds, options } = props; - - const { resizerNav, resizerPanel } = persistence.get(); - - this.state = { - isDragging: false, - resizerNav: resizerNav || { x: DEFAULT_NAV_WIDTH, y: 0 }, - resizerPanel: - resizerPanel || - (options.panelPosition === 'bottom' - ? { x: 0, y: Math.round(bounds.height * 0.6) } - : { x: bounds.width - DEFAULT_PANEL_WIDTH, y: 0 }), - }; - } - - static getDerivedStateFromProps(props: Readonly<LayoutProps>, state: LayoutState): LayoutState { - const { bounds, options } = props; - const { resizerPanel, resizerNav } = state; - - const isNavHidden = options.isFullscreen || !options.showNav; - const isPanelHidden = options.isFullscreen || !options.showPanel; - - const { panelPosition } = options; - const isPanelRight = panelPosition === 'right'; - const isPanelBottom = panelPosition === 'bottom'; - - const navX = resizerNav.x; - const panelX = resizerPanel.x; - const panelY = resizerPanel.y; - - const mutation = {} as LayoutState; - - if (!isNavHidden) { - const minPanelWidth = !isPanelHidden && isPanelRight ? MIN_PANEL_WIDTH : 0; - const minMainWidth = MIN_CANVAS_WIDTH + minPanelWidth; - const maxNavX = bounds.width - minMainWidth; - const minNavX = MIN_NAV_WIDTH; // coordinate translates directly to width here - if (navX > maxNavX) { - // upper bound - mutation.resizerNav = { - x: maxNavX, - y: 0, - }; - } else if (navX < minNavX || maxNavX < minNavX) { - // lower bound, supercedes upper bound if needed - mutation.resizerNav = { - x: minNavX, - y: 0, - }; - } - } - - if (isPanelRight && !isPanelHidden) { - const maxPanelX = bounds.width - MIN_PANEL_WIDTH; - const minPanelX = navX + MIN_CANVAS_WIDTH; - if (panelX > maxPanelX || panelX === 0) { - // upper bound or when switching orientation - mutation.resizerPanel = { - x: maxPanelX, - y: 0, - }; - } else if (panelX < minPanelX) { - // lower bound - mutation.resizerPanel = { - x: minPanelX, - y: 0, - }; - } - } - - if (isPanelBottom && !isPanelHidden) { - const maxPanelY = bounds.height - MIN_PANEL_HEIGHT; - if (panelY > maxPanelY || panelY === 0) { - // lower bound or when switching orientation - mutation.resizerPanel = { - x: 0, - y: bounds.height - 200, - }; - } - // upper bound is enforced by the Draggable's bounds - } - - return mutation.resizerPanel || mutation.resizerNav ? { ...state, ...mutation } : state; - } - - componentDidUpdate(prevProps: LayoutProps, prevState: LayoutState) { - const { resizerPanel, resizerNav } = this.state; - - persistence.set({ - resizerPanel, - resizerNav, - }); - const { width: prevWidth, height: prevHeight } = prevProps.bounds; - const { bounds, options } = this.props; - const { width, height } = bounds; - if (width !== prevWidth || height !== prevHeight) { - const { panelPosition } = options; - const isPanelBottom = panelPosition === 'bottom'; - if (isPanelBottom) { - this.setState({ - resizerPanel: { - x: prevState.resizerPanel.x, - y: prevState.resizerPanel.y - (prevHeight - height), - }, - }); - } else { - this.setState({ - resizerPanel: { - x: prevState.resizerPanel.x - (prevWidth - width), - y: prevState.resizerPanel.y, - }, - }); - } - } - } - - resizeNav = (e: DraggableEvent, data: DraggableData) => { - if (data.deltaX) { - this.setState({ resizerNav: { x: data.x, y: data.y } }); - } - }; - - resizePanel = (e: DraggableEvent, data: DraggableData) => { - const { options } = this.props; - - if ( - (data.deltaY && options.panelPosition === 'bottom') || - (data.deltaX && options.panelPosition === 'right') - ) { - this.setState({ resizerPanel: { x: data.x, y: data.y } }); - } - }; - - setDragNav = () => { - this.setState({ isDragging: 'nav' }); - }; - - setDragPanel = () => { - this.setState({ isDragging: 'panel' }); - }; - - unsetDrag = () => { - this.setState({ isDragging: false }); - }; - - render() { - const { children, bounds, options, viewMode, panelCount } = this.props; - const { isDragging, resizerNav, resizerPanel } = this.state; - - const margin = 0; - const isNavHidden = options.isFullscreen || !options.showNav; - const isPanelHidden = - options.isFullscreen || !options.showPanel || viewMode !== 'story' || panelCount === 0; - const isFullscreen = options.isFullscreen || (isNavHidden && isPanelHidden); - const { showToolbar } = options; - - const { panelPosition } = options; - const isPanelBottom = panelPosition === 'bottom'; - const isPanelRight = panelPosition === 'right'; - - const panelX = resizerPanel.x; - const navX = resizerNav.x; - - return bounds ? ( - <Fragment> - {isNavHidden ? null : ( - <Draggable - axis="x" - position={resizerNav} - bounds={{ - left: MIN_NAV_WIDTH, - top: 0, - right: - isPanelRight && !isPanelHidden - ? panelX - MIN_CANVAS_WIDTH - : bounds.width - MIN_CANVAS_WIDTH, - bottom: 0, - }} - onStart={this.setDragNav} - onDrag={this.resizeNav} - onStop={this.unsetDrag} - nodeRef={this.navRef} - > - <Handle ref={this.navRef} axis="x" isDragging={isDragging === 'nav'} /> - </Draggable> - )} - - {isPanelHidden ? null : ( - <Draggable - axis={isPanelBottom ? 'y' : 'x'} - position={resizerPanel} - bounds={ - isPanelBottom - ? { - left: 0, - top: MIN_CANVAS_HEIGHT, - right: 0, - bottom: bounds.height - MIN_PANEL_HEIGHT, - } - : { - left: isNavHidden ? MIN_CANVAS_WIDTH : navX + MIN_CANVAS_WIDTH, - top: 0, - right: bounds.width - MIN_PANEL_WIDTH, - bottom: 0, - } - } - onStart={this.setDragPanel} - onDrag={this.resizePanel} - onStop={this.unsetDrag} - nodeRef={this.panelRef} - > - <Handle - ref={this.panelRef} - isDragging={isDragging === 'panel'} - style={ - isPanelBottom - ? { - left: navX + margin, - width: bounds.width - navX - 2 * margin, - marginTop: -10, - } - : { - marginLeft: -10, - } - } - axis={isPanelBottom ? 'y' : 'x'} - /> - </Draggable> - )} - - {isDragging ? <HoverBlocker /> : null} - {children({ - mainProps: { - viewMode, - animate: !isDragging, - isFullscreen, - position: getMainPosition({ bounds, resizerNav, isNavHidden, isFullscreen, margin }), - }, - previewProps: { - viewMode, - animate: !isDragging, - isFullscreen, - showToolbar, - position: getPreviewPosition({ - isFullscreen, - isNavHidden, - isPanelHidden, - resizerNav, - resizerPanel, - bounds, - panelPosition, - margin, - }), - }, - navProps: { - viewMode, - animate: !isDragging, - hidden: isNavHidden, - position: { - height: bounds.height, - left: 0, - top: 0, - width: navX + margin, - }, - }, - panelProps: { - viewMode, - animate: !isDragging, - align: options.panelPosition, - hidden: isPanelHidden, - position: getPanelPosition({ - isPanelBottom, - isPanelHidden, - isNavHidden, - bounds, - resizerPanel, - resizerNav, - margin, - }), - }, - })} - </Fragment> - ) : null; - } -} - -const ThemedLayout = withTheme(Layout) as unknown as typeof Layout; - -export { ThemedLayout as Layout }; diff --git a/code/ui/manager/src/components/layout/desktop.stories.tsx b/code/ui/manager/src/components/layout/desktop.stories.tsx deleted file mode 100644 index 780a844d6a31..000000000000 --- a/code/ui/manager/src/components/layout/desktop.stories.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react'; -import type { DecoratorFn } from '@storybook/react'; - -import isChromatic from 'chromatic/isChromatic'; - -import { BaseLocationProvider } from '@storybook/router'; -import { types } from '@storybook/manager-api'; -import type { DesktopProps } from './desktop'; -import { Desktop } from './desktop'; - -import { store } from './persist'; -import { mockProps, realProps, MockPage } from './app.mockdata'; - -export default { - title: 'Layout/Desktop', - component: Desktop, - parameters: { - passArgsFirst: false, - path: 'story/my-id', - layout: 'fullscreen', - viewport: { - viewports: { - tablet: { - name: 'Tablet', - styles: { - height: '1112px', - width: '834px', - }, - type: 'tablet', - }, - }, - defaultViewport: 'tablet', - defaultOrientation: 'landscape', - }, - theme: 'light', - chromatic: { viewports: [1112] }, - }, - decorators: [ - ((StoryFn, c) => { - const mocked = true; - - if (isChromatic()) { - store.local.set(`storybook-layout`, {}); - } - - const props = mocked ? mockProps : realProps; - - return ( - <BaseLocationProvider location={`/?path=/${c.parameters.path}`} navigator={{} as any}> - <div style={{ height: '100vh', width: '100vw', position: 'absolute', top: 0, left: 0 }}> - <StoryFn props={props} {...c} /> - </div> - </BaseLocationProvider> - ); - }) as DecoratorFn, - ], -}; - -export const Default = ({ props }: { props: DesktopProps }) => <Desktop {...props} />; -export const NoAddons = ({ props }: { props: DesktopProps }) => ( - <Desktop {...props} panelCount={0} /> -); -export const NoSidebar = ({ props }: { props: DesktopProps }) => ( - <Desktop {...props} options={{ ...props.options, showNav: false }} /> -); -export const NoPanel = ({ props }: { props: DesktopProps }) => ( - <Desktop {...props} options={{ ...props.options, showPanel: false }} /> -); -export const BottomPanel = ({ props }: { props: DesktopProps }) => ( - <Desktop {...props} options={{ ...props.options, panelPosition: 'bottom' }} /> -); -export const Fullscreen = ({ props }: { props: DesktopProps }) => ( - <Desktop {...props} options={{ ...props.options, isFullscreen: true }} /> -); -export const NoPanelNoSidebar = ({ props }: { props: DesktopProps }) => ( - <Desktop {...props} options={{ ...props.options, showPanel: false, showNav: false }} /> -); -export const Page = ({ props }: { props: DesktopProps }) => ( - <Desktop - {...props} - pages={[ - { - id: '/settings/', - title: 'Settings', - url: '/settings/', - type: types.experimental_PAGE, - render: () => <MockPage />, - }, - ]} - /> -); -Page.parameters = { path: '/settings/' }; diff --git a/code/ui/manager/src/components/layout/desktop.tsx b/code/ui/manager/src/components/layout/desktop.tsx deleted file mode 100644 index 2004f3817ef5..000000000000 --- a/code/ui/manager/src/components/layout/desktop.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import type { ComponentType } from 'react'; -import React, { Fragment } from 'react'; - -import type { State } from '@storybook/manager-api'; -import { Route } from '@storybook/router'; -import type { Addon_PageType } from '@storybook/types'; -import * as S from './container'; - -export interface DesktopProps { - width: number; - panelCount: number; - height: number; - Sidebar: ComponentType<any>; - Preview: ComponentType<any>; - Panel: ComponentType<any>; - Notifications: ComponentType<any>; - pages: Addon_PageType[]; - options: State['layout']; - viewMode: string; -} - -const Desktop = Object.assign( - React.memo<DesktopProps>(function Desktop({ - Panel, - Sidebar, - Preview, - Notifications, - pages, - options, - viewMode = undefined, - width = 0, - height = 0, - panelCount, - }) { - return ( - <Fragment> - <Notifications - placement={{ - position: 'fixed', - bottom: 20, - left: 20, - }} - /> - {width && height ? ( - <S.Layout - options={options} - bounds={{ width, height, top: 0, left: 0 }} - viewMode={viewMode} - panelCount={panelCount} - > - {({ navProps, mainProps, panelProps, previewProps }) => ( - <Fragment> - <S.Sidebar {...navProps}> - <Sidebar /> - </S.Sidebar> - <S.Main {...mainProps} isFullscreen={!!mainProps.isFullscreen}> - <Route path={/(^\/story|docs|onboarding\/|^\/$)/} hideOnly> - <S.Preview {...previewProps} hidden={false}> - <Preview id="main" /> - </S.Preview> - - <Route path="/story/" startsWith hideOnly> - <S.Panel {...panelProps} hidden={false}> - <Panel /> - </S.Panel> - </Route> - </Route> - - {pages.map(({ id, render: Content }) => ( - <Fragment key={id}> - <Content /> - </Fragment> - ))} - </S.Main> - </Fragment> - )} - </S.Layout> - ) : ( - <div title={JSON.stringify({ width, height })} /> - )} - </Fragment> - ); - }), - { - displayName: 'DesktopLayout', - } -); - -export { Desktop }; diff --git a/code/ui/manager/src/components/layout/draggers.tsx b/code/ui/manager/src/components/layout/draggers.tsx deleted file mode 100644 index 11998518a07a..000000000000 --- a/code/ui/manager/src/components/layout/draggers.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import type { DraggableEvent, DraggableData } from 'react-draggable'; -import Draggable from 'react-draggable'; -import { styled } from '@storybook/theming'; - -export type Axis = 'x' | 'y'; - -const Handle = styled.div<{ isDragging: boolean; axis: Axis; reverse?: boolean }>( - ({ theme }) => ({ - zIndex: 10, - position: 'absolute', - top: 0, - left: 0, - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - - overflow: 'hidden', - transition: - 'color 0.2s linear, background-size 0.2s linear, background 0.2s linear, background-position 0s linear', - }), - ({ axis }) => ({ - cursor: axis === 'x' ? 'col-resize' : 'row-resize', - }), - ({ axis }) => - axis === 'x' - ? { - height: '100%', - width: 10, - marginLeft: -10, - } - : { - height: 10, - width: '100%', - marginTop: -10, - }, - ({ axis, isDragging }) => { - if (axis === 'y') { - const style = { - backgroundImage: `radial-gradient(at center center,rgba(0,0,0,0.2) 0%,transparent 70%,transparent 100%)`, - backgroundSize: '100% 50px', - backgroundPosition: '50% 0', - backgroundRepeat: 'no-repeat', - }; - return isDragging - ? style - : { - ...style, - backgroundPosition: '50% 10px', - '&:hover': style, - }; - } - if (axis === 'x') { - const style = { - backgroundImage: `radial-gradient(at center center,rgba(0,0,0,0.2) 0%,transparent 70%,transparent 100%)`, - backgroundSize: '50px 100%', - backgroundPosition: '0 50%', - backgroundRepeat: 'no-repeat', - }; - return isDragging - ? style - : { - ...style, - backgroundPosition: '10px 50%', - '&:hover': style, - }; - } - return {}; - } -); - -export { Draggable, Handle }; -export type { DraggableEvent, DraggableData }; diff --git a/code/ui/manager/src/components/layout/mobile.stories.tsx b/code/ui/manager/src/components/layout/mobile.stories.tsx deleted file mode 100644 index 2e9966d6e8fc..000000000000 --- a/code/ui/manager/src/components/layout/mobile.stories.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import React from 'react'; -import { ActiveTabs } from '@storybook/manager-api'; -import type { DecoratorFn } from '@storybook/react'; - -import { BaseLocationProvider } from '@storybook/router'; -import { Addon_TypesEnum } from '@storybook/types'; -import type { MobileProps } from './mobile'; -import { Mobile } from './mobile'; - -import { mockProps, realProps, MockPage } from './app.mockdata'; - -export default { - title: 'Layout/Mobile', - component: Mobile, - parameters: { - passArgsFirst: false, - path: 'story/my-id', - layout: 'fullscreen', - viewport: { - viewports: { - mobile1: { - name: 'Small mobile', - styles: { - height: '568px', - width: '320px', - }, - type: 'mobile', - }, - }, - defaultViewport: 'mobile1', - defaultOrientation: 'portrait', - }, - theme: 'light', - chromatic: { viewports: [320] }, - }, - decorators: [ - ((StoryFn, c) => { - const mocked = true; - - const props = mocked ? mockProps : realProps; - - return ( - <BaseLocationProvider location={`/?path=/${c.parameters.path}`} navigator={{} as any}> - <div style={{ height: '100vh', width: '100vw', position: 'absolute', top: 0, left: 0 }}> - <StoryFn props={props} {...c} /> - </div> - </BaseLocationProvider> - ); - }) as DecoratorFn, - ], -}; - -export const InitialSidebar = ({ props }: { props: MobileProps }) => ( - <Mobile {...props} options={{ ...props.options, initialActive: ActiveTabs.SIDEBAR }} /> -); -export const InitialCanvas = ({ props }: { props: MobileProps }) => ( - <Mobile {...props} options={{ ...props.options, initialActive: ActiveTabs.CANVAS }} /> -); -export const InitialAddons = ({ props }: { props: MobileProps }) => ( - <Mobile {...props} options={{ ...props.options, initialActive: ActiveTabs.ADDONS }} /> -); -export const NoPanel = ({ props }: { props: MobileProps }) => ( - <Mobile {...props} options={{ ...props.options, showPanel: false }} /> -); - -export const Fullscreen = ({ props }: { props: MobileProps }) => ( - <Mobile - {...props} - options={{ ...props.options, initialActive: ActiveTabs.SIDEBAR, isFullscreen: true }} - /> -); - -export const Page = ({ props }: { props: MobileProps }) => ( - <Mobile - {...props} - options={{ ...props.options, initialActive: ActiveTabs.CANVAS }} - pages={[ - { - id: 'settings', - url: '/settings', - title: 'Settings', - type: Addon_TypesEnum.experimental_PAGE, - render: () => <MockPage />, - }, - ]} - viewMode="settings" - /> -); -Page.parameters = { - path: '/settings/', -}; diff --git a/code/ui/manager/src/components/layout/mobile.tsx b/code/ui/manager/src/components/layout/mobile.tsx deleted file mode 100644 index 2f2ef7d1e31c..000000000000 --- a/code/ui/manager/src/components/layout/mobile.tsx +++ /dev/null @@ -1,242 +0,0 @@ -import type { ComponentType, FC, ReactNode } from 'react'; -import React, { Fragment, Children, useCallback, useState } from 'react'; -import { type State, ActiveTabs, useStorybookApi } from '@storybook/manager-api'; -import { styled } from '@storybook/theming'; - -import { TabButton } from '@storybook/components'; -import { Location } from '@storybook/router'; -import type { Addon_PageType } from '@storybook/types'; -import { Root } from './Root'; - -export type ActiveTabsType = 'sidebar' | 'canvas' | 'addons'; - -const { SIDEBAR, CANVAS, ADDONS } = ActiveTabs; - -const Pane = styled.div<{ index: number; active: ActiveTabsType }>( - { - transition: 'transform .2s ease', - position: 'absolute', - top: 0, - height: '100%', - overflow: 'auto', - }, - ({ theme }) => ({ - background: theme.background.content, - '&:nth-of-type(1)': { - borderRight: `1px solid ${theme.appBorderColor}`, - }, - '&:nth-of-type(3)': { - borderLeft: `1px solid ${theme.appBorderColor}`, - }, - }), - ({ index }) => { - switch (index) { - case 0: { - return { - width: '80vw', - transform: 'translateX(-80vw)', - left: 0, - }; - } - case 1: { - return { - width: '100%', - transform: 'translateX(0) scale(1)', - left: 0, - }; - } - case 2: { - return { - width: '80vw', - transform: 'translateX(80vw)', - right: 0, - }; - } - default: { - return {}; - } - } - }, - ({ active, index }) => { - switch (true) { - case index === 0 && active === SIDEBAR: { - return { - transform: 'translateX(-0px)', - }; - } - case index === 1 && active === SIDEBAR: { - return { - transform: 'translateX(40vw) translateY(-42.5vh) translateY(40px) scale(0.2)', - }; - } - case index === 1 && active === ADDONS: { - return { - transform: 'translateX(-40vw) translateY(-42.5vh) translateY(40px) scale(0.2)', - }; - } - case index === 2 && active === ADDONS: { - return { - transform: 'translateX(0px)', - }; - } - default: { - return {}; - } - } - } -); - -const Panels = React.memo((({ children, active, isFullscreen }) => ( - <PanelsContainer isFullscreen={isFullscreen}> - {Children.toArray(children).map((item, index) => ( - // eslint-disable-next-line react/no-array-index-key - <Pane key={index} index={index} active={active}> - {item} - </Pane> - ))} - </PanelsContainer> -)) as FC<{ active: ActiveTabsType; children: ReactNode; isFullscreen: boolean }>); -Panels.displayName = 'Panels'; - -const PanelsContainer = styled.div<{ isFullscreen: boolean }>( - { - position: 'fixed', - top: 0, - left: 0, - width: '100vw', - }, - ({ isFullscreen }) => ({ - height: isFullscreen ? '100vh' : 'calc(100% - 40px)', - }) -); - -const Bar = styled.nav( - { - position: 'fixed', - bottom: 0, - left: 0, - width: '100vw', - height: 40, - display: 'flex', - boxShadow: '0 1px 5px 0 rgba(0, 0, 0, 0.1)', - - '& > *': { - flex: 1, - }, - }, - ({ theme }) => ({ - background: theme.barBg, - }) -); - -export interface MobileProps { - options: Pick<State['layout'], 'isFullscreen' | 'showPanel' | 'initialActive' | 'showToolbar'>; - Sidebar: ComponentType<any>; - Preview: ComponentType<any>; - Panel: ComponentType<any>; - Notifications: ComponentType<any>; - viewMode: State['viewMode']; - pages: Addon_PageType[]; -} - -export interface MobileState { - active: ActiveTabsType; -} - -export const Mobile = ({ - Sidebar, - Preview, - Panel, - Notifications, - pages, - viewMode, - options, -}: MobileProps) => { - const [{ active }, setState] = useState({ - active: options.isFullscreen ? CANVAS : options.initialActive || SIDEBAR, - }); - const api = useStorybookApi(); - const handleCanvasClick = useCallback(() => { - setState({ active: CANVAS }); - const id = api.retrieveSelection(); - if (id) { - api.selectStory(id); - } else { - api.selectFirstStory(); - } - }, []); - - const handleSideBarClick = useCallback(() => { - setState({ active: SIDEBAR }); - const id = api.retrieveSelection(); - if (id) { - api.selectStory(id); - } else { - api.selectFirstStory(); - } - }, []); - - return ( - <Root> - <Notifications - placement={{ - position: 'fixed', - bottom: 60, - left: 20, - right: 20, - }} - /> - - <Panels active={active} isFullscreen={options.isFullscreen}> - <Sidebar /> - <div> - <div hidden={viewMode !== 'docs' && viewMode !== 'story'}> - <Preview showToolbar={options.showToolbar} id="main" viewMode={viewMode} /> - </div> - {pages.map(({ id, render: Content }) => ( - <Fragment key={id}> - <Content /> - </Fragment> - ))} - </div> - <Panel hidden={viewMode !== 'story'} /> - </Panels> - {!options.isFullscreen && ( - <Bar> - <TabButton onClick={handleSideBarClick} active={active === SIDEBAR}> - Sidebar - </TabButton> - <TabButton - onClick={handleCanvasClick} - active={active === CANVAS && (viewMode === 'docs' || viewMode === 'story')} - > - Canvas - </TabButton> - <Location> - {({ path }) => ( - <> - {pages.map(({ id, title, url }) => ( - <TabButton - key={id} - onClick={() => { - setState({ active: CANVAS }); - api.navigateUrl(url, { plain: false }); - }} - active={active === CANVAS && path.startsWith(url)} - > - {title} - </TabButton> - ))} - </> - )} - </Location> - {viewMode === 'story' && options.showPanel ? ( - <TabButton onClick={() => setState({ active: ADDONS })} active={active === ADDONS}> - Addons - </TabButton> - ) : null} - </Bar> - )} - </Root> - ); -}; diff --git a/code/ui/manager/src/components/layout/persist.ts b/code/ui/manager/src/components/layout/persist.ts deleted file mode 100644 index 0f5b998cc568..000000000000 --- a/code/ui/manager/src/components/layout/persist.ts +++ /dev/null @@ -1,27 +0,0 @@ -import store from 'store2'; -import debounce from 'lodash/debounce.js'; -import memoize from 'memoizerific'; - -export { store }; - -export const get = () => { - try { - const data = store.local.get(`storybook-layout`); - return data || false; - } catch (e) { - // eslint-disable-next-line no-console - console.error(e); - return false; - } -}; - -const write = memoize(1)((changes) => { - try { - store.local.set(`storybook-layout`, changes); - } catch (e) { - // eslint-disable-next-line no-console - console.error(e); - } -}); - -export const set = debounce(write, 500); diff --git a/code/ui/manager/src/components/layout/useDragging.ts b/code/ui/manager/src/components/layout/useDragging.ts new file mode 100644 index 000000000000..6fe01bd7567e --- /dev/null +++ b/code/ui/manager/src/components/layout/useDragging.ts @@ -0,0 +1,191 @@ +import type { Dispatch, SetStateAction } from 'react'; +import { useEffect, useRef } from 'react'; +import type { LayoutState } from './Layout'; + +// the distance from the edge of the screen at which the panel/sidebar will snap to the edge +const SNAP_THRESHOLD_PX = 30; +const SIDEBAR_MIN_WIDTH_PX = 240; +const RIGHT_PANEL_MIN_WIDTH_PX = 270; +const MIN_WIDTH_STIFFNESS = 0.9; + +/** + * Clamps a value between min and max. + */ +function clamp(value: number, min: number, max: number): number { + return Math.min(Math.max(value, min), max); +} + +/** + * Interpolates a value between min and max based on the relativeValue. + */ +function interpolate(relativeValue: number, min: number, max: number): number { + return min + (max - min) * relativeValue; +} + +export function useDragging({ + setState, + isPanelShown, + isDesktop, +}: { + setState: Dispatch<SetStateAction<LayoutState>>; + isPanelShown: boolean; + isDesktop: boolean; +}) { + const panelResizerRef = useRef<HTMLDivElement>(null); + const sidebarResizerRef = useRef<HTMLDivElement>(null); + + useEffect(() => { + const panelResizer = panelResizerRef.current; + const sidebarResizer = sidebarResizerRef.current; + const previewIframe = document.querySelector('#storybook-preview-iframe') as HTMLIFrameElement; + let draggedElement: typeof panelResizer | typeof sidebarResizer | null = null; + + const onDragStart = (e: MouseEvent) => { + e.preventDefault(); + + setState((state) => ({ + ...state, + isDragging: true, + })); + + if (e.currentTarget === panelResizer) { + draggedElement = panelResizer; + } else if (e.currentTarget === sidebarResizer) { + draggedElement = sidebarResizer; + } + window.addEventListener('mousemove', onDrag); + window.addEventListener('mouseup', onDragEnd); + + if (previewIframe) { + // prevent iframe from capturing mouse events + previewIframe.style.pointerEvents = 'none'; + } + }; + + const onDragEnd = (e: MouseEvent) => { + setState((state) => { + if (draggedElement === sidebarResizer) { + if (state.navSize < SIDEBAR_MIN_WIDTH_PX && state.navSize > 0) { + // snap the sidebar back to its minimum width if it's smaller than the threshold + return { + ...state, + isDragging: false, + navSize: SIDEBAR_MIN_WIDTH_PX, + }; + } + } + if (draggedElement === panelResizer) { + if ( + state.panelPosition === 'right' && + state.rightPanelWidth < RIGHT_PANEL_MIN_WIDTH_PX && + state.rightPanelWidth > 0 + ) { + // snap the right panel back to its minimum width if it's smaller than the threshold + return { + ...state, + isDragging: false, + rightPanelWidth: RIGHT_PANEL_MIN_WIDTH_PX, + }; + } + } + return { + ...state, + isDragging: false, + }; + }); + window.removeEventListener('mousemove', onDrag); + window.removeEventListener('mouseup', onDragEnd); + // make iframe capture pointer events again + previewIframe?.removeAttribute('style'); + draggedElement = null; + }; + + const onDrag = (e: MouseEvent) => { + if (e.buttons === 0) { + onDragEnd(e); + return; + } + + setState((state) => { + if (draggedElement === sidebarResizer) { + const sidebarDragX = e.clientX; + + if (sidebarDragX === state.navSize) { + return state; + } + if (sidebarDragX <= SNAP_THRESHOLD_PX) { + return { + ...state, + navSize: 0, + }; + } + if (sidebarDragX <= SIDEBAR_MIN_WIDTH_PX) { + // set sidebar width to a value in between the actual drag position and the min width, determined by the stiffness + return { + ...state, + navSize: interpolate(MIN_WIDTH_STIFFNESS, sidebarDragX, SIDEBAR_MIN_WIDTH_PX), + }; + } + return { + ...state, + navSize: clamp(sidebarDragX, 0, e.view.innerWidth), + }; + } + if (draggedElement === panelResizer) { + const sizeAxisState = + state.panelPosition === 'bottom' ? 'bottomPanelHeight' : 'rightPanelWidth'; + const panelDragSize = + state.panelPosition === 'bottom' + ? e.view.innerHeight - e.clientY + : e.view.innerWidth - e.clientX; + + if (panelDragSize === state[sizeAxisState]) { + return state; + } + if (panelDragSize <= SNAP_THRESHOLD_PX) { + return { + ...state, + [sizeAxisState]: 0, + }; + } + if (state.panelPosition === 'right' && panelDragSize <= RIGHT_PANEL_MIN_WIDTH_PX) { + // set right panel width to a value in between the actual drag position and the min width, determined by the stiffness + return { + ...state, + [sizeAxisState]: interpolate( + MIN_WIDTH_STIFFNESS, + panelDragSize, + RIGHT_PANEL_MIN_WIDTH_PX + ), + }; + } + + const sizeAxisMax = + state.panelPosition === 'bottom' ? e.view.innerHeight : e.view.innerWidth; + return { + ...state, + [sizeAxisState]: clamp(panelDragSize, 0, sizeAxisMax), + }; + } + return state; + }); + }; + + panelResizer?.addEventListener('mousedown', onDragStart); + sidebarResizer?.addEventListener('mousedown', onDragStart); + + return () => { + panelResizer?.removeEventListener('mousedown', onDragStart); + sidebarResizer?.removeEventListener('mousedown', onDragStart); + // make iframe capture pointer events again + previewIframe?.removeAttribute('style'); + }; + }, [ + // we need to rerun this effect when the panel is shown/hidden or when changing between mobile/desktop to re-attach the event listeners + isPanelShown, + isDesktop, + setState, + ]); + + return { panelResizerRef, sidebarResizerRef }; +} diff --git a/code/ui/manager/src/components/mobile/about/MobileAbout.stories.tsx b/code/ui/manager/src/components/mobile/about/MobileAbout.stories.tsx new file mode 100644 index 000000000000..7ef6f9d89f92 --- /dev/null +++ b/code/ui/manager/src/components/mobile/about/MobileAbout.stories.tsx @@ -0,0 +1,68 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { ManagerContext } from '@storybook/manager-api'; +import React, { useEffect } from 'react'; +import { within } from '@storybook/testing-library'; +import { MobileAbout } from './MobileAbout'; +import { LayoutProvider, useLayout } from '../../layout/LayoutProvider'; + +/** + * A helper component to open the about page via the MobileLayoutContext + */ +const OpenAboutHelper = ({ children }: { children: any }) => { + const { setMobileAboutOpen } = useLayout(); + useEffect(() => { + setMobileAboutOpen(true); + }, [setMobileAboutOpen]); + return children; +}; + +const meta = { + component: MobileAbout, + title: 'Mobile/About', + parameters: { + layout: 'fullscreen', + theme: 'light', + viewport: { + defaultViewport: 'mobile1', + }, + chromatic: { viewports: [320] }, + }, + decorators: [ + (storyFn) => { + return ( + <ManagerContext.Provider + value={ + { + api: { + getCurrentVersion: () => ({ + version: '7.2.0', + }), + }, + } as any + } + > + <LayoutProvider> + <OpenAboutHelper>{storyFn()}</OpenAboutHelper> + </LayoutProvider> + </ManagerContext.Provider> + ); + }, + ], +} satisfies Meta<typeof MobileAbout>; + +export default meta; + +type Story = StoryObj<typeof meta>; + +export const Default: Story = {}; +export const Dark: Story = { + parameters: { theme: 'dark' }, +}; + +export const Closed: Story = { + play: async ({ canvasElement }) => { + await new Promise((resolve) => setTimeout(resolve, 1000)); + const closeButton = await within(canvasElement).getByTitle('Close about section'); + await closeButton.click(); + }, +}; diff --git a/code/ui/manager/src/components/mobile/about/MobileAbout.tsx b/code/ui/manager/src/components/mobile/about/MobileAbout.tsx new file mode 100644 index 000000000000..08103b877083 --- /dev/null +++ b/code/ui/manager/src/components/mobile/about/MobileAbout.tsx @@ -0,0 +1,148 @@ +import type { FC } from 'react'; +import React, { useRef } from 'react'; +import { Transition, type TransitionStatus } from 'react-transition-group'; +import { styled } from '@storybook/theming'; +import { Link } from '@storybook/components'; +import { ArrowLeftIcon, GithubIcon, ShareAltIcon, StorybookIcon } from '@storybook/icons'; +import { UpgradeBlock } from '../../upgrade/UpgradeBlock'; +import { MOBILE_TRANSITION_DURATION } from '../../../constants'; +import { useLayout } from '../../layout/LayoutProvider'; + +export const MobileAbout: FC = () => { + const { isMobileAboutOpen, setMobileAboutOpen } = useLayout(); + const aboutRef = useRef(null); + + return ( + <Transition + nodeRef={aboutRef} + in={isMobileAboutOpen} + timeout={MOBILE_TRANSITION_DURATION} + appear + mountOnEnter + unmountOnExit + > + {(state) => ( + <Container ref={aboutRef} state={state} transitionDuration={MOBILE_TRANSITION_DURATION}> + <Button onClick={() => setMobileAboutOpen(false)} title="Close about section"> + <ArrowLeftIcon /> + Back + </Button> + <LinkContainer> + <LinkLine href="https://github.com/storybookjs/storybook" target="_blank"> + <LinkLeft> + <GithubIcon /> + <span>Github</span> + </LinkLeft> + <ShareAltIcon width={12} /> + </LinkLine> + <LinkLine + href="https://storybook.js.org/docs/react/get-started/install/" + target="_blank" + > + <LinkLeft> + <StorybookIcon /> + <span>Documentation</span> + </LinkLeft> + <ShareAltIcon width={12} /> + </LinkLine> + </LinkContainer> + <UpgradeBlock /> + <BottomText> + Open source software maintained by{' '} + <Link href="https://chromatic.com" target="_blank"> + Chromatic + </Link>{' '} + and the{' '} + <Link href="https://github.com/storybookjs/storybook/graphs/contributors"> + Storybook Community + </Link> + </BottomText> + </Container> + )} + </Transition> + ); +}; + +const Container = styled.div<{ state: TransitionStatus; transitionDuration: number }>( + ({ theme, state, transitionDuration }) => ({ + position: 'absolute', + width: '100%', + height: '100%', + top: 0, + left: 0, + zIndex: 11, + transition: `all ${transitionDuration}ms ease-in-out`, + overflow: 'scroll', + padding: '25px 10px 10px', + color: theme.color.defaultText, + background: theme.background.content, + opacity: `${(() => { + switch (state) { + case 'entering': + case 'entered': + return 1; + case 'exiting': + case 'exited': + return 0; + default: + return 0; + } + })()}`, + transform: `${(() => { + switch (state) { + case 'entering': + case 'entered': + return 'translateX(0)'; + case 'exiting': + case 'exited': + return 'translateX(20px)'; + default: + return 'translateX(0)'; + } + })()}`, + }) +); + +const LinkContainer = styled.div({ + marginTop: 20, + marginBottom: 20, +}); + +const LinkLine = styled.a(({ theme }) => ({ + all: 'unset', + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + fontSize: theme.typography.size.s2 - 1, + height: 52, + borderBottom: `1px solid ${theme.appBorderColor}`, + cursor: 'pointer', + padding: '0 10px', + + '&:last-child': { + borderBottom: 'none', + }, +})); + +const LinkLeft = styled.div(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + fontSize: theme.typography.size.s2 - 1, + height: 40, + gap: 5, +})); + +const BottomText = styled.div(({ theme }) => ({ + fontSize: theme.typography.size.s2 - 1, + marginTop: 30, +})); + +const Button = styled.button(({ theme }) => ({ + all: 'unset', + display: 'flex', + alignItems: 'center', + gap: 10, + color: 'currentColor', + fontSize: theme.typography.size.s2 - 1, + padding: '0 10px', +})); diff --git a/code/ui/manager/src/components/mobile/navigation/MobileAddonsDrawer.tsx b/code/ui/manager/src/components/mobile/navigation/MobileAddonsDrawer.tsx new file mode 100644 index 000000000000..b05dff4c3d25 --- /dev/null +++ b/code/ui/manager/src/components/mobile/navigation/MobileAddonsDrawer.tsx @@ -0,0 +1,59 @@ +import type { FC, ReactNode } from 'react'; +import React, { useRef } from 'react'; +import { styled } from '@storybook/theming'; +import { Transition } from 'react-transition-group'; +import type { TransitionStatus } from 'react-transition-group/Transition'; +import { useLayout } from '../../layout/LayoutProvider'; + +interface MobileAddonsDrawerProps { + children: ReactNode; +} + +const TRANSITION_DURATION = 200; + +const Container = styled.div<{ state: TransitionStatus }>(({ theme, state }) => ({ + position: 'fixed', + boxSizing: 'border-box', + width: '100%', + background: theme.background.content, + height: '50%', + bottom: 0, + left: 0, + zIndex: 11, + transition: `all ${TRANSITION_DURATION}ms ease-in-out`, + overflow: 'hidden', + borderTop: `1px solid ${theme.appBorderColor}`, + transform: `${(() => { + switch (state) { + case 'entering': + case 'entered': + return 'translateY(0)'; + case 'exiting': + case 'exited': + return 'translateY(100%)'; + default: + return 'translateY(0)'; + } + })()}`, +})); + +export const MobileAddonsDrawer: FC<MobileAddonsDrawerProps> = ({ children }) => { + const { isMobilePanelOpen } = useLayout(); + const containerRef = useRef(null); + + return ( + <Transition + nodeRef={containerRef} + in={isMobilePanelOpen} + timeout={TRANSITION_DURATION} + mountOnEnter + unmountOnExit + > + {(state) => ( + <Container ref={containerRef} state={state}> + {children} + </Container> + )} + </Transition> + ); +}; diff --git a/code/ui/manager/src/components/mobile/navigation/MobileMenuDrawer.tsx b/code/ui/manager/src/components/mobile/navigation/MobileMenuDrawer.tsx new file mode 100644 index 000000000000..bd3d0cf46f25 --- /dev/null +++ b/code/ui/manager/src/components/mobile/navigation/MobileMenuDrawer.tsx @@ -0,0 +1,146 @@ +import type { FC } from 'react'; +import React, { useRef } from 'react'; +import { styled } from '@storybook/theming'; +import { Transition } from 'react-transition-group'; +import type { TransitionStatus } from 'react-transition-group/Transition'; +import { MobileAbout } from '../about/MobileAbout'; +import { MOBILE_TRANSITION_DURATION } from '../../../constants'; +import { useLayout } from '../../layout/LayoutProvider'; + +interface MobileMenuDrawerProps { + children?: React.ReactNode; +} + +export const MobileMenuDrawer: FC<MobileMenuDrawerProps> = ({ children }) => { + const containerRef = useRef<HTMLDivElement>(null); + const sidebarRef = useRef<HTMLDivElement>(null); + const overlayRef = useRef<HTMLDivElement>(null); + const { isMobileMenuOpen, setMobileMenuOpen, isMobileAboutOpen, setMobileAboutOpen } = + useLayout(); + + return ( + <> + <Transition + nodeRef={containerRef} + in={isMobileMenuOpen} + timeout={MOBILE_TRANSITION_DURATION} + mountOnEnter + unmountOnExit + onExited={() => setMobileAboutOpen(false)} + > + {(state) => ( + <Container ref={containerRef} state={state}> + <Transition + nodeRef={sidebarRef} + in={!isMobileAboutOpen} + timeout={MOBILE_TRANSITION_DURATION} + > + {(sidebarState) => ( + <SidebarContainer ref={sidebarRef} state={sidebarState}> + {children} + </SidebarContainer> + )} + </Transition> + <MobileAbout /> + </Container> + )} + </Transition> + <Transition + nodeRef={overlayRef} + in={isMobileMenuOpen} + timeout={MOBILE_TRANSITION_DURATION} + mountOnEnter + unmountOnExit + > + {(state) => ( + <Overlay + ref={overlayRef} + state={state} + onClick={() => setMobileMenuOpen(false)} + aria-label="Close navigation menu" + /> + )} + </Transition> + </> + ); +}; + +const Container = styled.div<{ state: TransitionStatus }>(({ theme, state }) => ({ + position: 'fixed', + boxSizing: 'border-box', + width: '100%', + background: theme.background.content, + height: '80%', + bottom: 0, + left: 0, + zIndex: 11, + borderRadius: '10px 10px 0 0', + transition: `all ${MOBILE_TRANSITION_DURATION}ms ease-in-out`, + overflow: 'hidden', + transform: `${(() => { + if (state === 'entering') return 'translateY(0)'; + if (state === 'entered') return 'translateY(0)'; + if (state === 'exiting') return 'translateY(100%)'; + if (state === 'exited') return 'translateY(100%)'; + return 'translateY(0)'; + })()}`, +})); + +const SidebarContainer = styled.div<{ state: TransitionStatus }>(({ theme, state }) => ({ + position: 'absolute', + width: '100%', + height: '100%', + top: 0, + left: 0, + zIndex: 1, + transition: `all ${MOBILE_TRANSITION_DURATION}ms ease-in-out`, + overflow: 'hidden', + opacity: `${(() => { + if (state === 'entered') return 1; + if (state === 'entering') return 1; + if (state === 'exiting') return 0; + if (state === 'exited') return 0; + return 1; + })()}`, + transform: `${(() => { + switch (state) { + case 'entering': + case 'entered': + return 'translateX(0)'; + case 'exiting': + case 'exited': + return 'translateX(-20px)'; + default: + return 'translateX(0)'; + } + })()}`, +})); + +const Overlay = styled.div<{ state: TransitionStatus }>(({ state }) => ({ + position: 'fixed', + boxSizing: 'border-box', + background: 'rgba(0, 0, 0, 0.5)', + top: 0, + bottom: 0, + right: 0, + left: 0, + zIndex: 10, + transition: `all ${MOBILE_TRANSITION_DURATION}ms ease-in-out`, + cursor: 'pointer', + opacity: `${(() => { + switch (state) { + case 'entering': + case 'entered': + return 1; + case 'exiting': + case 'exited': + return 0; + default: + return 0; + } + })()}`, + + '&:hover': { + background: 'rgba(0, 0, 0, 0.6)', + }, +})); diff --git a/code/ui/manager/src/components/mobile/navigation/MobileNavigation.stories.tsx b/code/ui/manager/src/components/mobile/navigation/MobileNavigation.stories.tsx new file mode 100644 index 000000000000..63e48dc366da --- /dev/null +++ b/code/ui/manager/src/components/mobile/navigation/MobileNavigation.stories.tsx @@ -0,0 +1,191 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import { ManagerContext } from '@storybook/manager-api'; +import { within } from '@storybook/testing-library'; +import { startCase } from 'lodash'; +import { MobileNavigation } from './MobileNavigation'; +import { LayoutProvider, useLayout } from '../../layout/LayoutProvider'; + +const MockPanel = () => { + const { setMobilePanelOpen } = useLayout(); + return ( + <div> + panel + <button type="button" title="Close addon panel" onClick={() => setMobilePanelOpen(false)}> + close + </button> + </div> + ); +}; + +const renderLabel = ({ name }: { name: string }) => startCase(name); + +const mockManagerStore: any = { + state: { + index: { + someRootId: { + type: 'root', + id: 'someRootId', + name: 'root', + isRoot: true, + isComponent: false, + isLeaf: false, + renderLabel, + }, + someComponentId: { + type: 'component', + id: 'someComponentId', + name: 'component', + parent: 'someRootId', + isRoot: false, + isComponent: true, + isLeaf: false, + renderLabel, + }, + someStoryId: { + type: 'story', + id: 'someStoryId', + name: 'story', + parent: 'someComponentId', + isRoot: false, + isComponent: false, + isLeaf: true, + renderLabel, + }, + }, + }, + api: { + getCurrentStoryData() { + return mockManagerStore.state.index.someStoryId; + }, + }, +}; + +const meta = { + component: MobileNavigation, + title: 'Mobile/Navigation', + decorators: [ + (storyFn) => ( + <ManagerContext.Provider value={mockManagerStore}> + <LayoutProvider> + <div style={{ display: 'flex', flexDirection: 'column', height: '100svh' }}> + <div style={{ flex: 1 }} /> + {storyFn()} + </div> + </LayoutProvider> + </ManagerContext.Provider> + ), + ], + parameters: { + layout: 'fullscreen', + theme: 'light', + viewport: { + defaultViewport: 'mobile1', + }, + chromatic: { viewports: [320] }, + }, + args: { + menu: <div>navigation menu</div>, + panel: <MockPanel />, + showPanel: true, + }, +} satisfies Meta<typeof MobileNavigation>; + +export default meta; + +type Story = StoryObj<typeof meta>; + +export const Default: Story = {}; +export const Dark: Story = { + parameters: { theme: 'dark' }, +}; + +export const LongStoryName: Story = { + decorators: [ + (storyFn) => { + const mockManagerStoreWithLongNames: any = { + state: { + index: { + someRootId: { + type: 'root', + id: 'someRootId', + name: 'someLongRootName', + isRoot: true, + isComponent: false, + isLeaf: false, + renderLabel, + }, + someComponentId: { + type: 'component', + id: 'someComponentId', + name: 'someComponentName', + parent: 'someRootId', + isRoot: false, + isComponent: true, + isLeaf: false, + renderLabel, + }, + someStoryId: { + type: 'story', + id: 'someStoryId', + name: 'someLongStoryName', + parent: 'someComponentId', + isRoot: false, + isComponent: false, + isLeaf: true, + renderLabel, + }, + }, + }, + api: { + getCurrentStoryData() { + return mockManagerStoreWithLongNames.state.index.someStoryId; + }, + }, + }; + return ( + <ManagerContext.Provider value={mockManagerStoreWithLongNames}> + {storyFn()} + </ManagerContext.Provider> + ); + }, + ], +}; + +export const MenuOpen: Story = { + play: async ({ canvasElement }) => { + const menuOpen = await within(canvasElement).getByTitle('Open navigation menu'); + await menuOpen.click(); + }, +}; + +export const MenuClosed: Story = { + play: async (context) => { + await MenuOpen.play(context); + await new Promise((resolve) => setTimeout(resolve, 500)); + const overlay = await within(context.canvasElement).getByLabelText('Close navigation menu'); + await overlay.click(); + }, +}; + +export const PanelOpen: Story = { + play: async ({ canvasElement }) => { + const panelButton = await within(canvasElement).getByTitle('Open addon panel'); + await panelButton.click(); + }, +}; + +export const PanelClosed: Story = { + play: async (context) => { + await PanelOpen.play(context); + await new Promise((resolve) => setTimeout(resolve, 500)); + const closeButton = await within(context.canvasElement).getByTitle('Close addon panel'); + await closeButton.click(); + }, +}; + +export const PanelDisabled: Story = { + args: { + showPanel: false, + }, +}; diff --git a/code/ui/manager/src/components/mobile/navigation/MobileNavigation.tsx b/code/ui/manager/src/components/mobile/navigation/MobileNavigation.tsx new file mode 100644 index 000000000000..7174b8bd6a2e --- /dev/null +++ b/code/ui/manager/src/components/mobile/navigation/MobileNavigation.tsx @@ -0,0 +1,95 @@ +import type { FC } from 'react'; +import React from 'react'; +import { styled } from '@storybook/theming'; +import { IconButton } from '@storybook/components'; +import { useStorybookApi, useStorybookState } from '@storybook/manager-api'; +import { BottomBarToggleIcon, MenuIcon } from '@storybook/icons'; +import { MobileMenuDrawer } from './MobileMenuDrawer'; +import { MobileAddonsDrawer } from './MobileAddonsDrawer'; +import { useLayout } from '../../layout/LayoutProvider'; + +interface MobileNavigationProps { + menu?: React.ReactNode; + panel?: React.ReactNode; + showPanel: boolean; +} + +/** + * walks the tree from the current story to combine story+component+folder names into a single string + */ +const useFullStoryName = () => { + const { index } = useStorybookState(); + const currentStory = useStorybookApi().getCurrentStoryData(); + + if (!currentStory) return ''; + + let fullStoryName = currentStory.renderLabel?.(currentStory) || currentStory.name; + let node = index[currentStory.id]; + + while ('parent' in node && node.parent && index[node.parent] && fullStoryName.length < 24) { + node = index[node.parent]; + const parentName = node.renderLabel?.(node) || node.name; + fullStoryName = `${parentName}/${fullStoryName}`; + } + return fullStoryName; +}; + +export const MobileNavigation: FC<MobileNavigationProps> = ({ menu, panel, showPanel }) => { + const { isMobileMenuOpen, setMobileMenuOpen, setMobilePanelOpen } = useLayout(); + const fullStoryName = useFullStoryName(); + + return ( + <Container> + <MobileMenuDrawer>{menu}</MobileMenuDrawer> + <MobileAddonsDrawer>{panel}</MobileAddonsDrawer> + <Button onClick={() => setMobileMenuOpen(!isMobileMenuOpen)} title="Open navigation menu"> + <MenuIcon /> + <Text>{fullStoryName}</Text> + </Button> + {showPanel && ( + <IconButton onClick={() => setMobilePanelOpen(true)} title="Open addon panel"> + <BottomBarToggleIcon /> + </IconButton> + )} + </Container> + ); +}; + +const Container = styled.div(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + bottom: 0, + left: 0, + width: '100%', + height: 40, + zIndex: 10, + background: theme.barBg, + padding: '0 6px', + borderTop: `1px solid ${theme.appBorderColor}`, +})); + +const Button = styled.button(({ theme }) => ({ + all: 'unset', + display: 'flex', + alignItems: 'center', + gap: 10, + color: theme.color.mediumdark, + fontSize: `${theme.typography.size.s2 - 1}px`, + padding: '0 7px', + fontWeight: theme.typography.weight.bold, + WebkitLineClamp: 1, + + '> svg': { + width: 14, + height: 14, + flexShrink: 0, + }, +})); + +const Text = styled.p({ + display: '-webkit-box', + WebkitLineClamp: 1, + WebkitBoxOrient: 'vertical', + overflow: 'hidden', +}); diff --git a/code/ui/manager/src/components/notifications/NotificationItem.stories.jsx b/code/ui/manager/src/components/notifications/NotificationItem.stories.jsx deleted file mode 100644 index b60f985a5fee..000000000000 --- a/code/ui/manager/src/components/notifications/NotificationItem.stories.jsx +++ /dev/null @@ -1,266 +0,0 @@ -import React from 'react'; -import { LocationProvider } from '@storybook/router'; -import NotificationItem from './NotificationItem'; - -export default { - component: NotificationItem, - title: 'Notifications/NotificationItem', - decorators: [ - (StoryFn) => ( - <LocationProvider> - <StoryFn /> - </LocationProvider> - ), - (storyFn) => <div style={{ width: '240px', margin: '1rem' }}>{storyFn()}</div>, - ], - excludeStories: /.*Data$/, -}; - -const onClear = () => {}; -const onDismissNotification = () => {}; - -const Template = (args) => <NotificationItem {...args} />; - -export const simpleData = { - id: '1', - onClear, - content: { - headline: 'Storybook cool!', - }, -}; - -export const Simple = Template.bind({}); - -Simple.args = { - notification: simpleData, - onDismissNotification, -}; - -export const longHeadlineData = { - id: '2', - onClear, - content: { - headline: 'This is a long message that extends over two lines!', - }, -}; - -export const LongHeadline = Template.bind({}); - -LongHeadline.args = { - notification: longHeadlineData, - onDismissNotification, -}; - -export const linkData = { - id: '3', - onClear, - content: { - headline: 'Storybook X.X is available! Download now »', - }, - link: '/some/path', -}; - -export const Link = Template.bind({}); - -Link.args = { - notification: linkData, - onDismissNotification, -}; - -export const linkIconWithColorData = { - id: '4', - onClear, - content: { - headline: 'Storybook with a smile!', - }, - icon: { - name: 'facehappy', - color: 'hotpink', - }, - link: '/some/path', -}; - -export const LinkIconWithColor = Template.bind({}); - -LinkIconWithColor.args = { - notification: linkIconWithColorData, - onDismissNotification, -}; - -export const linkIconWithColorSubHeadlineData = { - id: '5', - onClear, - content: { - headline: 'Storybook X.X is available with a smile! Download now »', - subHeadline: 'This link also has a sub headline', - }, - icon: { - name: 'facehappy', - color: 'tomato', - }, - link: '/some/path', -}; - -export const LinkIconWithColorSubHeadline = Template.bind({}); - -LinkIconWithColorSubHeadline.args = { - notification: linkIconWithColorSubHeadlineData, - onDismissNotification, -}; - -export const bookIconData = { - id: '6', - onClear, - content: { - headline: 'Storybook has a book icon!', - }, - icon: { - name: 'book', - }, -}; - -export const BookIcon = Template.bind({}); - -BookIcon.args = { - notification: bookIconData, - onDismissNotification, -}; - -export const strongSubHeadlineData = { - id: '7', - onClear, - content: { - headline: 'Storybook has a book icon!', - subHeadline: <strong>Strong subHeadline</strong>, - }, - icon: { - name: 'book', - }, -}; - -export const StrongSubHeadline = Template.bind({}); - -StrongSubHeadline.args = { - notification: strongSubHeadlineData, - onDismissNotification, -}; - -export const strongEmphasizedSubHeadlineData = { - id: '8', - onClear, - content: { - headline: 'Storybook cool!', - subHeadline: ( - <span> - <em>Emphasized</em> normal <strong>strong Storybook!</strong> - </span> - ), - }, - icon: { - name: 'book', - }, -}; - -export const StrongEmphasizedSubHeadline = Template.bind({}); - -StrongEmphasizedSubHeadline.args = { - notification: strongEmphasizedSubHeadlineData, - onDismissNotification, -}; - -export const bookIconSubHeadlineData = { - id: '9', - onClear, - content: { - headline: 'Storybook has a book icon!', - subHeadline: 'Find out more!', - }, - icon: { - name: 'book', - }, -}; - -export const BookIconSubHeadline = Template.bind({}); - -BookIconSubHeadline.args = { - notification: bookIconSubHeadlineData, - onDismissNotification, -}; - -export const bookIconLongSubHeadlineData = { - id: '10', - onClear, - content: { - headline: 'Storybook has a book icon!', - subHeadline: - 'Find out more! by clicking on on buttons and downloading some applications. Find out more! by clicking on buttons and downloading some applications', - }, - icon: { - name: 'book', - }, -}; - -export const BookIconLongSubHeadline = Template.bind({}); - -BookIconLongSubHeadline.args = { - notification: bookIconLongSubHeadlineData, - onDismissNotification, -}; - -export const accessibilityIconData = { - id: '11', - onClear, - content: { - headline: 'Storybook has a accessibility icon!', - subHeadline: 'It is here!', - }, - icon: { - name: 'accessibility', - }, -}; - -export const AccessibilityIcon = Template.bind({}); - -AccessibilityIcon.args = { - notification: accessibilityIconData, - onDismissNotification, -}; - -export const accessibilityGoldIconData = { - id: '12', - onClear, - content: { - headline: 'Accessibility icon!', - subHeadline: 'It is gold!', - }, - icon: { - name: 'accessibility', - color: 'gold', - }, -}; - -export const AccessibilityGoldIcon = Template.bind({}); - -AccessibilityGoldIcon.args = { - notification: accessibilityGoldIconData, - onDismissNotification, -}; - -export const accessibilityGoldIconLongHeadLineNoSubHeadlineData = { - id: '13', - onClear, - content: { - headline: 'Storybook notifications has a accessibility icon it can be any color!', - }, - icon: { - name: 'accessibility', - color: 'gold', - }, -}; - -export const AccessibilityGoldIconLongHeadLineNoSubHeadline = Template.bind({}); - -AccessibilityGoldIconLongHeadLineNoSubHeadline.args = { - notification: accessibilityGoldIconLongHeadLineNoSubHeadlineData, - onDismissNotification, -}; diff --git a/code/ui/manager/src/components/notifications/NotificationItem.stories.tsx b/code/ui/manager/src/components/notifications/NotificationItem.stories.tsx new file mode 100644 index 000000000000..87755129055e --- /dev/null +++ b/code/ui/manager/src/components/notifications/NotificationItem.stories.tsx @@ -0,0 +1,256 @@ +import React from 'react'; +import { LocationProvider } from '@storybook/router'; +import type { Meta, StoryObj } from '@storybook/react'; +import NotificationItem from './NotificationItem'; + +const meta = { + component: NotificationItem, + title: 'Notifications/NotificationItem', + decorators: [ + (Story) => ( + <LocationProvider> + <Story /> + </LocationProvider> + ), + (Story) => ( + <div style={{ width: '240px', margin: '1rem' }}> + <Story /> + </div> + ), + ], + excludeStories: /.*Data$/, +} satisfies Meta<typeof NotificationItem>; + +export default meta; +type Story = StoryObj<typeof meta>; + +const onClear = () => {}; +const onDismissNotification = () => {}; + +export const Simple: Story = { + args: { + notification: { + id: '1', + onClear, + content: { + headline: 'Storybook cool!', + }, + link: '/some/path', + }, + onDismissNotification, + }, +}; + +export const LongHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '2', + onClear, + content: { + headline: 'This is a long message that extends over two lines!', + }, + link: '/some/path', + }, + }, +}; + +export const Link: Story = { + args: { + ...Simple.args, + notification: { + id: '3', + onClear, + content: { + headline: 'Storybook X.X is available! Download now »', + }, + link: '/some/path', + }, + }, +}; + +export const LinkIconWithColor: Story = { + args: { + ...Simple.args, + notification: { + id: '4', + onClear, + content: { + headline: 'Storybook with a smile!', + }, + icon: { + name: 'facehappy', + color: 'hotpink', + }, + link: '/some/path', + }, + }, +}; + +export const LinkIconWithColorSubHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '5', + onClear, + content: { + headline: 'Storybook X.X is available with a smile! Download now »', + subHeadline: 'This link also has a sub headline', + }, + icon: { + name: 'facehappy', + color: 'tomato', + }, + link: '/some/path', + }, + }, +}; + +export const BookIcon: Story = { + args: { + ...Simple.args, + notification: { + id: '6', + onClear, + content: { + headline: 'Storybook has a book icon!', + }, + icon: { + name: 'book', + }, + link: '/some/path', + }, + }, +}; + +export const StrongSubHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '7', + onClear, + content: { + headline: 'Storybook has a book icon!', + subHeadline: <strong>Strong subHeadline</strong>, + }, + icon: { + name: 'book', + }, + link: '/some/path', + }, + }, +}; + +export const StrongEmphasizedSubHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '8', + onClear, + content: { + headline: 'Storybook cool!', + subHeadline: ( + <span> + <em>Emphasized</em> normal <strong>strong Storybook!</strong> + </span> + ), + }, + icon: { + name: 'book', + }, + link: '/some/path', + }, + }, +}; + +export const BookIconSubHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '9', + onClear, + content: { + headline: 'Storybook has a book icon!', + subHeadline: 'Find out more!', + }, + icon: { + name: 'book', + }, + link: '/some/path', + }, + }, +}; + +export const BookIconLongSubHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '10', + onClear, + content: { + headline: 'Storybook has a book icon!', + subHeadline: + 'Find out more! by clicking on on buttons and downloading some applications. Find out more! by clicking on buttons and downloading some applications', + }, + icon: { + name: 'book', + }, + link: '/some/path', + }, + }, +}; + +export const AccessibilityIcon: Story = { + args: { + ...Simple.args, + notification: { + id: '11', + onClear, + content: { + headline: 'Storybook has a accessibility icon!', + subHeadline: 'It is here!', + }, + icon: { + name: 'accessibility', + }, + link: '/some/path', + }, + }, +}; + +export const AccessibilityGoldIcon: Story = { + args: { + ...Simple.args, + notification: { + id: '12', + onClear, + content: { + headline: 'Accessibility icon!', + subHeadline: 'It is gold!', + }, + icon: { + name: 'accessibility', + color: 'gold', + }, + link: '/some/path', + }, + }, +}; + +export const AccessibilityGoldIconLongHeadLineNoSubHeadline: Story = { + args: { + ...Simple.args, + notification: { + id: '13', + onClear, + content: { + headline: 'Storybook notifications has a accessibility icon it can be any color!', + }, + icon: { + name: 'accessibility', + color: 'gold', + }, + link: '/some/path', + }, + }, +}; diff --git a/code/ui/manager/src/components/notifications/NotificationItem.tsx b/code/ui/manager/src/components/notifications/NotificationItem.tsx index b2c90a6a0403..3131d2116cbe 100644 --- a/code/ui/manager/src/components/notifications/NotificationItem.tsx +++ b/code/ui/manager/src/components/notifications/NotificationItem.tsx @@ -5,6 +5,7 @@ import { Link } from '@storybook/router'; import { styled, useTheme } from '@storybook/theming'; import { Icons, IconButton, type IconsProps } from '@storybook/components'; import { transparentize } from 'polished'; +import { CloseAltIcon } from '@storybook/icons'; const Notification = styled.div(({ theme }) => ({ position: 'relative', @@ -115,7 +116,7 @@ const DismissNotificationItem: FC<{ onDismiss(); }} > - <Icons icon="closeAlt" height={12} width={12} /> + <CloseAltIcon size={12} /> </DismissButtonWrapper> ); diff --git a/code/ui/manager/src/components/notifications/NotificationList.stories.jsx b/code/ui/manager/src/components/notifications/NotificationList.stories.jsx deleted file mode 100644 index 72eb3247f76b..000000000000 --- a/code/ui/manager/src/components/notifications/NotificationList.stories.jsx +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; -import { LocationProvider } from '@storybook/router'; - -import NotificationList from './NotificationList'; -import itemMeta, * as itemStories from './NotificationItem.stories.jsx'; - -export default { - component: NotificationList, - title: 'Notifications/NotificationList', - decorators: [ - (StoryFn) => ( - <LocationProvider> - <StoryFn /> - </LocationProvider> - ), - - (storyFn) => ( - <div style={{ width: '240px', margin: '1rem', position: 'relative', height: '100%' }}> - {storyFn()} - </div> - ), - ], - excludeStories: /.*Data$/, -}; - -// eslint-disable-next-line no-underscore-dangle, import/namespace -const ordering = itemStories.__namedExportsOrder; - -const items = (Array.isArray(ordering) ? ordering : Array.from(Object.keys(itemStories))) - .filter((key) => itemMeta.excludeStories.exec(key)) - // eslint-disable-next-line import/namespace - .map((key) => itemStories[key]); - -export const singleData = [items[0]]; -export const allData = items; - -function clearNotification(id) {} - -export const Single = () => ( - <NotificationList - notifications={singleData} - clearNotification={clearNotification} - placement={{ position: 'relative' }} - /> -); - -export const All = () => ( - <NotificationList - notifications={allData} - clearNotification={clearNotification} - placement={{ position: 'relative' }} - /> -); - -export const Placement = () => ( - // Note: position:absolute is only for QA/testing. Use position:fixed when integrating into the real UI. - <NotificationList - placement={{ position: 'absolute', left: 20, bottom: 20 }} - clearNotification={clearNotification} - notifications={allData} - /> -); diff --git a/code/ui/manager/src/components/notifications/NotificationList.stories.tsx b/code/ui/manager/src/components/notifications/NotificationList.stories.tsx new file mode 100644 index 000000000000..e75c77965b03 --- /dev/null +++ b/code/ui/manager/src/components/notifications/NotificationList.stories.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { LocationProvider } from '@storybook/router'; +import type { Meta, StoryObj } from '@storybook/react'; + +import { NotificationList } from './NotificationList'; +import * as itemStories from './NotificationItem.stories'; + +const meta = { + component: NotificationList, + title: 'Notifications/NotificationList', + decorators: [ + (StoryFn) => ( + <LocationProvider> + <StoryFn /> + </LocationProvider> + ), + + (storyFn) => ( + <div style={{ width: '240px', margin: '1rem', position: 'relative', height: '100%' }}> + {storyFn()} + </div> + ), + ], + excludeStories: /.*Data$/, +} satisfies Meta<typeof NotificationList>; + +export default meta; +type Story = StoryObj<typeof meta>; + +type ItemStories = typeof itemStories & { [key: string]: any }; + +const items = Array.from(Object.keys(itemStories as ItemStories)) + .filter((key) => !['default', '__namedExportsOrder'].includes(key)) + .map((key) => (itemStories as ItemStories)[key].args.notification); + +export const Single: Story = { + args: { + notifications: [items[0]], + clearNotification: () => {}, + }, +}; + +export const Multiple: Story = { + args: { + notifications: items.slice(0, 3), + clearNotification: () => {}, + }, +}; diff --git a/code/ui/manager/src/components/notifications/NotificationList.tsx b/code/ui/manager/src/components/notifications/NotificationList.tsx index cc340ef0522f..d16942d57f0c 100644 --- a/code/ui/manager/src/components/notifications/NotificationList.tsx +++ b/code/ui/manager/src/components/notifications/NotificationList.tsx @@ -4,41 +4,46 @@ import type { State } from '@storybook/manager-api'; import { styled } from '@storybook/theming'; import type { CSSObject } from '@storybook/theming'; import NotificationItem from './NotificationItem'; +import { MEDIA_DESKTOP_BREAKPOINT } from '../../constants'; -const List = styled.div<{ placement?: CSSObject }>( - { - zIndex: 11, +interface NotificationListProps { + notifications: State['notifications']; + clearNotification: (id: string) => void; +} + +export const NotificationList: FC<NotificationListProps> = ({ + notifications, + clearNotification, +}) => { + return ( + <List> + {notifications && + notifications.map((notification) => ( + <NotificationItem + key={notification.id} + onDismissNotification={(id: string) => clearNotification(id)} + notification={notification} + /> + ))} + </List> + ); +}; + +const List = styled.div<{ placement?: CSSObject }>({ + zIndex: 200, + position: 'fixed', + left: 20, + bottom: 60, - '> * + *': { - marginTop: 10, - }, - '&:empty': { - display: 'none', - }, + [MEDIA_DESKTOP_BREAKPOINT]: { + bottom: 20, }, - ({ placement }) => - placement || { - bottom: 0, - left: 0, - right: 0, - position: 'fixed', - } -); -const NotificationList: FC<{ - placement: CSSObject; - notifications: State['notifications']; - clearNotification: (id: string) => void; -}> = ({ notifications, clearNotification, placement = undefined }) => ( - <List placement={placement}> - {notifications.map((notification) => ( - <NotificationItem - key={notification.id} - onDismissNotification={(id: string) => clearNotification(id)} - notification={notification} - /> - ))} - </List> -); + '> * + *': { + marginTop: 10, + }, -export default NotificationList; + '&:empty': { + display: 'none', + }, +}); diff --git a/code/ui/manager/src/components/panel/panel.stories.tsx b/code/ui/manager/src/components/panel/Panel.stories.tsx similarity index 72% rename from code/ui/manager/src/components/panel/panel.stories.tsx rename to code/ui/manager/src/components/panel/Panel.stories.tsx index f3f523f29c65..e4f5c8ed493e 100644 --- a/code/ui/manager/src/components/panel/panel.stories.tsx +++ b/code/ui/manager/src/components/panel/Panel.stories.tsx @@ -1,28 +1,44 @@ +import type { EventHandler, FocusEvent, MouseEvent } from 'react'; import React, { useCallback, useRef, useState } from 'react'; import { action } from '@storybook/addon-actions'; -import { Badge, Icons, Spaced } from '@storybook/components'; +import { Badge, Spaced } from '@storybook/components'; +import type { Addon_BaseType, Addon_Collection } from '@storybook/types'; import { Addon_TypesEnum } from '@storybook/types'; -import Panel from './panel'; -import { panels, shortcuts } from '../layout/app.mockdata'; +import { BellIcon } from '@storybook/icons'; +import { AddonPanel } from './Panel'; +import { defaultShortcuts } from '../../settings/defaultShortcuts'; const onSelect = action('onSelect'); const toggleVisibility = action('toggleVisibility'); const togglePosition = action('togglePosition'); +const panels: Addon_Collection<Addon_BaseType> = { + test1: { + title: 'Test 1', + type: Addon_TypesEnum.PANEL, + render: ({ active }) => (active ? <div id="test1">TEST 1</div> : null), + }, + test2: { + title: 'Test 2', + type: Addon_TypesEnum.PANEL, + render: ({ active }) => (active ? <div id="test2">TEST 2</div> : null), + }, +}; + export default { title: 'Panel', - component: Panel, + component: AddonPanel, }; export const Default = () => { const [selectedPanel, setSelectedPanel] = useState('test2'); return ( - <Panel + <AddonPanel absolute={false} panels={panels} actions={{ onSelect: setSelectedPanel, toggleVisibility, togglePosition }} selectedPanel={selectedPanel} - shortcuts={shortcuts} + shortcuts={defaultShortcuts} /> ); }; @@ -30,7 +46,7 @@ export const Default = () => { export const JSXTitles = () => { const [selectedPanel, setSelectedPanel] = useState('function-string'); return ( - <Panel + <AddonPanel absolute={false} panels={{ 'function-string': { @@ -56,7 +72,7 @@ export const JSXTitles = () => { <div> <Spaced col={1}> <div style={{ display: 'inline-block', verticalAlign: 'middle' }}>Alert!</div> - <Icons icon="bell" /> + <BellIcon /> </Spaced> </div> ), @@ -69,7 +85,7 @@ export const JSXTitles = () => { const [count, setCount] = useState(0); const timer = useRef(null); - const startTimer = useCallback((event) => { + const startTimer = useCallback<EventHandler<MouseEvent<any>>>((event) => { event.stopPropagation(); if (timer.current) { return; @@ -85,13 +101,16 @@ export const JSXTitles = () => { }); }, 1000); }, []); - const stopTimer = useCallback((event) => { - event.stopPropagation(); - if (timer.current) { - clearInterval(timer.current); - timer.current = null; - } - }, []); + const stopTimer = useCallback<EventHandler<MouseEvent<any> | FocusEvent<any>>>( + (event) => { + event.stopPropagation(); + if (timer.current) { + clearInterval(timer.current); + timer.current = null; + } + }, + [] + ); return ( <div @@ -116,15 +135,15 @@ export const JSXTitles = () => { }} actions={{ onSelect: setSelectedPanel, toggleVisibility, togglePosition }} selectedPanel={selectedPanel} - shortcuts={shortcuts} + shortcuts={defaultShortcuts} /> ); }; export const NoPanels = () => ( - <Panel + <AddonPanel panels={{}} actions={{ onSelect, toggleVisibility, togglePosition }} - shortcuts={shortcuts} + shortcuts={defaultShortcuts} /> ); diff --git a/code/ui/manager/src/components/panel/panel.tsx b/code/ui/manager/src/components/panel/Panel.tsx similarity index 53% rename from code/ui/manager/src/components/panel/panel.tsx rename to code/ui/manager/src/components/panel/Panel.tsx index 6abcce50f0e9..8dd1c2909c2c 100644 --- a/code/ui/manager/src/components/panel/panel.tsx +++ b/code/ui/manager/src/components/panel/Panel.tsx @@ -1,9 +1,11 @@ -import React, { Component, Fragment } from 'react'; -import { Tabs, Icons, IconButton } from '@storybook/components'; +import React, { Component } from 'react'; +import { Tabs, IconButton } from '@storybook/components'; import type { State } from '@storybook/manager-api'; import { shortcutToHumanString } from '@storybook/manager-api'; import type { Addon_BaseType } from '@storybook/types'; -import useMediaQuery from '../hooks/useMedia'; +import { styled } from '@storybook/theming'; +import { BottomBarIcon, CloseIcon, SidebarAltIcon } from '@storybook/icons'; +import { useLayout } from '../layout/LayoutProvider'; export interface SafeTabProps { title: Addon_BaseType['title']; @@ -23,6 +25,7 @@ class SafeTab extends Component<SafeTabProps, { hasError: boolean }> { console.error(error, info); } + // @ts-expect-error (we know this is broken) render() { const { hasError } = this.state; const { children } = this.props; @@ -33,7 +36,7 @@ class SafeTab extends Component<SafeTabProps, { hasError: boolean }> { } } -const AddonPanel = React.memo<{ +export const AddonPanel = React.memo<{ selectedPanel?: string; actions: { onSelect: (id: string) => void } & Record<string, any>; panels: Record<string, Addon_BaseType>; @@ -49,7 +52,8 @@ const AddonPanel = React.memo<{ panelPosition = 'right', absolute = true, }) => { - const isTablet = useMediaQuery('(min-width: 599px)'); + const { isDesktop, setMobilePanelOpen } = useLayout(); + return ( <Tabs absolute={absolute} @@ -57,30 +61,37 @@ const AddonPanel = React.memo<{ menuName="Addons" actions={actions} tools={ - isTablet ? ( - <Fragment> - <IconButton - key="position" - onClick={actions.togglePosition} - title={`Change addon orientation [${shortcutToHumanString( - shortcuts.panelPosition - )}]`} - > - <Icons icon={panelPosition === 'bottom' ? 'sidebaralt' : 'bottombar'} /> - </IconButton> - <IconButton - key="visibility" - onClick={actions.toggleVisibility} - title={`Hide addons [${shortcutToHumanString(shortcuts.togglePanel)}]`} - > - <Icons icon="close" /> + <Actions> + {isDesktop ? ( + <> + <IconButton + key="position" + onClick={actions.togglePosition} + title={`Change addon orientation [${shortcutToHumanString( + shortcuts.panelPosition + )}]`} + > + {panelPosition === 'bottom' ? <SidebarAltIcon /> : <BottomBarIcon />} + </IconButton> + <IconButton + key="visibility" + onClick={actions.toggleVisibility} + title={`Hide addons [${shortcutToHumanString(shortcuts.togglePanel)}]`} + > + <CloseIcon /> + </IconButton> + </> + ) : ( + <IconButton onClick={() => setMobilePanelOpen(false)} title="Close addon panel"> + <CloseIcon /> </IconButton> - </Fragment> - ) : undefined + )} + </Actions> } id="storybook-panel-root" > {Object.entries(panels).map(([k, v]) => ( + // @ts-expect-error (we know this is broken) <SafeTab key={k} id={k} title={typeof v.title === 'function' ? <v.title /> : v.title}> {v.render} </SafeTab> @@ -92,4 +103,8 @@ const AddonPanel = React.memo<{ AddonPanel.displayName = 'AddonPanel'; -export default AddonPanel; +const Actions = styled.div({ + display: 'flex', + alignItems: 'center', + gap: 6, +}); diff --git a/code/ui/manager/src/components/preview/FramesRenderer.tsx b/code/ui/manager/src/components/preview/FramesRenderer.tsx index e794577042a4..a1a89a9e5041 100644 --- a/code/ui/manager/src/components/preview/FramesRenderer.tsx +++ b/code/ui/manager/src/components/preview/FramesRenderer.tsx @@ -5,7 +5,7 @@ import { Consumer } from '@storybook/manager-api'; import { Button, getStoryHref } from '@storybook/components'; import { Global, styled } from '@storybook/theming'; import type { CSSObject } from '@storybook/theming'; -import { IFrame } from './iframe'; +import { IFrame } from './Iframe'; import type { FramesRendererProps } from './utils/types'; import { stringifyQueryParams } from './utils/stringifyQueryParams'; @@ -34,9 +34,9 @@ const SkipToSidebarLink = styled(Button)(({ theme }) => ({ }, })); -const whenSidebarIsVisible = ({ state }: Combo) => ({ - isFullscreen: state.layout.isFullscreen, - showNav: state.layout.showNav, +const whenSidebarIsVisible = ({ api, state }: Combo) => ({ + isFullscreen: api.getIsFullscreen(), + isNavShown: api.getIsNavShown(), selectedStoryId: state.storyId, }); @@ -91,15 +91,17 @@ export const FramesRenderer: FC<FramesRendererProps> = ({ <Fragment> <Global styles={styles} /> <Consumer filter={whenSidebarIsVisible}> - {({ isFullscreen, showNav, selectedStoryId }) => { - if (!isFullscreen && !!showNav && selectedStoryId) { - return ( - <SkipToSidebarLink secondary isLink tabIndex={0} href={`#${selectedStoryId}`}> - Skip to sidebar - </SkipToSidebarLink> - ); + {({ isFullscreen, isNavShown, selectedStoryId }) => { + if (isFullscreen || !isNavShown || !selectedStoryId) { + return null; } - return null; + return ( + <SkipToSidebarLink asChild> + <a href={`#${selectedStoryId}`} tabIndex={0} title="Skip to sidebar"> + Skip to sidebar + </a> + </SkipToSidebarLink> + ); }} </Consumer> {Object.entries(frames).map(([id, src]) => { diff --git a/code/ui/manager/src/components/preview/iframe.stories.tsx b/code/ui/manager/src/components/preview/Iframe.stories.tsx similarity index 80% rename from code/ui/manager/src/components/preview/iframe.stories.tsx rename to code/ui/manager/src/components/preview/Iframe.stories.tsx index 5b9e9f65946c..8f542b029270 100644 --- a/code/ui/manager/src/components/preview/iframe.stories.tsx +++ b/code/ui/manager/src/components/preview/Iframe.stories.tsx @@ -1,7 +1,7 @@ import type { CSSProperties } from 'react'; import React from 'react'; -import { IFrame } from './iframe'; +import { IFrame } from './Iframe'; export default { component: IFrame, @@ -35,7 +35,22 @@ export const WorkingStory = () => ( active id="iframe" title="Missing" - src="/iframe.html?id=storybook-components-loader--infinite-state" + src="/iframe.html?id=components-loader--infinite-state" + allowFullScreen + style={style} + scale={1.0} + /> +); +WorkingStory.parameters = { + chromatic: { disable: true }, +}; + +export const WorkingDocs = () => ( + <IFrame + active + id="iframe" + title="Missing" + src="/iframe.html?id=components-colorpalette--docs" allowFullScreen style={style} scale={1.0} diff --git a/code/ui/manager/src/components/preview/iframe.tsx b/code/ui/manager/src/components/preview/Iframe.tsx similarity index 95% rename from code/ui/manager/src/components/preview/iframe.tsx rename to code/ui/manager/src/components/preview/Iframe.tsx index f4ac61c99d78..5cc5e1f94b21 100644 --- a/code/ui/manager/src/components/preview/iframe.tsx +++ b/code/ui/manager/src/components/preview/Iframe.tsx @@ -5,7 +5,6 @@ import { Zoom } from '@storybook/components'; const StyledIframe = styled.iframe(({ theme }) => ({ backgroundColor: theme.background.preview, - position: 'absolute', display: 'block', boxSizing: 'content-box', height: '100%', @@ -13,6 +12,8 @@ const StyledIframe = styled.iframe(({ theme }) => ({ border: '0 none', transition: 'background-position 0s, visibility 0s', backgroundPosition: '-1px -1px, -1px -1px, -1px -1px, -1px -1px', + margin: `auto`, + boxShadow: '0 0 100px 100vw rgba(0,0,0,0.5)', })); export interface IFrameProps { diff --git a/code/ui/manager/src/components/preview/preview.mockdata.tsx b/code/ui/manager/src/components/preview/Preview.mockdata.tsx similarity index 98% rename from code/ui/manager/src/components/preview/preview.mockdata.tsx rename to code/ui/manager/src/components/preview/Preview.mockdata.tsx index 3129c92bbc72..4bb1c7380d60 100644 --- a/code/ui/manager/src/components/preview/preview.mockdata.tsx +++ b/code/ui/manager/src/components/preview/Preview.mockdata.tsx @@ -50,7 +50,6 @@ export const previewProps: PreviewProps = { baseUrl: 'http://example.com', queryParams: {}, options: { - isFullscreen: false, showTabs: true, showToolbar: true, }, diff --git a/code/ui/manager/src/components/preview/preview.stories.tsx b/code/ui/manager/src/components/preview/Preview.stories.tsx similarity index 92% rename from code/ui/manager/src/components/preview/preview.stories.tsx rename to code/ui/manager/src/components/preview/Preview.stories.tsx index ca4c5036988f..624542b2f68c 100644 --- a/code/ui/manager/src/components/preview/preview.stories.tsx +++ b/code/ui/manager/src/components/preview/Preview.stories.tsx @@ -8,10 +8,11 @@ import { Location, BaseLocationProvider } from '@storybook/router'; import { ThemeProvider, ensure as ensureTheme, themes } from '@storybook/theming'; import type { DecoratorFn } from '@storybook/react'; -import { Preview } from './preview'; +import { Preview } from './Preview'; import { PrettyFakeProvider } from '../../FakeProvider'; -import { previewProps } from './preview.mockdata'; +import { previewProps } from './Preview.mockdata'; +import { LayoutProvider } from '../layout/LayoutProvider'; const provider = new PrettyFakeProvider(); const staticNavigator = { @@ -33,6 +34,10 @@ const staticNavigator = { export default { title: 'Preview', component: Preview, + parameters: { + layout: 'fullscreen', + theme: 'light', + }, decorators: [ ((StoryFn, c) => { const locationProp = parsePath('/?path=/story/story--id'); @@ -66,7 +71,9 @@ export default { navigate={() => {}} > <ThemeProvider key="theme.provider" theme={ensureTheme(themes.light)}> - <StoryFn {...c} /> + <LayoutProvider> + <StoryFn {...c} /> + </LayoutProvider> </ThemeProvider> </ManagerProvider> )} diff --git a/code/ui/manager/src/components/preview/preview.tsx b/code/ui/manager/src/components/preview/Preview.tsx similarity index 90% rename from code/ui/manager/src/components/preview/preview.tsx rename to code/ui/manager/src/components/preview/Preview.tsx index 57572a3949dd..7096c1d9bf47 100644 --- a/code/ui/manager/src/components/preview/preview.tsx +++ b/code/ui/manager/src/components/preview/Preview.tsx @@ -12,8 +12,8 @@ import { Location } from '@storybook/router'; import * as S from './utils/components'; import { ZoomProvider, ZoomConsumer } from './tools/zoom'; -import { defaultWrappers, ApplyWrappers } from './wrappers'; -import { ToolbarComp } from './toolbar'; +import { defaultWrappers, ApplyWrappers } from './Wrappers'; +import { ToolbarComp } from './Toolbar'; import { FramesRenderer } from './FramesRenderer'; import type { PreviewProps } from './utils/types'; @@ -106,25 +106,27 @@ const Preview = React.memo<PreviewProps>(function Preview(props) { </Helmet> )} <ZoomProvider shouldScale={shouldScale}> - <ToolbarComp - key="tools" - entry={entry} - api={api} - isShown={showToolbar} - tabs={visibleTabsInToolbar} - /> - <S.FrameWrap key="frame" offset={showToolbar ? 40 : 0}> - <Canvas {...{ withLoader, baseUrl }} /> - {tabs.map(({ render: Render, match, ...t }, i) => { - // @ts-expect-error (Converted from ts-ignore) - const key = t.id || t.key || i; - return ( - <Fragment key={key}> - <Location>{(lp) => <Render active={match(lp)} />}</Location> - </Fragment> - ); - })} - </S.FrameWrap> + <S.PreviewContainer> + <ToolbarComp + key="tools" + entry={entry} + api={api} + isShown={showToolbar} + tabs={visibleTabsInToolbar} + /> + <S.FrameWrap key="frame"> + <Canvas {...{ withLoader, baseUrl }} /> + {tabs.map(({ render: Render, match, ...t }, i) => { + // @ts-expect-error (Converted from ts-ignore) + const key = t.id || t.key || i; + return ( + <Fragment key={key}> + <Location>{(lp) => <Render active={match(lp)} />}</Location> + </Fragment> + ); + })} + </S.FrameWrap> + </S.PreviewContainer> </ZoomProvider> </Fragment> ); diff --git a/code/ui/manager/src/components/preview/toolbar.tsx b/code/ui/manager/src/components/preview/Toolbar.tsx similarity index 69% rename from code/ui/manager/src/components/preview/toolbar.tsx rename to code/ui/manager/src/components/preview/Toolbar.tsx index b82e5cb2eb38..57d3048ce502 100644 --- a/code/ui/manager/src/components/preview/toolbar.tsx +++ b/code/ui/manager/src/components/preview/Toolbar.tsx @@ -3,7 +3,7 @@ import React, { Fragment, useMemo } from 'react'; import { styled } from '@storybook/theming'; -import { FlexBar, IconButton, Icons, Separator, TabButton, TabBar } from '@storybook/components'; +import { IconButton, Separator, TabButton, TabBar } from '@storybook/components'; import { shortcutToHumanString, Consumer, @@ -18,6 +18,7 @@ import { import { Location, type RenderData } from '@storybook/router'; import type { Addon_BaseType } from '@storybook/types'; +import { CloseIcon, ExpandIcon } from '@storybook/icons'; import { zoomTool } from './tools/zoom'; import * as S from './utils/components'; @@ -28,55 +29,48 @@ import { ejectTool } from './tools/eject'; import { menuTool } from './tools/menu'; import { addonsTool } from './tools/addons'; import { remountTool } from './tools/remount'; +import { useLayout } from '../layout/LayoutProvider'; export const getTools = (getFn: API['getElements']) => Object.values(getFn(types.TOOL)); export const getToolsExtra = (getFn: API['getElements']) => Object.values(getFn(types.TOOLEXTRA)); -const Bar: FunctionComponent<{ shown: boolean } & Record<string, any>> = ({ shown, ...props }) => ( - <FlexBar {...props} /> -); - -export const Toolbar = styled(Bar)( - { - position: 'absolute', - left: 0, - right: 0, - top: 0, - transition: 'transform .2s linear', - }, - ({ shown }) => ({ - transform: shown ? 'translateY(0px)' : 'translateY(-40px)', - }) -); - -const fullScreenMapper = ({ api, state }: Combo) => ({ - toggle: api.toggleFullscreen, - value: state.layout.isFullscreen, - shortcut: shortcutToHumanString(api.getShortcutKeys().fullScreen), - hasPanel: Object.keys(api.getPanels()).length > 0, - singleStory: state.singleStory, -}); +const fullScreenMapper = ({ api, state }: Combo) => { + return { + toggle: api.toggleFullscreen, + isFullscreen: api.getIsFullscreen(), + shortcut: shortcutToHumanString(api.getShortcutKeys().fullScreen), + hasPanel: Object.keys(api.getPanels()).length > 0, + singleStory: state.singleStory, + }; +}; export const fullScreenTool: Addon_BaseType = { title: 'fullscreen', id: 'fullscreen', type: types.TOOL, match: (p) => ['story', 'docs'].includes(p.viewMode), - render: () => ( - <Consumer filter={fullScreenMapper}> - {({ toggle, value, shortcut, hasPanel, singleStory }) => - (!singleStory || (singleStory && hasPanel)) && ( - <IconButton - key="full" - onClick={toggle as any} - title={`${value ? 'Exit full screen' : 'Go full screen'} [${shortcut}]`} - > - <Icons icon={value ? 'close' : 'expand'} /> - </IconButton> - ) - } - </Consumer> - ), + render: () => { + const { isMobile } = useLayout(); + + if (isMobile) return null; + + return ( + <Consumer filter={fullScreenMapper}> + {({ toggle, isFullscreen, shortcut, hasPanel, singleStory }) => + (!singleStory || (singleStory && hasPanel)) && ( + <IconButton + key="full" + onClick={toggle as any} + title={`${isFullscreen ? 'Exit full screen' : 'Go full screen'} [${shortcut}]`} + aria-label={isFullscreen ? 'Exit full screen' : 'Go full screen'} + > + {isFullscreen ? <CloseIcon /> : <ExpandIcon />} + </IconButton> + ) + } + </Consumer> + ); + }, }; const tabsMapper = ({ state }: Combo) => ({ @@ -104,7 +98,7 @@ export const createTabsTool = (tabs: Addon_BaseType[]): Addon_BaseType => ({ return ( <S.UnstyledLink key={t.id || `l${index}`} to={to}> <TabButton disabled={t.disabled} active={isActive}> - {t.title} + {t.title as any} </TabButton> </S.UnstyledLink> ); @@ -133,7 +127,10 @@ const useTools = ( location: PreviewProps['location'], path: PreviewProps['path'] ) => { - const toolsFromConfig = useMemo(() => getTools(getElements), [getElements]); + const toolsFromConfig = useMemo( + () => getTools(getElements), + [getElements, getTools(getElements).length] + ); const toolsExtraFromConfig = useMemo(() => getToolsExtra(getElements), [getElements]); const tools = useMemo( @@ -169,9 +166,15 @@ export const ToolRes: FunctionComponent<ToolData & RenderData> = React.memo<Tool const { left, right } = useTools(api.getElements, tabs, viewMode, entry, location, path); return left || right ? ( - <Toolbar key="toolbar" shown={isShown} border> - <Tools key="left" list={left} /> - <Tools key="right" list={right} /> + <Toolbar key="toolbar" shown={isShown} data-test-id="sb-preview-toolbar"> + <ToolbarInner> + <ToolbarLeft> + <Tools key="left" list={left} /> + </ToolbarLeft> + <ToolbarRight> + <Tools key="right" list={right} /> + </ToolbarRight> + </ToolbarInner> </Toolbar> ) : null; } @@ -246,3 +249,41 @@ export function filterTools( return { left, right }; } + +const Toolbar = styled.div<{ shown: boolean }>(({ theme, shown }) => ({ + position: 'relative', + color: theme.barTextColor, + width: '100%', + height: 40, + flexShrink: 0, + overflowX: 'auto', + overflowY: 'hidden', + marginTop: shown ? 0 : -40, + boxShadow: `${theme.appBorderColor} 0 -1px 0 0 inset`, + background: theme.barBg, + zIndex: 4, +})); + +const ToolbarInner = styled.div({ + position: 'absolute', + width: 'calc(100% - 20px)', + display: 'flex', + justifyContent: 'space-between', + flexWrap: 'nowrap', + flexShrink: 0, + height: 40, + marginLeft: 10, + marginRight: 10, +}); + +const ToolbarLeft = styled.div({ + display: 'flex', + whiteSpace: 'nowrap', + flexBasis: 'auto', + gap: 6, + alignItems: 'center', +}); + +const ToolbarRight = styled(ToolbarLeft)({ + marginLeft: 30, +}); diff --git a/code/ui/manager/src/components/preview/wrappers.tsx b/code/ui/manager/src/components/preview/Wrappers.tsx similarity index 86% rename from code/ui/manager/src/components/preview/wrappers.tsx rename to code/ui/manager/src/components/preview/Wrappers.tsx index a88404e6d515..80640a9875fa 100644 --- a/code/ui/manager/src/components/preview/wrappers.tsx +++ b/code/ui/manager/src/components/preview/Wrappers.tsx @@ -1,11 +1,11 @@ -import type { FC } from 'react'; +import type { FC, PropsWithChildren } from 'react'; import React, { Fragment } from 'react'; import type { Addon_WrapperType } from '@storybook/types'; import { Addon_TypesEnum } from '@storybook/types'; import type { ApplyWrappersProps } from './utils/types'; import { IframeWrapper } from './utils/components'; -export const ApplyWrappers: FC<ApplyWrappersProps> = ({ +export const ApplyWrappers: FC<PropsWithChildren<ApplyWrappersProps>> = ({ wrappers, id, storyId, diff --git a/code/ui/manager/src/components/preview/tools/addons.tsx b/code/ui/manager/src/components/preview/tools/addons.tsx index 53fe821ae4af..5af0f4bf7040 100644 --- a/code/ui/manager/src/components/preview/tools/addons.tsx +++ b/code/ui/manager/src/components/preview/tools/addons.tsx @@ -1,11 +1,12 @@ import React from 'react'; -import { IconButton, Icons } from '@storybook/components'; +import { IconButton } from '@storybook/components'; import { Consumer, types } from '@storybook/manager-api'; import type { Combo } from '@storybook/manager-api'; import type { Addon_BaseType } from '@storybook/types'; +import { BottomBarIcon, SidebarAltIcon } from '@storybook/icons'; const menuMapper = ({ api, state }: Combo) => ({ - isVisible: state.layout.showPanel, + isVisible: api.getIsPanelShown(), singleStory: state.singleStory, panelPosition: state.layout.panelPosition, toggle: () => api.togglePanel(), @@ -23,7 +24,7 @@ export const addonsTool: Addon_BaseType = { !isVisible && ( <> <IconButton aria-label="Show addons" key="addons" onClick={toggle} title="Show addons"> - <Icons icon={panelPosition === 'bottom' ? 'bottombar' : 'sidebaralt'} /> + {panelPosition === 'bottom' ? <BottomBarIcon /> : <SidebarAltIcon />} </IconButton> </> ) diff --git a/code/ui/manager/src/components/preview/tools/copy.tsx b/code/ui/manager/src/components/preview/tools/copy.tsx index 0b0084aae857..f06e926c0290 100644 --- a/code/ui/manager/src/components/preview/tools/copy.tsx +++ b/code/ui/manager/src/components/preview/tools/copy.tsx @@ -1,10 +1,11 @@ import { global } from '@storybook/global'; import React from 'react'; import copy from 'copy-to-clipboard'; -import { getStoryHref, IconButton, Icons } from '@storybook/components'; +import { getStoryHref, IconButton } from '@storybook/components'; import { Consumer, types } from '@storybook/manager-api'; import type { Combo } from '@storybook/manager-api'; import type { Addon_BaseType } from '@storybook/types'; +import { LinkIcon } from '@storybook/icons'; const { PREVIEW_URL, document } = global; @@ -37,7 +38,7 @@ export const copyTool: Addon_BaseType = { onClick={() => copy(getStoryHref(baseUrl, storyId, queryParams))} title="Copy canvas link" > - <Icons icon="link" /> + <LinkIcon /> </IconButton> ) : null } diff --git a/code/ui/manager/src/components/preview/tools/eject.tsx b/code/ui/manager/src/components/preview/tools/eject.tsx index 65688038b859..e8c65f8fd29b 100644 --- a/code/ui/manager/src/components/preview/tools/eject.tsx +++ b/code/ui/manager/src/components/preview/tools/eject.tsx @@ -1,9 +1,10 @@ import { global } from '@storybook/global'; import React from 'react'; -import { getStoryHref, IconButton, Icons } from '@storybook/components'; +import { getStoryHref, IconButton } from '@storybook/components'; import { Consumer, types } from '@storybook/manager-api'; import type { Combo } from '@storybook/manager-api'; import type { Addon_BaseType } from '@storybook/types'; +import { ShareAltIcon } from '@storybook/icons'; const { PREVIEW_URL } = global; @@ -28,13 +29,15 @@ export const ejectTool: Addon_BaseType = { <Consumer filter={ejectMapper}> {({ baseUrl, storyId, queryParams }) => storyId ? ( - <IconButton - key="opener" - href={getStoryHref(baseUrl, storyId, queryParams)} - target="_blank" - title="Open canvas in new tab" - > - <Icons icon="sharealt" /> + <IconButton key="opener" asChild> + <a + href={getStoryHref(baseUrl, storyId, queryParams)} + target="_blank" + rel="noopener noreferrer" + title="Open canvas in new tab" + > + <ShareAltIcon /> + </a> </IconButton> ) : null } diff --git a/code/ui/manager/src/components/preview/tools/menu.tsx b/code/ui/manager/src/components/preview/tools/menu.tsx index 8512e9e16abc..fcbf3971214d 100644 --- a/code/ui/manager/src/components/preview/tools/menu.tsx +++ b/code/ui/manager/src/components/preview/tools/menu.tsx @@ -1,11 +1,12 @@ import React from 'react'; -import { IconButton, Icons, Separator } from '@storybook/components'; +import { IconButton, Separator } from '@storybook/components'; import { Consumer, types } from '@storybook/manager-api'; import type { Combo } from '@storybook/manager-api'; import type { Addon_BaseType } from '@storybook/types'; +import { MenuIcon } from '@storybook/icons'; const menuMapper = ({ api, state }: Combo) => ({ - isVisible: state.layout.showNav, + isVisible: api.getIsNavShown(), singleStory: state.singleStory, toggle: () => api.toggleNav(), }); @@ -22,7 +23,7 @@ export const menuTool: Addon_BaseType = { !isVisible && ( <> <IconButton aria-label="Show sidebar" key="menu" onClick={toggle} title="Show sidebar"> - <Icons icon="menu" /> + <MenuIcon /> </IconButton> <Separator /> </> diff --git a/code/ui/manager/src/components/preview/tools/remount.tsx b/code/ui/manager/src/components/preview/tools/remount.tsx index 6bf4c1f7553e..af85a43af246 100644 --- a/code/ui/manager/src/components/preview/tools/remount.tsx +++ b/code/ui/manager/src/components/preview/tools/remount.tsx @@ -1,11 +1,12 @@ import type { ComponentProps } from 'react'; import React, { useState } from 'react'; -import { IconButton, Icons } from '@storybook/components'; +import { IconButton } from '@storybook/components'; import { Consumer, types } from '@storybook/manager-api'; import type { Combo } from '@storybook/manager-api'; import { styled } from '@storybook/theming'; import { FORCE_REMOUNT } from '@storybook/core-events'; import type { Addon_BaseType } from '@storybook/types'; +import { SyncIcon } from '@storybook/icons'; interface AnimatedButtonProps { animating?: boolean; @@ -56,7 +57,7 @@ export const remountTool: Addon_BaseType = { animating={isAnimating} disabled={!storyId} > - <Icons icon="sync" /> + <SyncIcon /> </StyledAnimatedIconButton> ); }} diff --git a/code/ui/manager/src/components/preview/tools/zoom.tsx b/code/ui/manager/src/components/preview/tools/zoom.tsx index 84e0f72bafae..e38cb99e0526 100644 --- a/code/ui/manager/src/components/preview/tools/zoom.tsx +++ b/code/ui/manager/src/components/preview/tools/zoom.tsx @@ -1,15 +1,19 @@ -import type { SyntheticEvent, MouseEventHandler } from 'react'; -import React, { Component, useCallback } from 'react'; +import type { SyntheticEvent, MouseEventHandler, PropsWithChildren } from 'react'; +import React, { Component, createContext, memo, useCallback } from 'react'; -import { Icons, IconButton, Separator } from '@storybook/components'; +import { IconButton, Separator } from '@storybook/components'; import type { Addon_BaseType } from '@storybook/types'; import { types } from '@storybook/manager-api'; +import { ZoomIcon, ZoomOutIcon, ZoomResetIcon } from '@storybook/icons'; const initialZoom = 1 as const; -const Context = React.createContext({ value: initialZoom, set: (v: number) => {} }); +const Context = createContext({ value: initialZoom, set: (v: number) => {} }); -class ZoomProvider extends Component<{ shouldScale: boolean }, { value: number }> { +class ZoomProvider extends Component< + PropsWithChildren<{ shouldScale: boolean }>, + { value: number } +> { state = { value: initialZoom, }; @@ -30,7 +34,7 @@ class ZoomProvider extends Component<{ shouldScale: boolean }, { value: number } const { Consumer: ZoomConsumer } = Context; -const Zoom = React.memo<{ +const Zoom = memo<{ zoomIn: MouseEventHandler; zoomOut: MouseEventHandler; reset: MouseEventHandler; @@ -38,13 +42,13 @@ const Zoom = React.memo<{ return ( <> <IconButton key="zoomin" onClick={zoomIn} title="Zoom in"> - <Icons icon="zoom" /> + <ZoomIcon /> </IconButton> <IconButton key="zoomout" onClick={zoomOut} title="Zoom out"> - <Icons icon="zoomout" /> + <ZoomOutIcon /> </IconButton> <IconButton key="zoomreset" onClick={reset} title="Reset zoom"> - <Icons icon="zoomreset" /> + <ZoomResetIcon /> </IconButton> </> ); @@ -52,44 +56,47 @@ const Zoom = React.memo<{ export { Zoom, ZoomConsumer, ZoomProvider }; -const ZoomWrapper = React.memo<{ set: (zoomLevel: number) => void; value: number }>( - function ZoomWrapper({ set, value }) { - const zoomIn = useCallback( - (e: SyntheticEvent) => { - e.preventDefault(); - set(0.8 * value); - }, - [set, value] - ); - const zoomOut = useCallback( - (e: SyntheticEvent) => { - e.preventDefault(); - set(1.25 * value); - }, - [set, value] - ); - const reset = useCallback( - (e) => { - e.preventDefault(); - set(initialZoom); - }, - [set, initialZoom] - ); - return <Zoom key="zoom" {...{ zoomIn, zoomOut, reset }} />; - } -); +const ZoomWrapper = memo<{ set: (zoomLevel: number) => void; value: number }>(function ZoomWrapper({ + set, + value, +}) { + const zoomIn = useCallback( + (e: SyntheticEvent) => { + e.preventDefault(); + set(0.8 * value); + }, + [set, value] + ); + const zoomOut = useCallback( + (e: SyntheticEvent) => { + e.preventDefault(); + set(1.25 * value); + }, + [set, value] + ); + const reset = useCallback( + (e: SyntheticEvent) => { + e.preventDefault(); + set(initialZoom); + }, + [set, initialZoom] + ); + return <Zoom key="zoom" {...{ zoomIn, zoomOut, reset }} />; +}); + +function ZoomToolRenderer() { + return ( + <> + <ZoomConsumer>{({ set, value }) => <ZoomWrapper {...{ set, value }} />}</ZoomConsumer> + <Separator /> + </> + ); +} export const zoomTool: Addon_BaseType = { title: 'zoom', id: 'zoom', type: types.TOOL, match: ({ viewMode }) => viewMode === 'story', - render: React.memo(function ZoomToolRenderer() { - return ( - <> - <ZoomConsumer>{({ set, value }) => <ZoomWrapper {...{ set, value }} />}</ZoomConsumer> - <Separator /> - </> - ); - }), + render: ZoomToolRenderer, }; diff --git a/code/ui/manager/src/components/preview/utils/components.ts b/code/ui/manager/src/components/preview/utils/components.ts index c2e784664f98..b5b446aec116 100644 --- a/code/ui/manager/src/components/preview/utils/components.ts +++ b/code/ui/manager/src/components/preview/utils/components.ts @@ -1,18 +1,21 @@ import { styled } from '@storybook/theming'; import { Link } from '@storybook/router'; -export const FrameWrap = styled.div<{ offset: number }>(({ offset }) => ({ - position: 'absolute', +export const PreviewContainer = styled.main({ + display: 'flex', + flexDirection: 'column', + width: '100%', + height: '100%', + overflow: 'hidden', +}); + +export const FrameWrap = styled.div({ overflow: 'auto', - left: 0, - right: 0, - bottom: 0, - top: offset, + width: '100%', zIndex: 3, - transition: 'all 0.1s linear', - height: `calc(100% - ${offset}px)`, background: 'transparent', -})); + flex: 1, +}); export const UnstyledLink = styled(Link)({ color: 'inherit', @@ -28,11 +31,17 @@ export const DesktopOnly = styled.span({ }); export const IframeWrapper = styled.div(({ theme }) => ({ - position: 'absolute', - top: 0, - left: 0, - bottom: 0, - right: 0, + alignContent: 'center', + alignItems: 'center', + justifyContent: 'center', + justifyItems: 'center', + overflow: 'auto', + + display: 'grid', + gridTemplateColumns: '100%', + gridTemplateRows: '100%', + + position: 'relative', width: '100%', height: '100%', })); diff --git a/code/ui/manager/src/components/preview/utils/types.tsx b/code/ui/manager/src/components/preview/utils/types.tsx index 9d8158514864..90ae75246019 100644 --- a/code/ui/manager/src/components/preview/utils/types.tsx +++ b/code/ui/manager/src/components/preview/utils/types.tsx @@ -9,11 +9,10 @@ export interface PreviewProps { storyId: StoryId; entry: LeafEntry; options: { - isFullscreen: boolean; showTabs: boolean; showToolbar: boolean; }; - id: string; + id?: string; path: string; location: State['location']; queryParams: State['customQueryParams']; diff --git a/code/ui/manager/src/components/sidebar/Explorer.stories.tsx b/code/ui/manager/src/components/sidebar/Explorer.stories.tsx index 6e33e63b4ad8..a430bb2bb4f0 100644 --- a/code/ui/manager/src/components/sidebar/Explorer.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Explorer.stories.tsx @@ -4,14 +4,20 @@ import { Explorer } from './Explorer'; import { mockDataset } from './mockdata'; import type { RefType } from './types'; import * as RefStories from './Refs.stories'; +import { IconSymbols } from './IconSymbols'; export default { component: Explorer, title: 'Sidebar/Explorer', - parameters: { layout: 'fullscreen', withSymbols: true }, + parameters: { layout: 'fullscreen', theme: 'side-by-side' }, decorators: [ RefStories.default.decorators[0], - (storyFn: any) => <div style={{ padding: '0 20px', maxWidth: '230px' }}>{storyFn()}</div>, + (storyFn: any) => ( + <div style={{ padding: '0 20px', maxWidth: '230px' }}> + <IconSymbols /> + {storyFn()} + </div> + ), ], }; diff --git a/code/ui/manager/src/components/sidebar/Heading.tsx b/code/ui/manager/src/components/sidebar/Heading.tsx index 552e1859af69..e015f0828692 100644 --- a/code/ui/manager/src/components/sidebar/Heading.tsx +++ b/code/ui/manager/src/components/sidebar/Heading.tsx @@ -5,7 +5,7 @@ import { Button } from '@storybook/components'; import type { Addon_SidebarTopType } from '@storybook/types'; import { Brand } from './Brand'; -import type { MenuList } from './Menu'; +import type { MenuList, SidebarMenuProps } from './Menu'; import { SidebarMenu } from './Menu'; export interface HeadingProps { @@ -14,6 +14,7 @@ export interface HeadingProps { extra: Addon_SidebarTopType[]; skipLinkHref?: string; isLoading: boolean; + onMenuClick?: SidebarMenuProps['onClick']; } const BrandArea = styled.div(({ theme }) => ({ @@ -42,7 +43,8 @@ const HeadingWrapper = styled.div({ alignItems: 'center', justifyContent: 'space-between', position: 'relative', - minHeight: 28, + minHeight: 42, + paddingLeft: 8, }); const SkipToCanvasLink = styled(Button)(({ theme }) => ({ @@ -81,13 +83,16 @@ export const Heading: FC<HeadingProps & ComponentProps<typeof HeadingWrapper>> = skipLinkHref, extra, isLoading, + onMenuClick, ...props }) => { return ( <HeadingWrapper {...props}> {skipLinkHref && ( - <SkipToCanvasLink secondary isLink tabIndex={0} href={skipLinkHref}> - Skip to canvas + <SkipToCanvasLink asChild> + <a href={skipLinkHref} tabIndex={0}> + Skip to canvas + </a> </SkipToCanvasLink> )} @@ -96,7 +101,7 @@ export const Heading: FC<HeadingProps & ComponentProps<typeof HeadingWrapper>> = </BrandArea> {isLoading ? null : extra.map(({ id, render: Render }) => <Render key={id} />)} - <SidebarMenu menu={menu} isHighlighted={menuHighlighted} /> + <SidebarMenu menu={menu} isHighlighted={menuHighlighted} onClick={onMenuClick} /> </HeadingWrapper> ); }; diff --git a/code/ui/manager/src/components/sidebar/IconSymbols.tsx b/code/ui/manager/src/components/sidebar/IconSymbols.tsx new file mode 100644 index 000000000000..589e909e00e4 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/IconSymbols.tsx @@ -0,0 +1,75 @@ +import { styled } from '@storybook/theming'; +import type { FC } from 'react'; +import React from 'react'; + +const Svg = styled.svg` + position: absolute; + width: 0; + height: 0; + display: inline-block; + shape-rendering: inherit; + vertical-align: middle; +`; + +// We are importing the icons from @storybook/icons as we need to add symbols inside of them. +// This will allow to set icons once and use them everywhere. + +const GROUP_ID = 'icon--group'; +const COMPONENT_ID = 'icon--component'; +const DOCUMENT_ID = 'icon--document'; +const STORY_ID = 'icon--story'; + +export const IconSymbols: FC = () => { + return ( + <Svg data-chromatic="ignore"> + <symbol id={GROUP_ID}> + {/* https://github.com/storybookjs/icons/blob/main/src/icons/Folder.tsx */} + <path + fillRule="evenodd" + clipRule="evenodd" + d="M6.586 3.504l-1.5-1.5H1v9h12v-7.5H6.586zm.414-1L5.793 1.297a1 1 0 00-.707-.293H.5a.5.5 0 00-.5.5v10a.5.5 0 00.5.5h13a.5.5 0 00.5-.5v-8.5a.5.5 0 00-.5-.5H7z" + fill="currentColor" + /> + </symbol> + <symbol id={COMPONENT_ID}> + {/* https://github.com/storybookjs/icons/blob/main/src/icons/Component.tsx */} + <path + fillRule="evenodd" + clipRule="evenodd" + d="M3.5 1.004a2.5 2.5 0 00-2.5 2.5v7a2.5 2.5 0 002.5 2.5h7a2.5 2.5 0 002.5-2.5v-7a2.5 2.5 0 00-2.5-2.5h-7zm8.5 5.5H7.5v-4.5h3a1.5 1.5 0 011.5 1.5v3zm0 1v3a1.5 1.5 0 01-1.5 1.5h-3v-4.5H12zm-5.5 4.5v-4.5H2v3a1.5 1.5 0 001.5 1.5h3zM2 6.504h4.5v-4.5h-3a1.5 1.5 0 00-1.5 1.5v3z" + fill="currentColor" + /> + </symbol> + <symbol id={DOCUMENT_ID}> + {/* https://github.com/storybookjs/icons/blob/main/src/icons/Document.tsx */} + <path + d="M4 5.5a.5.5 0 01.5-.5h5a.5.5 0 010 1h-5a.5.5 0 01-.5-.5zM4.5 7.5a.5.5 0 000 1h5a.5.5 0 000-1h-5zM4 10.5a.5.5 0 01.5-.5h5a.5.5 0 010 1h-5a.5.5 0 01-.5-.5z" + fill="currentColor" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M1.5 0a.5.5 0 00-.5.5v13a.5.5 0 00.5.5h11a.5.5 0 00.5-.5V3.207a.5.5 0 00-.146-.353L10.146.146A.5.5 0 009.793 0H1.5zM2 1h7.5v2a.5.5 0 00.5.5h2V13H2V1z" + fill="currentColor" + /> + </symbol> + <symbol id={STORY_ID}> + {/* https://github.com/storybookjs/icons/blob/main/src/icons/BookmarkHollow.tsx */} + <path + fillRule="evenodd" + clipRule="evenodd" + d="M3.5 0h7a.5.5 0 01.5.5v13a.5.5 0 01-.454.498.462.462 0 01-.371-.118L7 11.159l-3.175 2.72a.46.46 0 01-.379.118A.5.5 0 013 13.5V.5a.5.5 0 01.5-.5zM4 12.413l2.664-2.284a.454.454 0 01.377-.128.498.498 0 01.284.12L10 12.412V1H4v11.413z" + fill="currentColor" + /> + </symbol> + </Svg> + ); +}; + +export const UseSymbol: FC<{ type: 'group' | 'component' | 'document' | 'story' }> = ({ type }) => { + if (type === 'group') return <use xlinkHref={`#${GROUP_ID}`} />; + if (type === 'component') return <use xlinkHref={`#${COMPONENT_ID}`} />; + if (type === 'document') return <use xlinkHref={`#${DOCUMENT_ID}`} />; + if (type === 'story') return <use xlinkHref={`#${STORY_ID}`} />; + return null; +}; diff --git a/code/ui/manager/src/components/sidebar/Menu.stories.tsx b/code/ui/manager/src/components/sidebar/Menu.stories.tsx index f9e743a6d84d..e04811e76bf8 100644 --- a/code/ui/manager/src/components/sidebar/Menu.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Menu.stories.tsx @@ -7,11 +7,13 @@ import { TooltipLinkList } from '@storybook/components'; import { styled } from '@storybook/theming'; import { screen, userEvent, within } from '@storybook/testing-library'; import type { State } from '@storybook/manager-api'; +import { LinkIcon } from '@storybook/icons'; import { SidebarMenu, ToolbarMenu } from './Menu'; -import { useMenu } from '../../containers/menu'; +import { useMenu } from '../../container/Menu'; +import { LayoutProvider } from '../layout/LayoutProvider'; const fakemenu: ComponentProps<typeof TooltipLinkList>['links'] = [ - { title: 'has icon', icon: 'link', id: 'icon' }, + { title: 'has icon', icon: <LinkIcon />, id: 'icon' }, { title: 'has no icon', id: 'non' }, ]; @@ -21,6 +23,7 @@ const meta = { args: { menu: fakemenu, }, + decorators: [(storyFn) => <LayoutProvider>{storyFn()}</LayoutProvider>], } satisfies Meta<typeof SidebarMenu>; export default meta; diff --git a/code/ui/manager/src/components/sidebar/Menu.tsx b/code/ui/manager/src/components/sidebar/Menu.tsx index 3f66fc013a4d..95290acbc093 100644 --- a/code/ui/manager/src/components/sidebar/Menu.tsx +++ b/code/ui/manager/src/components/sidebar/Menu.tsx @@ -5,6 +5,8 @@ import { styled } from '@storybook/theming'; import { transparentize } from 'polished'; import type { Button, TooltipLinkListLink } from '@storybook/components'; import { WithTooltip, TooltipLinkList, Icons, IconButton } from '@storybook/components'; +import { CloseIcon, CogIcon, MenuIcon } from '@storybook/icons'; +import { useLayout } from '../layout/LayoutProvider'; export type MenuList = ComponentProps<typeof TooltipLinkList>['links']; @@ -63,6 +65,11 @@ export const SidebarIconButton: FC< }), })); +const MenuButtonGroup = styled.div({ + display: 'flex', + gap: 4, +}); + const Img = styled.img(sharedStyles); const Placeholder = styled.div(sharedStyles); @@ -105,11 +112,39 @@ const SidebarMenuList: FC<{ return <TooltipLinkList links={links} />; }; -export const SidebarMenu: FC<{ +export interface SidebarMenuProps { menu: MenuList; isHighlighted?: boolean; -}> = ({ menu, isHighlighted }) => { + onClick?: React.MouseEventHandler<HTMLButtonElement>; +} + +export const SidebarMenu: FC<SidebarMenuProps> = ({ menu, isHighlighted, onClick }) => { const [isTooltipVisible, setIsTooltipVisible] = useState(false); + const { isMobile, setMobileMenuOpen } = useLayout(); + + if (isMobile) { + return ( + <MenuButtonGroup> + <SidebarIconButton + title="About Storybook" + aria-label="About Storybook" + highlighted={isHighlighted} + active={false} + onClick={onClick} + > + <CogIcon /> + </SidebarIconButton> + <CloseIconButton + title="Close menu" + aria-label="Close menu" + onClick={() => setMobileMenuOpen(false)} + > + <CloseIcon /> + </CloseIconButton> + </MenuButtonGroup> + ); + } + return ( <WithTooltip placement="top" @@ -123,7 +158,7 @@ export const SidebarMenu: FC<{ highlighted={isHighlighted} active={isTooltipVisible} > - <Icons icon="cog" /> + <CogIcon /> </SidebarIconButton> </WithTooltip> ); @@ -147,8 +182,14 @@ export const ToolbarMenu: FC<{ tooltip={({ onHide }) => <SidebarMenuList onHide={onHide} menu={menu} />} > <IconButton title="Shortcuts" aria-label="Shortcuts"> - <Icons icon="menu" /> + <MenuIcon /> </IconButton> </WithTooltip> ); }; + +// We should not have to reset the margin-top here +// TODO: remove this once we have a the new IconButton component +const CloseIconButton = styled(IconButton)({ + marginTop: 0, +}); diff --git a/code/ui/manager/src/components/sidebar/RefBlocks.tsx b/code/ui/manager/src/components/sidebar/RefBlocks.tsx index 52d1d335a5dd..efeb56c2e6d9 100644 --- a/code/ui/manager/src/components/sidebar/RefBlocks.tsx +++ b/code/ui/manager/src/components/sidebar/RefBlocks.tsx @@ -2,21 +2,22 @@ import { global } from '@storybook/global'; import type { FC } from 'react'; import React, { useState, useCallback, Fragment } from 'react'; -import { Icons, WithTooltip, Spaced, Button, Link, ErrorFormatter } from '@storybook/components'; +import { WithTooltip, Spaced, Button, Link, ErrorFormatter } from '@storybook/components'; import { logger } from '@storybook/client-logger'; import { styled } from '@storybook/theming'; +import { ChevronDownIcon, LockIcon, SyncIcon } from '@storybook/icons'; import { Loader, Contained } from './Loader'; const { window: globalWindow } = global; const TextStyle = styled.div(({ theme }) => ({ - fontSize: theme.typography.size.s2 - 1, + fontSize: theme.typography.size.s2, lineHeight: '20px', margin: 0, })); const Text = styled.div(({ theme }) => ({ - fontSize: theme.typography.size.s2 - 1, + fontSize: theme.typography.size.s2, lineHeight: '20px', margin: 0, @@ -51,7 +52,7 @@ export const AuthBlock: FC<{ loginUrl: string; id: string }> = ({ loginUrl, id } globalWindow.document.location.reload(); }, []); - const open = useCallback((e) => { + const open = useCallback<React.MouseEventHandler>((e) => { e.preventDefault(); const childWindow = globalWindow.open(loginUrl, `storybook_auth_${id}`, 'resizable,scrollbars'); @@ -77,8 +78,9 @@ export const AuthBlock: FC<{ loginUrl: string; id: string }> = ({ loginUrl, id } this Storybook. </Text> <div> + {/* TODO: Make sure this button is working without the deprecated props */} <Button small gray onClick={refresh}> - <Icons icon="sync" /> + <SyncIcon /> Refresh now </Button> </div> @@ -88,7 +90,7 @@ export const AuthBlock: FC<{ loginUrl: string; id: string }> = ({ loginUrl, id } <Text>Sign in to browse this Storybook.</Text> <div> <Button small gray onClick={open}> - <Icons icon="lock" /> + <LockIcon /> Sign in </Button> </div> @@ -114,7 +116,7 @@ export const ErrorBlock: FC<{ error: Error }> = ({ error }) => ( > {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */} <Link isButton> - View error <Icons icon="arrowdown" /> + View error <ChevronDownIcon /> </Link> </WithTooltip>{' '} <Link withArrow href="https://storybook.js.org/docs" cancel={false} target="_blank"> @@ -149,7 +151,10 @@ export const EmptyBlock: FC<any> = ({ isMain }) => ( </ul>{' '} </> ) : ( - <>Yikes! Something went wrong loading these stories.</> + <> + This composed storybook is empty, maybe you're using filter-functions, and all stories + are filtered away. + </> )} </Text> </WideSpaced> diff --git a/code/ui/manager/src/components/sidebar/RefIndicator.tsx b/code/ui/manager/src/components/sidebar/RefIndicator.tsx index a46ba2c89642..14cc4089369b 100644 --- a/code/ui/manager/src/components/sidebar/RefIndicator.tsx +++ b/code/ui/manager/src/components/sidebar/RefIndicator.tsx @@ -1,5 +1,5 @@ import { global } from '@storybook/global'; -import type { FC } from 'react'; +import type { FC, MouseEventHandler } from 'react'; import React, { useMemo, useCallback, forwardRef } from 'react'; import type { TooltipLinkListLink } from '@storybook/components'; @@ -8,6 +8,7 @@ import { styled } from '@storybook/theming'; import { transparentize } from 'polished'; import { useStorybookApi } from '@storybook/manager-api'; +import { ChevronDownIcon, GlobeIcon } from '@storybook/icons'; import type { RefType } from './types'; import type { getStateType } from '../../utils/tree'; @@ -159,7 +160,7 @@ const CurrentVersion: FC<CurrentVersionProps> = ({ url, versions }) => { return ( <Version> <span>{currentVersionId}</span> - <Icons icon="arrowdown" /> + <ChevronDownIcon /> </Version> ); }; @@ -204,7 +205,7 @@ export const RefIndicator = React.memo( } > <IndicatorClickTarget data-action="toggle-indicator" aria-label="toggle indicator"> - <Icons icon="globe" /> + <GlobeIcon /> </IndicatorClickTarget> </WithTooltip> @@ -255,7 +256,7 @@ const ReadyMessage: FC<{ ); const LoginRequiredMessage: FC<RefType> = ({ loginUrl, id }) => { - const open = useCallback((e) => { + const open = useCallback<MouseEventHandler>((e) => { e.preventDefault(); const childWindow = globalWindow.open(loginUrl, `storybook_auth_${id}`, 'resizable,scrollbars'); diff --git a/code/ui/manager/src/components/sidebar/Refs.stories.tsx b/code/ui/manager/src/components/sidebar/Refs.stories.tsx index f765f62daff0..3a880bd82cac 100644 --- a/code/ui/manager/src/components/sidebar/Refs.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Refs.stories.tsx @@ -5,15 +5,17 @@ import { Ref } from './Refs'; import { standardData as standardHeaderData } from './Heading.stories'; import { mockDataset } from './mockdata'; import type { RefType } from './types'; +import { IconSymbols } from './IconSymbols'; export default { component: Ref, title: 'Sidebar/Refs', excludeStories: /.*Data$/, - parameters: { layout: 'fullscreen', withSymbols: true }, + parameters: { layout: 'fullscreen' }, decorators: [ (storyFn: any) => ( <ManagerContext.Provider value={{ state: { docsOptions: {} } } as any}> + <IconSymbols /> {storyFn()} </ManagerContext.Provider> ), diff --git a/code/ui/manager/src/components/sidebar/Refs.tsx b/code/ui/manager/src/components/sidebar/Refs.tsx index ebbbbe6d92ff..292a345f6dc3 100644 --- a/code/ui/manager/src/components/sidebar/Refs.tsx +++ b/code/ui/manager/src/components/sidebar/Refs.tsx @@ -11,12 +11,12 @@ import { RefIndicator } from './RefIndicator'; // eslint-disable-next-line import/no-cycle import { Tree } from './Tree'; -import { CollapseIcon } from './TreeNode'; import { DEFAULT_REF_ID } from './Sidebar'; import type { Highlight, RefType } from './types'; import { getStateType } from '../../utils/tree'; +import { CollapseIcon } from './components/CollapseIcon'; export interface RefProps { isLoading: boolean; @@ -28,14 +28,12 @@ export interface RefProps { const Wrapper = styled.div<{ isMain: boolean }>(({ isMain }) => ({ position: 'relative', - marginLeft: -20, - marginRight: -20, marginTop: isMain ? undefined : 0, })); const RefHead = styled.div(({ theme }) => ({ fontWeight: theme.typography.weight.bold, - fontSize: theme.typography.size.s2 - 1, + fontSize: theme.typography.size.s2, // Similar to ListItem.tsx textDecoration: 'none', @@ -48,46 +46,28 @@ const RefHead = styled.div(({ theme }) => ({ width: '100%', marginTop: 20, paddingTop: 16, + paddingBottom: 12, borderTop: `1px solid ${theme.appBorderColor}`, color: theme.base === 'light' ? theme.color.defaultText : transparentize(0.2, theme.color.defaultText), })); -const RefTitle = styled.span(({ theme }) => ({ - display: 'block', +const RefTitle = styled.div({ textOverflow: 'ellipsis', whiteSpace: 'nowrap', flex: 1, overflow: 'hidden', marginLeft: 2, -})); +}); const CollapseButton = styled.button(({ theme }) => ({ - // Reset button - background: 'transparent', - border: '1px solid transparent', - borderRadius: 26, - outline: 'none', - boxSizing: 'content-box', - cursor: 'pointer', - position: 'relative', - textAlign: 'left', - lineHeight: 'normal', - font: 'inherit', - color: 'inherit', - + all: 'unset', display: 'flex', - padding: 3, - paddingLeft: 1, - paddingRight: 12, - margin: 0, - marginLeft: -20, - overflow: 'hidden', - - 'span:first-of-type': { - marginTop: 5, - }, + padding: '0px 8px', + gap: 6, + alignItems: 'center', + cursor: 'pointer', '&:focus': { borderColor: theme.color.secondary, diff --git a/code/ui/manager/src/components/sidebar/Search.stories.tsx b/code/ui/manager/src/components/sidebar/Search.stories.tsx index a85b50147407..8eb50c9832c9 100644 --- a/code/ui/manager/src/components/sidebar/Search.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Search.stories.tsx @@ -10,6 +10,7 @@ import { SearchResults } from './SearchResults'; import { noResults } from './SearchResults.stories'; import { DEFAULT_REF_ID } from './Sidebar'; import type { Selection } from './types'; +import { IconSymbols } from './IconSymbols'; const refId = DEFAULT_REF_ID; const data = { [refId]: { id: refId, url: '/', index, previewInitialized: true } }; @@ -22,8 +23,15 @@ const getLastViewed = () => const meta = { component: Search, title: 'Sidebar/Search', - parameters: { layout: 'fullscreen', withSymbols: true }, - decorators: [(storyFn: any) => <div style={{ padding: 20, maxWidth: '230px' }}>{storyFn()}</div>], + parameters: { layout: 'fullscreen' }, + decorators: [ + (storyFn: any) => ( + <div style={{ padding: 20, maxWidth: '230px' }}> + <IconSymbols /> + {storyFn()} + </div> + ), + ], } satisfies Meta<typeof Search>; export default meta; diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index c8c71ae659cd..57966edd6074 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -1,14 +1,13 @@ /* eslint-disable import/no-cycle */ import { useStorybookApi, shortcutToHumanString } from '@storybook/manager-api'; import { styled } from '@storybook/theming'; -import { Icons } from '@storybook/components'; import type { DownshiftState, StateChangeOptions } from 'downshift'; import Downshift from 'downshift'; import type { FuseOptions } from 'fuse.js'; import Fuse from 'fuse.js'; import { global } from '@storybook/global'; import React, { useMemo, useRef, useState, useCallback } from 'react'; - +import { CloseIcon, SearchIcon } from '@storybook/icons'; import { DEFAULT_REF_ID } from './Sidebar'; import type { CombinedDataset, @@ -18,7 +17,7 @@ import type { SearchChildrenFn, Selection, } from './types'; -import { isSearchResult, isExpandType, isClearType, isCloseType } from './types'; +import { isSearchResult, isExpandType } from './types'; import { scrollIntoView, searchItem } from '../../utils/tree'; import { getGroupStatus, getHighestStatus } from '../../utils/status'; @@ -53,34 +52,32 @@ const ScreenReaderLabel = styled.label({ overflow: 'hidden', }); -const SearchIcon = styled(Icons)(({ theme }) => ({ - width: 12, - height: 12, +const SearchIconWrapper = styled.div(({ theme }) => ({ position: 'absolute', - top: 10, - left: 12, + top: 0, + left: 8, zIndex: 1, pointerEvents: 'none', color: theme.textMutedColor, + display: 'flex', + alignItems: 'center', + height: '100%', })); -const SearchField = styled.div(({ theme }) => ({ +const SearchField = styled.div({ display: 'flex', flexDirection: 'column', position: 'relative', - '&:focus-within svg': { - color: theme.color.defaultText, - }, -})); +}); const Input = styled.input(({ theme }) => ({ appearance: 'none', height: 32, - paddingLeft: 30, - paddingRight: 32, + paddingLeft: 28, + paddingRight: 28, border: `1px solid ${theme.appBorderColor}`, background: 'transparent', - borderRadius: 32, + borderRadius: 4, fontSize: `${theme.typography.size.s1 + 1}px`, fontFamily: 'inherit', transition: 'all 150ms', @@ -117,32 +114,27 @@ const Input = styled.input(({ theme }) => ({ const FocusKey = styled.code(({ theme }) => ({ position: 'absolute', top: 8, - right: 16, - minWidth: 16, + right: 9, height: 16, zIndex: 1, lineHeight: '16px', textAlign: 'center', fontSize: '11px', - background: theme.base === 'light' ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.05)', color: theme.base === 'light' ? theme.color.dark : theme.textMutedColor, - borderRadius: 3, userSelect: 'none', pointerEvents: 'none', })); -const ClearIcon = styled(Icons)(({ theme }) => ({ - width: 16, - height: 16, - padding: 4, +const ClearIcon = styled.div(({ theme }) => ({ position: 'absolute', - top: 8, - right: 16, + top: 0, + right: 8, zIndex: 1, - background: theme.base === 'light' ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.1)', - borderRadius: 16, - color: theme.base === 'light' ? theme.color.dark : theme.textMutedColor, + color: theme.textMutedColor, cursor: 'pointer', + display: 'flex', + alignItems: 'center', + height: '100%', })); const FocusContainer = styled.div({ outline: 0 }); @@ -150,18 +142,14 @@ const FocusContainer = styled.div({ outline: 0 }); export const Search = React.memo<{ children: SearchChildrenFn; dataset: CombinedDataset; - isLoading?: boolean; enableShortcuts?: boolean; getLastViewed: () => Selection[]; - clearLastViewed: () => void; initialQuery?: string; }>(function Search({ children, dataset, - isLoading = false, enableShortcuts = true, getLastViewed, - clearLastViewed, initialQuery = '', }) { const api = useStorybookApi(); @@ -279,17 +267,6 @@ export const Search = React.memo<{ // Downshift should completely ignore this return {}; } - if (isClearType(changes.selectedItem)) { - changes.selectedItem.clearLastViewed(); - inputRef.current.blur(); - // Nothing to see anymore, so return to the tree view - return { isOpen: false }; - } - if (isCloseType(changes.selectedItem)) { - inputRef.current.blur(); - // Return to the tree view - return { isOpen: false }; - } return changes; } @@ -344,10 +321,6 @@ export const Search = React.memo<{ } return acc; }, []); - results.push({ closeMenu }); - if (results.length > 0) { - results.push({ clearLastViewed }); - } } const inputId = 'storybook-explorer-searchfield'; @@ -375,11 +348,17 @@ export const Search = React.memo<{ {...getRootProps({ refKey: '' }, { suppressRefError: true })} className="search-field" > - <SearchIcon icon="search" /> + <SearchIconWrapper> + <SearchIcon /> + </SearchIconWrapper> {/* @ts-expect-error (TODO) */} <Input {...inputProps} /> - {enableShortcuts && <FocusKey>{searchShortcut}</FocusKey>} - <ClearIcon icon="cross" onClick={() => clearSelection()} /> + {enableShortcuts && !isOpen && <FocusKey>{searchShortcut}</FocusKey>} + {isOpen && ( + <ClearIcon onClick={() => clearSelection()}> + <CloseIcon /> + </ClearIcon> + )} </SearchField> <FocusContainer tabIndex={0} id="storybook-explorer-menu"> {children({ diff --git a/code/ui/manager/src/components/sidebar/SearchResults.stories.tsx b/code/ui/manager/src/components/sidebar/SearchResults.stories.tsx index c92ef644cc48..6e464e9122be 100644 --- a/code/ui/manager/src/components/sidebar/SearchResults.stories.tsx +++ b/code/ui/manager/src/components/sidebar/SearchResults.stories.tsx @@ -5,14 +5,20 @@ import { mockDataset } from './mockdata'; import { SearchResults } from './SearchResults'; import type { CombinedDataset, Refs, SearchItem } from './types'; import { searchItem } from '../../utils/tree'; +import { IconSymbols } from './IconSymbols'; export default { component: SearchResults, title: 'Sidebar/SearchResults', includeStories: /^[A-Z]/, - parameters: { layout: 'fullscreen', withSymbols: true }, + parameters: { layout: 'fullscreen' }, decorators: [ - (storyFn: any) => <div style={{ padding: '0 20px', maxWidth: '230px' }}>{storyFn()}</div>, + (storyFn: any) => ( + <div style={{ padding: '0 20px', maxWidth: '230px' }}> + <IconSymbols /> + {storyFn()} + </div> + ), ], }; diff --git a/code/ui/manager/src/components/sidebar/SearchResults.tsx b/code/ui/manager/src/components/sidebar/SearchResults.tsx index 2ce58aba337b..3f5eb8c494d1 100644 --- a/code/ui/manager/src/components/sidebar/SearchResults.tsx +++ b/code/ui/manager/src/components/sidebar/SearchResults.tsx @@ -1,49 +1,67 @@ import { styled } from '@storybook/theming'; -import { Icons } from '@storybook/components'; +import { Button, IconButton } from '@storybook/components'; import { global } from '@storybook/global'; -import type { FC, MouseEventHandler, ReactNode } from 'react'; +import type { FC, MouseEventHandler, PropsWithChildren, ReactNode } from 'react'; import React, { useCallback, useEffect } from 'react'; import type { ControllerStateAndHelpers } from 'downshift'; import { useStorybookApi } from '@storybook/manager-api'; import { PRELOAD_ENTRIES } from '@storybook/core-events'; -import { ComponentNode, DocumentNode, Path, RootNode, StoryNode } from './TreeNode'; +import { transparentize } from 'polished'; +import { TrashIcon } from '@storybook/icons'; +import { TypeIcon } from './TreeNode'; import type { Match, DownshiftItem, SearchResult } from './types'; -import { isCloseType, isClearType, isExpandType } from './types'; -// eslint-disable-next-line import/no-cycle -import { getLink } from '../../utils/tree'; +import { isExpandType } from './types'; import { matchesKeyCode, matchesModifiers } from '../../keybinding'; +// eslint-disable-next-line import/no-cycle import { statusMapping } from '../../utils/status'; +import { UseSymbol } from './IconSymbols'; const { document } = global; const ResultsList = styled.ol({ listStyle: 'none', margin: 0, - marginLeft: -20, - marginRight: -20, padding: 0, }); const ResultRow = styled.li<{ isHighlighted: boolean }>(({ theme, isHighlighted }) => ({ + width: '100%', + border: 'none', + cursor: 'pointer', display: 'flex', - alignItems: 'center', - justifyContent: 'space-between', - margin: 0, - padding: 0, - paddingRight: 20, + alignItems: 'start', + textAlign: 'left', + color: 'inherit', + fontSize: `${theme.typography.size.s2}px`, background: isHighlighted ? theme.background.hoverable : 'transparent', - cursor: 'pointer', - 'a:hover, button:hover': { - background: 'transparent', + minHeight: 28, + borderRadius: 4, + gap: 6, + paddingTop: 7, + paddingBottom: 7, + paddingLeft: 8, + paddingRight: 8, + + '&:hover, &:focus': { + background: transparentize(0.93, theme.color.secondary), + outline: 'none', }, - gap: 10, +})); + +const IconWrapper = styled.div({ + marginTop: 2, +}); + +const ResultRowContent = styled.div(() => ({ + display: 'flex', + flexDirection: 'column', })); const NoResults = styled.div(({ theme }) => ({ marginTop: 20, textAlign: 'center', - fontSize: `${theme.typography.size.s2 - 1}px`, + fontSize: `${theme.typography.size.s2}px`, lineHeight: `18px`, color: theme.color.defaultText, small: { @@ -57,62 +75,91 @@ const Mark = styled.mark(({ theme }) => ({ color: theme.color.secondary, })); -const ActionRow = styled(ResultRow)({ - display: 'flex', - padding: '6px 19px', - alignItems: 'center', -}); - -const BackActionRow = styled(ActionRow)({ +const MoreWrapper = styled.div({ marginTop: 8, }); -const ActionLabel = styled.span(({ theme }) => ({ - flexGrow: 1, +const RecentlyOpenedTitle = styled.div(({ theme }) => ({ + display: 'flex', + justifyContent: 'space-between', + fontSize: `${theme.typography.size.s1 - 1}px`, + fontWeight: theme.typography.weight.bold, + minHeight: 28, + letterSpacing: '0.16em', + textTransform: 'uppercase', color: theme.textMutedColor, - fontSize: `${theme.typography.size.s1}px`, -})); + marginTop: 16, + marginBottom: 4, + alignItems: 'center', -const ActionIcon = styled(Icons)(({ theme }) => ({ - display: 'inline-block', - width: 10, - height: 10, - marginRight: 6, - color: theme.textMutedColor, -})); + '.search-result-recentlyOpened-clear': { + visibility: 'hidden', + }, -const ActionKey = styled.code(({ theme }) => ({ - minWidth: 16, - height: 16, - lineHeight: '16px', - textAlign: 'center', - fontSize: '11px', - background: theme.base === 'light' ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.05)', - color: theme.base === 'light' ? theme.color.dark : theme.textMutedColor, - borderRadius: 2, - userSelect: 'none', - pointerEvents: 'none', + '&:hover': { + '.search-result-recentlyOpened-clear': { + visibility: 'visible', + }, + }, })); -const Highlight: FC<{ match?: Match }> = React.memo(function Highlight({ children, match }) { - if (!match) return <>{children}</>; +const Highlight: FC<PropsWithChildren<{ match?: Match }>> = React.memo(function Highlight({ + children, + match, +}) { + if (!match) return children; const { value, indices } = match; const { nodes: result } = indices.reduce<{ cursor: number; nodes: ReactNode[] }>( ({ cursor, nodes }, [start, end], index, { length }) => { - /* eslint-disable react/no-array-index-key */ - nodes.push(<span key={`${index}-0`}>{value.slice(cursor, start)}</span>); - nodes.push(<Mark key={`${index}-1`}>{value.slice(start, end + 1)}</Mark>); + nodes.push(<span>{value.slice(cursor, start)}</span>); + nodes.push(<Mark>{value.slice(start, end + 1)}</Mark>); if (index === length - 1) { - nodes.push(<span key={`${index}-2`}>{value.slice(end + 1)}</span>); + nodes.push(<span>{value.slice(end + 1)}</span>); } - /* eslint-enable react/no-array-index-key */ return { cursor: end + 1, nodes }; }, { cursor: 0, nodes: [] } ); - return <>{result}</>; + return <span>{result}</span>; }); +const Title = styled.div(({ theme }) => ({ + display: 'grid', + justifyContent: 'start', + gridAutoColumns: 'auto', + gridAutoFlow: 'column', + color: theme.textMutedColor, + + '& > span': { + display: 'block', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }, +})); + +const Path = styled.div(({ theme }) => ({ + display: 'grid', + justifyContent: 'start', + gridAutoColumns: 'auto', + gridAutoFlow: 'column', + color: theme.textMutedColor, + fontSize: `${theme.typography.size.s1 - 1}px`, + + '& > span': { + display: 'block', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }, + + '& > span + span': { + '&:before': { + content: "' / '", + }, + }, +})); + const Result: FC< SearchResult & { icon: string; @@ -142,41 +189,43 @@ const Result: FC< const nameMatch = matches.find((match: Match) => match.key === 'name'); const pathMatches = matches.filter((match: Match) => match.key === 'path'); - const label = ( - <div className="search-result-item--label"> - <strong> - <Highlight match={nameMatch}>{item.name}</Highlight> - </strong> - <Path> - {item.path.map((group, index) => ( - // eslint-disable-next-line react/no-array-index-key - <span key={index}> - <Highlight match={pathMatches.find((match: Match) => match.arrayIndex === index)}> - {group} - </Highlight> - </span> - ))} - </Path> - </div> - ); - const title = `${item.path.join(' / ')} / ${item.name}`; - - const nodeProps = { depth: 0, onClick: click, title, children: label }; - let node; - if (item.type === 'component') { - node = <ComponentNode isExpanded={false} {...nodeProps} />; - } else if (item.type === 'story') { - node = <StoryNode href={getLink(item, item.refId)} {...nodeProps} />; - } else { - // @ts-expect-error (TODO) - node = <DocumentNode href={getLink(item, item.refId)} {...nodeProps} />; - } const [i] = item.status ? statusMapping[item.status] : []; return ( - <ResultRow {...props}> - {node} + <ResultRow {...props} onClick={click}> + <IconWrapper> + {item.type === 'component' && ( + <TypeIcon viewBox="0 0 14 14" width="14" height="14" type="component"> + <UseSymbol type="component" /> + </TypeIcon> + )} + {item.type === 'story' && ( + <TypeIcon viewBox="0 0 14 14" width="14" height="14" type="story"> + <UseSymbol type="story" /> + </TypeIcon> + )} + {!(item.type === 'component' || item.type === 'story') && ( + <TypeIcon viewBox="0 0 14 14" width="14" height="14" type="document"> + <UseSymbol type="document" /> + </TypeIcon> + )} + </IconWrapper> + <ResultRowContent className="search-result-item--label"> + <Title> + <Highlight match={nameMatch}>{item.name}</Highlight> + + + {item.path.map((group, index) => ( + // eslint-disable-next-line react/no-array-index-key + + match.arrayIndex === index)}> + {group} + + + ))} + + {item.status ? i : null} ); @@ -191,6 +240,7 @@ export const SearchResults: FC<{ highlightedIndex: number | null; isLoading?: boolean; enableShortcuts?: boolean; + clearLastViewed?: () => void; }> = React.memo(function SearchResults({ query, results, @@ -200,6 +250,7 @@ export const SearchResults: FC<{ highlightedIndex, isLoading = false, enableShortcuts = true, + clearLastViewed, }) { const api = useStorybookApi(); useEffect(() => { @@ -235,12 +286,23 @@ export const SearchResults: FC<{ } }, []); + const handleClearLastViewed = () => { + clearLastViewed(); + closeMenu(); + }; + return ( {results.length > 0 && !query && ( -
  • - Recently opened -
  • + + Recently opened + + + + )} {results.length === 0 && query && (
  • @@ -252,47 +314,17 @@ export const SearchResults: FC<{
  • )} {results.map((result: DownshiftItem, index) => { - if (isCloseType(result)) { - return ( - - - Back to components - ESC - - ); - } - if (isClearType(result)) { - return ( - - - Clear history - - ); - } if (isExpandType(result)) { return ( - - - Show {result.moreCount} more results - + + + ); } diff --git a/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx b/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx index 7c6dfea9a7ab..3e7b7e2b23f3 100644 --- a/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Sidebar.stories.tsx @@ -4,12 +4,15 @@ import type { IndexHash, State } from '@storybook/manager-api'; import { types } from '@storybook/manager-api'; import type { StoryObj, Meta } from '@storybook/react'; import { within, userEvent } from '@storybook/testing-library'; -import { Button, IconButton, Icons } from '@storybook/components'; +import { Button, IconButton } from '@storybook/components'; +import { FaceHappyIcon } from '@storybook/icons'; import { Sidebar, DEFAULT_REF_ID } from './Sidebar'; import { standardData as standardHeaderData } from './Heading.stories'; import * as ExplorerStories from './Explorer.stories'; import { mockDataset } from './mockdata'; import type { RefType } from './types'; +import { LayoutProvider } from '../layout/LayoutProvider'; +import { IconSymbols } from './IconSymbols'; const wait = (ms: number) => new Promise((resolve) => { @@ -20,8 +23,16 @@ const meta = { component: Sidebar, title: 'Sidebar/Sidebar', excludeStories: /.*Data$/, - parameters: { layout: 'fullscreen', withSymbols: true }, - decorators: [ExplorerStories.default.decorators[0]], + parameters: { layout: 'fullscreen' }, + decorators: [ + ExplorerStories.default.decorators[0], + (storyFn) => ( + + + {storyFn()} + + ), + ], } as Meta; export default meta; @@ -56,6 +67,14 @@ const refsError = { }, }; +const refsEmpty = { + optimized: { + ...refs.optimized, + // type: 'auto-inject', + index: {} as IndexHash, + }, +}; + export const Simple: Story = { args: { previewInitialized: true }, render: (args) => ( @@ -175,6 +194,24 @@ export const LoadingWithRefError: Story = { ), }; +export const WithRefEmpty: Story = { + args: { + previewInitialized: true, + }, + render: (args) => ( + + ), +}; + export const StatusesCollapsed: Story = { args: { previewInitialized: true, @@ -261,7 +298,7 @@ export const Bottom: Story = { type: types.experimental_SIDEBAR_BOTTOM, render: () => ( ), @@ -272,7 +309,7 @@ export const Bottom: Story = { render: () => ( ), @@ -283,7 +320,7 @@ export const Bottom: Story = { render: () => ( {' '} - + ), }, diff --git a/code/ui/manager/src/components/sidebar/Sidebar.tsx b/code/ui/manager/src/components/sidebar/Sidebar.tsx index 072603211c21..180870a6892d 100644 --- a/code/ui/manager/src/components/sidebar/Sidebar.tsx +++ b/code/ui/manager/src/components/sidebar/Sidebar.tsx @@ -9,6 +9,7 @@ import type { Addon_SidebarTopType, API_LoadedRefData, } from '@storybook/types'; +import type { HeadingProps } from './Heading'; import { Heading } from './Heading'; // eslint-disable-next-line import/no-cycle @@ -19,10 +20,11 @@ import { Search } from './Search'; import { SearchResults } from './SearchResults'; import type { Refs, CombinedDataset, Selection } from './types'; import { useLastViewed } from './useLastViewed'; +import { MEDIA_DESKTOP_BREAKPOINT } from '../../constants'; export const DEFAULT_REF_ID = 'storybook_internal'; -const Container = styled.nav({ +const Container = styled.nav(({ theme }) => ({ position: 'absolute', zIndex: 1, left: 0, @@ -33,10 +35,18 @@ const Container = styled.nav({ height: '100%', display: 'flex', flexDirection: 'column', -}); + background: theme.background.content, + + [MEDIA_DESKTOP_BREAKPOINT]: { + background: theme.background.app, + }, +})); const Top = styled(Spaced)({ - padding: 20, + paddingLeft: 12, + paddingRight: 12, + paddingBottom: 20, + paddingTop: 16, flex: 1, }); @@ -98,6 +108,7 @@ export interface SidebarProps extends API_LoadedRefData { refId?: string; menuHighlighted?: boolean; enableShortcuts?: boolean; + onMenuClick?: HeadingProps['onMenuClick']; } export const Sidebar = React.memo(function Sidebar({ @@ -113,6 +124,7 @@ export const Sidebar = React.memo(function Sidebar({ menuHighlighted = false, enableShortcuts = true, refs = {}, + onMenuClick, }: SidebarProps) { const selected: Selection = useMemo(() => storyId && { storyId, refId }, [storyId, refId]); const dataset = useCombination({ index, indexError, previewInitialized, status }, refs); @@ -121,7 +133,7 @@ export const Sidebar = React.memo(function Sidebar({ return ( - + - - + {({ query, results, @@ -163,6 +170,7 @@ export const Sidebar = React.memo(function Sidebar({ highlightedIndex={highlightedIndex} enableShortcuts={enableShortcuts} isLoading={isLoading} + clearLastViewed={lastViewedProps.clearLastViewed} /> )} diff --git a/code/ui/manager/src/components/sidebar/Tree.stories.tsx b/code/ui/manager/src/components/sidebar/Tree.stories.tsx index 6889d23c56ac..383468de2e40 100644 --- a/code/ui/manager/src/components/sidebar/Tree.stories.tsx +++ b/code/ui/manager/src/components/sidebar/Tree.stories.tsx @@ -27,7 +27,6 @@ const meta = { excludeStories: /.*Data$/, parameters: { layout: 'fullscreen', - withSymbols: true, theme: 'light', viewport: { defaultViewport: 'sized', diff --git a/code/ui/manager/src/components/sidebar/Tree.tsx b/code/ui/manager/src/components/sidebar/Tree.tsx index e329310e6b88..db64571047bf 100644 --- a/code/ui/manager/src/components/sidebar/Tree.tsx +++ b/code/ui/manager/src/components/sidebar/Tree.tsx @@ -8,20 +8,14 @@ import type { API, } from '@storybook/manager-api'; import { styled } from '@storybook/theming'; -import { Button, Icons, TooltipLinkList, WithTooltip } from '@storybook/components'; +import { Button, IconButton, TooltipLinkList, WithTooltip } from '@storybook/components'; import { transparentize } from 'polished'; import type { MutableRefObject } from 'react'; import React, { useCallback, useMemo, useRef } from 'react'; import { PRELOAD_ENTRIES } from '@storybook/core-events'; -import { - ComponentNode, - DocumentNode, - GroupNode, - RootNode, - StoryNode, - CollapseIcon, -} from './TreeNode'; +import { ExpandAltIcon, CollapseIcon as CollapseIconSvg } from '@storybook/icons'; +import { ComponentNode, DocumentNode, GroupNode, RootNode, StoryNode } from './TreeNode'; import type { ExpandAction, ExpandedState } from './useExpanded'; // eslint-disable-next-line import/no-cycle @@ -36,6 +30,14 @@ import { getLink, } from '../../utils/tree'; import { statusMapping, getHighestStatus, getGroupStatus } from '../../utils/status'; +import { useLayout } from '../layout/LayoutProvider'; +import { IconSymbols } from './IconSymbols'; +import { CollapseIcon } from './components/CollapseIcon'; + +const Container = styled.div<{ hasOrphans: boolean }>((props) => ({ + marginTop: props.hasOrphans ? 20 : 0, + marginBottom: 20, +})); export const Action = styled.button<{ height?: number; width?: number }>( ({ theme, height, width }) => ({ @@ -63,6 +65,7 @@ export const Action = styled.button<{ height?: number; width?: number }>( '&:hover': { color: theme.color.secondary, }, + '&:focus': { color: theme.color.secondary, borderColor: theme.color.secondary, @@ -80,44 +83,19 @@ export const Action = styled.button<{ height?: number; width?: number }>( ); const CollapseButton = styled.button(({ theme }) => ({ - // Reset button - background: 'transparent', - border: 'none', - outline: 'none', - boxSizing: 'content-box', - cursor: 'pointer', - position: 'relative', - textAlign: 'left', - lineHeight: 'normal', - font: 'inherit', - color: 'inherit', - letterSpacing: 'inherit', - textTransform: 'inherit', - + all: 'unset', display: 'flex', - flex: '0 1 auto', - padding: '3px 10px 1px 1px', - margin: 0, - marginLeft: -19, - overflow: 'hidden', - borderRadius: 26, + padding: '0px 8px', + borderRadius: 4, transition: 'color 150ms, box-shadow 150ms', + gap: 6, + alignItems: 'center', + cursor: 'pointer', + height: 28, - 'span:first-of-type': { - marginTop: 4, - marginRight: 7, - }, - - '&:focus': { - boxShadow: `0 0 0 1px ${theme.color.secondary}`, - color: theme.color.secondary, - 'span:first-of-type': { - color: theme.color.secondary, - }, - - '&:not(:focus-visible)': { - boxShadow: 'none', - }, + '&:hover, &:focus': { + outline: 'none', + background: transparentize(0.93, theme.color.secondary), }, })); @@ -127,22 +105,27 @@ export const LeafNodeStyleWrapper = styled.div(({ theme }) => ({ justifyContent: 'space-between', alignItems: 'center', paddingRight: 20, - color: theme.color.defaultText, background: 'transparent', + minHeight: 28, + borderRadius: 4, + '&:hover, &:focus': { outline: 'none', background: transparentize(0.93, theme.color.secondary), }, + '&[data-selected="true"]': { color: theme.color.lightest, background: theme.color.secondary, fontWeight: theme.typography.weight.bold, + '&:hover, &:focus': { background: theme.color.secondary, }, svg: { color: theme.color.lightest }, }, + a: { color: 'currentColor' }, })); @@ -201,6 +184,8 @@ const Node = React.memo(function Node({ onSelectStoryId, api, }) { + const { isDesktop, isMobile, setMobileMenuOpen } = useLayout(); + if (!isDisplayed) { return null; } @@ -231,14 +216,15 @@ const Node = React.memo(function Node({ onClick={(event) => { event.preventDefault(); onSelectStoryId(item.id); + if (isMobile) setMobileMenuOpen(false); }} {...(item.type === 'docs' && { docsMode })} > {(item.renderLabel as (i: typeof item) => React.ReactNode)?.(item) || item.name} {isSelected && ( - - Skip to canvas + + Skip to canvas )} {icon ? ( @@ -289,10 +275,9 @@ const Node = React.memo(function Node({ {item.renderLabel?.(item) || item.name} {isExpanded && ( - { @@ -300,8 +285,8 @@ const Node = React.memo(function Node({ setFullyExpanded(); }} > - - + {isFullyExpanded ? : } + )} ); @@ -329,7 +314,7 @@ const Node = React.memo(function Node({ onClick={(event) => { event.preventDefault(); setExpanded({ ids: [item.id], value: !isExpanded }); - if (item.type === 'component' && !isExpanded) onSelectStoryId(item.id); + if (item.type === 'component' && !isExpanded && isDesktop) onSelectStoryId(item.id); }} onMouseEnter={() => { if (item.isComponent) { @@ -368,11 +353,6 @@ const Root = React.memo(functio ); }); -const Container = styled.div<{ hasOrphans: boolean }>((props) => ({ - marginTop: props.hasOrphans ? 20 : 0, - marginBottom: 20, -})); - export const Tree = React.memo<{ isBrowsing: boolean; isMain: boolean; @@ -503,6 +483,7 @@ export const Tree = React.memo<{ return ( 0}> + {collapsedItems.map((itemId) => { const item = collapsedData[itemId]; const id = createId(itemId, refId); diff --git a/code/ui/manager/src/components/sidebar/TreeNode.stories.tsx b/code/ui/manager/src/components/sidebar/TreeNode.stories.tsx index 78f7de5739fb..cf636c64b48e 100644 --- a/code/ui/manager/src/components/sidebar/TreeNode.stories.tsx +++ b/code/ui/manager/src/components/sidebar/TreeNode.stories.tsx @@ -3,11 +3,20 @@ import { HighlightStyles } from './HighlightStyles'; import { LeafNodeStyleWrapper } from './Tree'; import { ComponentNode, DocumentNode, GroupNode, StoryNode } from './TreeNode'; +import { IconSymbols } from './IconSymbols'; export default { title: 'Sidebar/TreeNode', - parameters: { layout: 'fullscreen', withSymbols: true }, + parameters: { layout: 'fullscreen' }, component: StoryNode, + decorators: [ + (StoryFn: any) => ( + <> + + + + ), + ], }; export const Types = () => ( @@ -32,6 +41,43 @@ export const Expandable = () => ( ); +export const ExpandableLongName = () => ( + <> + + Collapsed component with a very very very very very very very very very very very very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + veryvery very very very very very very very very veryvery very very very very very very very + very very long name + + + Expanded component with a very very very very very very very very very very very very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + veryvery very very very very very very very very veryvery very very very very very very very + very very long name + + + Collapsed group with a very very very very very very very very very very very very very very + very very very very very veryvery very very very very very very very very veryvery very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very very + long name + + + Expanded group with a very very very very very very very very very very very very very very + very very very very very veryvery very very very very very very very very veryvery very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very very + long name + + +); + export const Nested = () => ( <> @@ -110,3 +156,105 @@ export const Selection = () => ( ); + +export const SelectionWithLongName = () => ( + <> + + + + Default story with a very very very very very very very very very very very very very very + very very very very very veryvery very very very very very very very very veryvery very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + very long name + + + + + Selected story with a very very very very very very very very very very very very very very + very very very very very veryvery very very very very very very very very veryvery very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + very long name + + + + + Highlighted story with a very very very very very very very very very very very very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + veryvery very very very very very very very very veryvery very very very very very very very + very very long name + + + + + Highlighted + Selected story with a very very very very very very very very very very very + very very very very very very very very veryvery very very very very very very very very + veryvery very very very very very very very very veryvery very very very very very very very + very veryvery very very very very very very very very veryvery very very very very very very + very very veryvery very very very very very very very very veryvery very very very very very + very very very very long name + + + + + Default group with a very very very very very very very very very very very very very very + very very very very very veryvery very very very very very very very very veryvery very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + very long name + + + + + Highlighted group with a very very very very very very very very very very very very very + very very very very very very veryvery very very very very very very very very veryvery very + very very very very very very very veryvery very very very very very very very very veryvery + very very very very very very very very veryvery very very very very very very very very + veryvery very very very very very very very very veryvery very very very very very very very + very very long name + + + +); diff --git a/code/ui/manager/src/components/sidebar/TreeNode.tsx b/code/ui/manager/src/components/sidebar/TreeNode.tsx index b4c662b358f3..f8e0afb6e99d 100644 --- a/code/ui/manager/src/components/sidebar/TreeNode.tsx +++ b/code/ui/manager/src/components/sidebar/TreeNode.tsx @@ -1,56 +1,24 @@ import { styled } from '@storybook/theming'; -import type { Color, Theme } from '@storybook/theming'; -import { Icons } from '@storybook/components'; import { transparentize } from 'polished'; import type { FC, ComponentProps } from 'react'; import React from 'react'; +import { UseSymbol } from './IconSymbols'; +import { CollapseIcon } from './components/CollapseIcon'; -export const CollapseIcon = styled.span<{ isExpanded: boolean }>(({ theme, isExpanded }) => ({ - display: 'inline-block', - width: 0, - height: 0, - marginLeft: 8, - marginRight: 5, - color: transparentize(0.4, theme.textMutedColor), - borderTop: '3px solid transparent', - borderBottom: '3px solid transparent', - borderLeft: `3px solid`, - transform: isExpanded ? 'rotateZ(90deg)' : 'none', - transition: 'transform .1s ease-out', -})); - -const iconColors = { - light: { - document: '#ff8300', - docsModeDocument: 'secondary', - bookmarkhollow: 'seafoam', - component: 'secondary', - folder: 'ultraviolet', - }, - dark: { - document: 'gold', - docsModeDocument: 'secondary', - bookmarkhollow: 'seafoam', - component: 'secondary', - folder: 'primary', - }, -}; -const isColor = (theme: Theme, color: string): color is keyof Color => color in theme.color; -const TypeIcon = styled(Icons)<{ docsMode?: boolean }>( - { - width: 12, - height: 12, - marginRight: 5, +export const TypeIcon = styled.svg<{ type: 'component' | 'story' | 'group' | 'document' }>( + ({ theme, type }) => ({ + width: 14, + height: 14, flex: '0 0 auto', - }, - - // @ts-expect-error (TODO) - ({ theme, icon, symbol = icon, docsMode }) => { - const colors = theme.base === 'dark' ? iconColors.dark : iconColors.light; - const colorKey = docsMode && symbol === 'document' ? 'docsModeDocument' : symbol; - const color = colors[colorKey as keyof typeof colors]; - return { color: isColor(theme, color) ? theme.color[color] : color }; - } + color: (() => { + if (type === 'group') + return theme.base === 'dark' ? theme.color.primary : theme.color.ultraviolet; + if (type === 'component') return theme.color.secondary; + if (type === 'document') return theme.base === 'dark' ? theme.color.gold : '#ff8300'; + if (type === 'story') return theme.color.seafoam; + return 'currentColor'; + })(), + }) ); const BranchNode = styled.button<{ @@ -66,11 +34,16 @@ const BranchNode = styled.button<{ display: 'flex', alignItems: 'start', textAlign: 'left', - padding: 3, - paddingLeft: `${(isExpandable ? 2 : 18) + depth * 16}px`, + paddingLeft: `${(isExpandable ? 8 : 22) + depth * 18}px`, color: 'inherit', - fontSize: `${theme.typography.size.s2 - 1}px`, + fontSize: `${theme.typography.size.s2}px`, background: 'transparent', + minHeight: 28, + borderRadius: 4, + gap: 6, + paddingTop: 5, + paddingBottom: 4, + '&:hover, &:focus': { background: transparentize(0.93, theme.color.secondary), outline: 'none', @@ -81,50 +54,30 @@ const LeafNode = styled.a<{ depth?: number }>(({ theme, depth = 0 }) => ({ cursor: 'pointer', color: 'inherit', display: 'flex', + gap: 6, flex: 1, alignItems: 'start', - padding: 3, - paddingLeft: `${18 + depth * 16}px`, - fontSize: `${theme.typography.size.s2 - 1}px`, + paddingLeft: `${22 + depth * 18}px`, + paddingTop: 5, + paddingBottom: 4, + fontSize: `${theme.typography.size.s2}px`, textDecoration: 'none', -})); - -export const Path = styled.span(({ theme }) => ({ - display: 'grid', - justifyContent: 'start', - gridAutoColumns: 'auto', - gridAutoFlow: 'column', - color: theme.textMutedColor, - fontSize: `${theme.typography.size.s1 - 1}px`, - '& > span': { - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - }, - '& > span + span': { - position: 'relative', - marginLeft: 4, - paddingLeft: 7, - '&:before': { - content: "'/'", - position: 'absolute', - left: 0, - }, - }, + overflowWrap: 'break-word', + wordWrap: 'break-word', + wordBreak: 'break-word', })); export const RootNode = styled.div(({ theme }) => ({ display: 'flex', alignItems: 'center', justifyContent: 'space-between', - padding: '0 20px', marginTop: 16, marginBottom: 4, fontSize: `${theme.typography.size.s1 - 1}px`, fontWeight: theme.typography.weight.bold, lineHeight: '16px', - minHeight: 20, - letterSpacing: '0.35em', + minHeight: 28, + letterSpacing: '0.16em', textTransform: 'uppercase', color: theme.textMutedColor, })); @@ -132,23 +85,10 @@ export const RootNode = styled.div(({ theme }) => ({ const Wrapper = styled.div({ display: 'flex', alignItems: 'center', + gap: 6, + marginTop: 2, }); -const InvisibleText = styled.p({ - margin: 0, - width: 0, -}); - -// Make the content have a min-height equal to one line of text -export const IconsWrapper: FC<{ children?: React.ReactNode }> = ({ children }) => { - return ( - -   - {children} - - ); -}; - export const GroupNode: FC< ComponentProps & { isExpanded?: boolean; isExpandable?: boolean } > = React.memo(function GroupNode({ @@ -159,10 +99,12 @@ export const GroupNode: FC< }) { return ( - - {isExpandable ? : null} - - + + {isExpandable && } + + + + {children} ); @@ -172,10 +114,12 @@ export const ComponentNode: FC> = React.memo( function ComponentNode({ theme, children, isExpanded, isExpandable, isSelected, ...props }) { return ( - + {isExpandable && } - - + + + + {children} ); @@ -186,9 +130,11 @@ export const DocumentNode: FC & { docsMode: bool function DocumentNode({ theme, children, docsMode, ...props }) { return ( - - - + + + + + {children} ); @@ -202,9 +148,11 @@ export const StoryNode: FC> = React.memo(functio }) { return ( - - - + + + + + {children} ); diff --git a/code/ui/manager/src/components/sidebar/components/CollapseIcon.tsx b/code/ui/manager/src/components/sidebar/components/CollapseIcon.tsx new file mode 100644 index 000000000000..dffbfae73f97 --- /dev/null +++ b/code/ui/manager/src/components/sidebar/components/CollapseIcon.tsx @@ -0,0 +1,32 @@ +import { styled } from '@storybook/theming'; +import type { FC } from 'react'; +import React from 'react'; +import { transparentize } from 'polished'; + +interface CollapseIconProps { + isExpanded: boolean; +} + +export const CollapseIconWrapper = styled.div<{ isExpanded: boolean }>(({ theme, isExpanded }) => ({ + width: 8, + height: 8, + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + color: transparentize(0.4, theme.textMutedColor), + transform: isExpanded ? 'rotateZ(90deg)' : 'none', + transition: 'transform .1s ease-out', +})); + +export const CollapseIcon: FC = ({ isExpanded }) => ( + + + + + +); diff --git a/code/ui/manager/src/components/sidebar/types.ts b/code/ui/manager/src/components/sidebar/types.ts index c0bd12417d66..cb6cc1100bdc 100644 --- a/code/ui/manager/src/components/sidebar/types.ts +++ b/code/ui/manager/src/components/sidebar/types.ts @@ -31,26 +31,12 @@ export interface Match { arrayIndex: number; } -export function isCloseType(x: any): x is CloseType { - return !!(x && x.closeMenu); -} -export function isClearType(x: any): x is ClearType { - return !!(x && x.clearLastViewed); -} export function isExpandType(x: any): x is ExpandType { return !!(x && x.showAll); } export function isSearchResult(x: any): x is SearchResult { return !!(x && x.item); } - -export interface CloseType { - closeMenu: () => void; -} -export interface ClearType { - clearLastViewed: () => void; -} - export interface ExpandType { showAll: () => void; totalCount: number; @@ -62,7 +48,7 @@ export type SearchItem = Item & { refId: string; path: string[]; status?: API_St export type SearchResult = Fuse.FuseResultWithMatches & Fuse.FuseResultWithScore; -export type DownshiftItem = SearchResult | ExpandType | ClearType | CloseType; +export type DownshiftItem = SearchResult | ExpandType; export type SearchChildrenFn = (args: { query: string; diff --git a/code/ui/manager/src/components/sidebar/useExpanded.ts b/code/ui/manager/src/components/sidebar/useExpanded.ts index 66e654f66a24..4657c5d3d60c 100644 --- a/code/ui/manager/src/components/sidebar/useExpanded.ts +++ b/code/ui/manager/src/components/sidebar/useExpanded.ts @@ -104,7 +104,7 @@ export const useExpanded = ({ ); const updateExpanded = useCallback( - ({ ids, value }) => { + ({ ids, value }: ExpandAction) => { setExpanded({ ids, value }); if (ids.length === 1) { const element = containerRef.current?.querySelector( diff --git a/code/ui/manager/src/components/sidebar/useHighlighted.ts b/code/ui/manager/src/components/sidebar/useHighlighted.ts index ff5d5704d983..c259969cfe30 100644 --- a/code/ui/manager/src/components/sidebar/useHighlighted.ts +++ b/code/ui/manager/src/components/sidebar/useHighlighted.ts @@ -40,7 +40,7 @@ export const useHighlighted = ({ const api = useStorybookApi(); const updateHighlighted = useCallback( - (highlight) => { + (highlight: Highlight) => { highlightedRef.current = highlight; setHighlighted(highlight); }, diff --git a/code/ui/manager/src/components/upgrade/UpgradeBlock.stories.tsx b/code/ui/manager/src/components/upgrade/UpgradeBlock.stories.tsx new file mode 100644 index 000000000000..ca3839bd4a00 --- /dev/null +++ b/code/ui/manager/src/components/upgrade/UpgradeBlock.stories.tsx @@ -0,0 +1,34 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { ManagerContext } from '@storybook/manager-api'; +import React from 'react'; +import { UpgradeBlock } from './UpgradeBlock'; + +const meta = { + component: UpgradeBlock, + title: 'UpgradeBlock', + decorators: [ + (storyFn) => ( + ({ + version: '7.2.2-alpha.0', + }), + }, + } as any + } + > + {storyFn()} + + ), + ], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; diff --git a/code/ui/manager/src/components/upgrade/UpgradeBlock.tsx b/code/ui/manager/src/components/upgrade/UpgradeBlock.tsx new file mode 100644 index 000000000000..af39e2fafa63 --- /dev/null +++ b/code/ui/manager/src/components/upgrade/UpgradeBlock.tsx @@ -0,0 +1,75 @@ +import type { FC } from 'react'; +import React, { useState } from 'react'; +import { styled } from '@storybook/theming'; +import { useStorybookApi } from '@storybook/manager-api'; +import { Link } from '@storybook/components'; +import { MEDIA_DESKTOP_BREAKPOINT } from '../../constants'; + +interface UpgradeBlockProps { + onNavigateToWhatsNew?: () => void; +} + +export const UpgradeBlock: FC = ({ onNavigateToWhatsNew }) => { + const api = useStorybookApi(); + const [activeTab, setActiveTab] = useState<'npm' | 'pnpm'>('npm'); + + return ( + + You are on Storybook {api.getCurrentVersion().version} +

    Run the following script to check for updates and upgrade to the latest version.

    + + setActiveTab('npm')}> + npm + + setActiveTab('pnpm')}> + pnpm + + + + {activeTab === 'npm' ? 'npx storybook@latest upgrade' : 'pnpm dlx storybook@latest upgrade'} + + {onNavigateToWhatsNew && ( + // eslint-disable-next-line jsx-a11y/anchor-is-valid + See what's new in Storybook + )} +
    + ); +}; + +const Container = styled.div(({ theme }) => ({ + border: '1px solid', + borderRadius: 5, + padding: 20, + marginTop: 0, + borderColor: theme.appBorderColor, + fontSize: theme.typography.size.s2, + width: '100%', + + [MEDIA_DESKTOP_BREAKPOINT]: { + maxWidth: 400, + }, +})); + +const Tabs = styled.div({ + display: 'flex', + gap: 2, +}); + +const Code = styled.pre(({ theme }) => ({ + background: theme.base === 'light' ? 'rgba(0, 0, 0, 0.05)' : theme.appBorderColor, + fontSize: theme.typography.size.s2 - 1, + margin: '4px 0 16px', +})); + +const ButtonTab = styled.button<{ active: boolean }>(({ theme, active }) => ({ + all: 'unset', + alignItems: 'center', + gap: 10, + color: theme.color.defaultText, + fontSize: theme.typography.size.s2 - 1, + borderBottom: '2px solid transparent', + borderBottomColor: active ? theme.color.secondary : 'none', + padding: '0 10px 5px', + marginBottom: '5px', + cursor: 'pointer', +})); diff --git a/code/ui/manager/src/constants.ts b/code/ui/manager/src/constants.ts new file mode 100644 index 000000000000..42747e87de4a --- /dev/null +++ b/code/ui/manager/src/constants.ts @@ -0,0 +1,3 @@ +export const BREAKPOINT = 600; +export const MEDIA_DESKTOP_BREAKPOINT = `@media (min-width: ${BREAKPOINT}px)`; +export const MOBILE_TRANSITION_DURATION = 300; diff --git a/code/ui/manager/src/containers/Menu.stories.tsx b/code/ui/manager/src/container/Menu.stories.tsx similarity index 91% rename from code/ui/manager/src/containers/Menu.stories.tsx rename to code/ui/manager/src/container/Menu.stories.tsx index 5db85f26f163..9ca8ef175633 100644 --- a/code/ui/manager/src/containers/Menu.stories.tsx +++ b/code/ui/manager/src/container/Menu.stories.tsx @@ -1,9 +1,9 @@ -import type { FunctionComponent, MouseEvent, ReactElement } from 'react'; +import type { FC, MouseEvent, PropsWithChildren, ReactElement } from 'react'; import React, { Children, cloneElement } from 'react'; import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; import { TooltipLinkList, WithTooltip } from '@storybook/components'; -import { Shortcut } from './menu'; +import { Shortcut } from './Menu'; const onLinkClick = action('onLinkClick'); @@ -12,7 +12,7 @@ interface StoryLinkWrapperProps { passHref?: boolean; } -const StoryLinkWrapper: FunctionComponent = ({ +const StoryLinkWrapper: FC> = ({ href, passHref = false, children, diff --git a/code/ui/manager/src/containers/menu.tsx b/code/ui/manager/src/container/Menu.tsx similarity index 93% rename from code/ui/manager/src/containers/menu.tsx rename to code/ui/manager/src/container/Menu.tsx index a387cb24d5f3..9646acf2cddf 100644 --- a/code/ui/manager/src/containers/menu.tsx +++ b/code/ui/manager/src/container/Menu.tsx @@ -1,10 +1,11 @@ import type { FC } from 'react'; import React, { useCallback, useMemo } from 'react'; -import { Badge, Icons } from '@storybook/components'; +import { Badge } from '@storybook/components'; import type { API, State } from '@storybook/manager-api'; import { shortcutToHumanString } from '@storybook/manager-api'; import { styled, useTheme } from '@storybook/theming'; +import { CheckIcon } from '@storybook/icons'; const focusableUIElements = { storySearchField: 'storybook-explorer-searchfield', @@ -52,8 +53,8 @@ export const useMenu = ( api: API, showToolbar: boolean, isFullscreen: boolean, - showPanel: boolean, - showNav: boolean, + isPanelShown: boolean, + isNavShown: boolean, enableShortcuts: boolean ) => { const theme = useTheme(); @@ -101,11 +102,11 @@ export const useMenu = ( id: 'S', title: 'Show sidebar', onClick: () => api.toggleNav(), - active: showNav, + active: isNavShown, right: enableShortcuts ? : null, - left: showNav ? : null, + left: isNavShown ? : null, }), - [api, enableShortcuts, shortcutKeys, showNav] + [api, enableShortcuts, shortcutKeys, isNavShown] ); const toolbarToogle = useMemo( @@ -115,7 +116,7 @@ export const useMenu = ( onClick: () => api.toggleToolbar(), active: showToolbar, right: enableShortcuts ? : null, - left: showToolbar ? : null, + left: showToolbar ? : null, }), [api, enableShortcuts, shortcutKeys, showToolbar] ); @@ -125,11 +126,11 @@ export const useMenu = ( id: 'A', title: 'Show addons', onClick: () => api.togglePanel(), - active: showPanel, + active: isPanelShown, right: enableShortcuts ? : null, - left: showPanel ? : null, + left: isPanelShown ? : null, }), - [api, enableShortcuts, shortcutKeys, showPanel] + [api, enableShortcuts, shortcutKeys, isPanelShown] ); const addonsOrientationToggle = useMemo( @@ -149,7 +150,7 @@ export const useMenu = ( onClick: () => api.toggleFullscreen(), active: isFullscreen, right: enableShortcuts ? : null, - left: isFullscreen ? : null, + left: isFullscreen ? : null, }), [api, enableShortcuts, shortcutKeys, isFullscreen] ); diff --git a/code/ui/manager/src/containers/notifications.tsx b/code/ui/manager/src/container/Notifications.tsx similarity index 72% rename from code/ui/manager/src/containers/notifications.tsx rename to code/ui/manager/src/container/Notifications.tsx index ddea3edb588e..8a578c1d2fb9 100644 --- a/code/ui/manager/src/containers/notifications.tsx +++ b/code/ui/manager/src/container/Notifications.tsx @@ -4,7 +4,7 @@ import React from 'react'; import type { Combo } from '@storybook/manager-api'; import { Consumer } from '@storybook/manager-api'; -import NotificationList from '../components/notifications/NotificationList'; +import { NotificationList } from '../components/notifications/NotificationList'; const mapper = ({ state, api }: Combo) => { return { @@ -13,10 +13,8 @@ const mapper = ({ state, api }: Combo) => { }; }; -const NotificationConnect: FC = (props) => ( +export const Notifications: FC = (props) => ( {(fromState) => } ); - -export default NotificationConnect; diff --git a/code/ui/manager/src/containers/panel.stories.tsx b/code/ui/manager/src/container/Panel.stories.tsx similarity index 100% rename from code/ui/manager/src/containers/panel.stories.tsx rename to code/ui/manager/src/container/Panel.stories.tsx diff --git a/code/ui/manager/src/containers/panel.tsx b/code/ui/manager/src/container/Panel.tsx similarity index 93% rename from code/ui/manager/src/containers/panel.tsx rename to code/ui/manager/src/container/Panel.tsx index a5273a3515fe..a5c1154604b8 100644 --- a/code/ui/manager/src/containers/panel.tsx +++ b/code/ui/manager/src/container/Panel.tsx @@ -3,7 +3,7 @@ import React from 'react'; import memoize from 'memoizerific'; import { Consumer, type Combo } from '@storybook/manager-api'; -import AddonPanel from '../components/panel/panel'; +import { AddonPanel } from '../components/panel/Panel'; const createPanelActions = memoize(1)((api) => ({ onSelect: (panel: string) => api.setSelectedPanel(panel), diff --git a/code/ui/manager/src/containers/preview.tsx b/code/ui/manager/src/container/Preview.tsx similarity index 96% rename from code/ui/manager/src/containers/preview.tsx rename to code/ui/manager/src/container/Preview.tsx index 2b77e97db60d..9fcf7a4a8819 100644 --- a/code/ui/manager/src/containers/preview.tsx +++ b/code/ui/manager/src/container/Preview.tsx @@ -4,7 +4,7 @@ import React from 'react'; import type { Combo, StoriesHash } from '@storybook/manager-api'; import { Consumer } from '@storybook/manager-api'; -import { Preview } from '../components/preview/preview'; +import { Preview } from '../components/preview/Preview'; const { PREVIEW_URL } = global; diff --git a/code/ui/manager/src/containers/sidebar.tsx b/code/ui/manager/src/container/Sidebar.tsx similarity index 75% rename from code/ui/manager/src/containers/sidebar.tsx rename to code/ui/manager/src/container/Sidebar.tsx index 5a8b52870f82..9041badfd5d0 100755 --- a/code/ui/manager/src/containers/sidebar.tsx +++ b/code/ui/manager/src/container/Sidebar.tsx @@ -3,19 +3,24 @@ import React, { useMemo } from 'react'; import type { Combo, StoriesHash } from '@storybook/manager-api'; import { types, Consumer } from '@storybook/manager-api'; +import type { SidebarProps as SidebarComponentProps } from '../components/sidebar/Sidebar'; import { Sidebar as SidebarComponent } from '../components/sidebar/Sidebar'; -import { useMenu } from './menu'; +import { useMenu } from './Menu'; export type Item = StoriesHash[keyof StoriesHash]; -const Sidebar = React.memo(function Sideber() { +interface SidebarProps { + onMenuClick?: SidebarComponentProps['onMenuClick']; +} + +const Sidebar = React.memo(function Sideber({ onMenuClick }: SidebarProps) { const mapper = ({ state, api }: Combo) => { const { ui: { name, url, enableShortcuts }, viewMode, storyId, refId, - layout: { showToolbar, isFullscreen, showPanel, showNav }, + layout: { showToolbar }, index, status, indexError, @@ -27,9 +32,9 @@ const Sidebar = React.memo(function Sideber() { state, api, showToolbar, - isFullscreen, - showPanel, - showNav, + api.getIsFullscreen(), + api.getIsPanelShown(), + api.getIsNavShown(), enableShortcuts ); @@ -58,10 +63,11 @@ const Sidebar = React.memo(function Sideber() { extra: top, }; }; + return ( {(fromState) => { - return ; + return ; }} ); diff --git a/code/ui/manager/src/globals-runtime.ts b/code/ui/manager/src/globals-runtime.ts new file mode 100644 index 000000000000..3c12f1e16492 --- /dev/null +++ b/code/ui/manager/src/globals-runtime.ts @@ -0,0 +1,28 @@ +import { global } from '@storybook/global'; + +import { TELEMETRY_ERROR } from '@storybook/core-events'; + +import { globalsNameValueMap } from './globals/runtime'; +import { globalPackages, globalsNameReferenceMap } from './globals/globals'; +import { prepareForTelemetry, shouldSkipError } from './utils/prepareForTelemetry'; + +// Apply all the globals +globalPackages.forEach((key) => { + global[globalsNameReferenceMap[key]] = globalsNameValueMap[key]; +}); + +global.sendTelemetryError = (error) => { + if (!shouldSkipError(error)) { + const channel = global.__STORYBOOK_ADDONS_CHANNEL__; + channel.emit(TELEMETRY_ERROR, prepareForTelemetry(error)); + } +}; + +// handle all uncaught errors at the root of the application and log to telemetry +global.addEventListener('error', (args) => { + const error = args.error || args; + global.sendTelemetryError(error); +}); +global.addEventListener('unhandledrejection', ({ reason }) => { + global.sendTelemetryError(reason); +}); diff --git a/code/ui/manager/src/globals/exports.ts b/code/ui/manager/src/globals/exports.ts index f56ba153dd82..7505127ecb71 100644 --- a/code/ui/manager/src/globals/exports.ts +++ b/code/ui/manager/src/globals/exports.ts @@ -21,28 +21,36 @@ export default { 'isValidElement', 'lazy', 'memo', + 'startTransition', + 'unstable_act', 'useCallback', 'useContext', 'useDebugValue', + 'useDeferredValue', 'useEffect', + 'useId', 'useImperativeHandle', + 'useInsertionEffect', 'useLayoutEffect', 'useMemo', 'useReducer', 'useRef', 'useState', + 'useSyncExternalStore', + 'useTransition', 'version', ], 'react-dom': [ '__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED', 'createPortal', + 'createRoot', 'findDOMNode', 'flushSync', 'hydrate', + 'hydrateRoot', 'render', 'unmountComponentAtNode', 'unstable_batchedUpdates', - 'unstable_createPortal', 'unstable_renderSubtreeIntoContainer', 'version', ], @@ -169,6 +177,11 @@ export default { 'UPDATE_QUERY_PARAMS', 'UPDATE_STORY_ARGS', ], + '@storybook/core-events/manager-errors': [ + 'Category', + 'ProviderDoesNotExtendBaseProviderError', + 'UncaughtManagerError', + ], '@storybook/router': [ 'BaseLocationProvider', 'DEEPLY_EQUAL', @@ -212,37 +225,234 @@ export default { 'useTheme', 'withTheme', ], - '@storybook/api': [ - 'ActiveTabs', - 'Consumer', - 'ManagerContext', - 'Provider', - 'addons', - 'combineParameters', - 'controlOrMetaKey', - 'controlOrMetaSymbol', - 'eventMatchesShortcut', - 'eventToShortcut', - 'isMacLike', - 'isShortcutTaken', - 'keyToSymbol', - 'merge', - 'mockChannel', - 'optionOrAltSymbol', - 'shortcutMatchesShortcut', - 'shortcutToHumanString', - 'types', - 'useAddonState', - 'useArgTypes', - 'useArgs', - 'useChannel', - 'useGlobalTypes', - 'useGlobals', - 'useParameter', - 'useSharedState', - 'useStoryPrepared', - 'useStorybookApi', - 'useStorybookState', + '@storybook/icons': [ + 'AccessibilityAltIcon', + 'AccessibilityIcon', + 'AddIcon', + 'AdminIcon', + 'AlertAltIcon', + 'AlertIcon', + 'AppleIcon', + 'ArrowDownIcon', + 'ArrowLeftIcon', + 'ArrowRightIcon', + 'ArrowSolidDownIcon', + 'ArrowSolidLeftIcon', + 'ArrowSolidRightIcon', + 'ArrowSolidUpIcon', + 'ArrowUpIcon', + 'AzureDevOpsIcon', + 'BackIcon', + 'BasketIcon', + 'BatchAcceptIcon', + 'BatchDenyIcon', + 'BeakerIcon', + 'BellIcon', + 'BitbucketIcon', + 'BoldIcon', + 'BookIcon', + 'BookmarkHollowIcon', + 'BookmarkIcon', + 'BottomBarIcon', + 'BottomBarToggleIcon', + 'BoxIcon', + 'BranchIcon', + 'BrowserIcon', + 'ButtonIcon', + 'CPUIcon', + 'CalendarIcon', + 'CameraIcon', + 'CategoryIcon', + 'CertificateIcon', + 'ChangedIcon', + 'ChatIcon', + 'CheckIcon', + 'ChevronDownIcon', + 'ChevronLeftIcon', + 'ChevronRightIcon', + 'ChevronSmallDownIcon', + 'ChevronSmallLeftIcon', + 'ChevronSmallRightIcon', + 'ChevronSmallUpIcon', + 'ChevronUpIcon', + 'ChromaticIcon', + 'ChromeIcon', + 'CircleHollowIcon', + 'CircleIcon', + 'ClearIcon', + 'CloseAltIcon', + 'CloseIcon', + 'CloudHollowIcon', + 'CloudIcon', + 'CogIcon', + 'CollapseIcon', + 'CommandIcon', + 'CommentAddIcon', + 'CommentIcon', + 'CommentsIcon', + 'CommitIcon', + 'CompassIcon', + 'ComponentDrivenIcon', + 'ComponentIcon', + 'ContrastIcon', + 'ControlsIcon', + 'CopyIcon', + 'CreditIcon', + 'CrossIcon', + 'DashboardIcon', + 'DatabaseIcon', + 'DeleteIcon', + 'DiamondIcon', + 'DirectionIcon', + 'DiscordIcon', + 'DocChartIcon', + 'DocListIcon', + 'DocumentIcon', + 'DownloadIcon', + 'DragIcon', + 'EditIcon', + 'EllipsisIcon', + 'EmailIcon', + 'ExpandAltIcon', + 'ExpandIcon', + 'EyeCloseIcon', + 'EyeIcon', + 'FaceHappyIcon', + 'FaceNeutralIcon', + 'FaceSadIcon', + 'FacebookIcon', + 'FailedIcon', + 'FastForwardIcon', + 'FigmaIcon', + 'FilterIcon', + 'FlagIcon', + 'FolderIcon', + 'FormIcon', + 'GDriveIcon', + 'GithubIcon', + 'GitlabIcon', + 'GlobeIcon', + 'GoogleIcon', + 'GraphBarIcon', + 'GraphLineIcon', + 'GraphqlIcon', + 'GridAltIcon', + 'GridIcon', + 'GrowIcon', + 'HeartHollowIcon', + 'HeartIcon', + 'HomeIcon', + 'HourglassIcon', + 'InfoIcon', + 'ItalicIcon', + 'JumpToIcon', + 'KeyIcon', + 'LightningIcon', + 'LightningOffIcon', + 'LinkBrokenIcon', + 'LinkIcon', + 'LinkedinIcon', + 'LinuxIcon', + 'ListOrderedIcon', + 'ListUnorderedIcon', + 'LocationIcon', + 'LockIcon', + 'MarkdownIcon', + 'MarkupIcon', + 'MediumIcon', + 'MemoryIcon', + 'MenuIcon', + 'MenuReverseIcon', + 'MergeIcon', + 'MirrorIcon', + 'MobileIcon', + 'MoonIcon', + 'NutIcon', + 'OutboxIcon', + 'OutlineIcon', + 'PaintBrushIcon', + 'PaperClipIcon', + 'ParagraphIcon', + 'PassedIcon', + 'PhoneIcon', + 'PhotoDragIcon', + 'PhotoIcon', + 'PinAltIcon', + 'PinIcon', + 'PlayBackIcon', + 'PlayIcon', + 'PlayNextIcon', + 'PlusIcon', + 'PointerDefaultIcon', + 'PointerHandIcon', + 'PowerIcon', + 'PrintIcon', + 'ProceedIcon', + 'ProfileIcon', + 'PullRequestIcon', + 'QuestionIcon', + 'RSSIcon', + 'RedirectIcon', + 'ReduxIcon', + 'RefreshIcon', + 'ReplyIcon', + 'RepoIcon', + 'RequestChangeIcon', + 'RewindIcon', + 'RulerIcon', + 'SearchIcon', + 'ShareAltIcon', + 'ShareIcon', + 'ShieldIcon', + 'SideBySideIcon', + 'SidebarAltIcon', + 'SidebarAltToggleIcon', + 'SidebarIcon', + 'SidebarToggleIcon', + 'SpeakerIcon', + 'StackedIcon', + 'StarHollowIcon', + 'StarIcon', + 'StickerIcon', + 'StopAltIcon', + 'StopIcon', + 'StorybookIcon', + 'StructureIcon', + 'SubtractIcon', + 'SunIcon', + 'SupportIcon', + 'SwitchAltIcon', + 'SyncIcon', + 'TabletIcon', + 'ThumbsUpIcon', + 'TimeIcon', + 'TimerIcon', + 'TransferIcon', + 'TrashIcon', + 'TwitterIcon', + 'TypeIcon', + 'UbuntuIcon', + 'UndoIcon', + 'UnfoldIcon', + 'UnlockIcon', + 'UnpinIcon', + 'UploadIcon', + 'UserAddIcon', + 'UserAltIcon', + 'UserIcon', + 'UsersIcon', + 'VSCodeIcon', + 'VerifiedIcon', + 'VideoIcon', + 'WandIcon', + 'WatchIcon', + 'WindowsIcon', + 'WrenchIcon', + 'YoutubeIcon', + 'ZoomIcon', + 'ZoomOutIcon', + 'ZoomResetIcon', + 'iconList', ], '@storybook/manager-api': [ 'ActiveTabs', @@ -276,7 +486,6 @@ export default { 'useStorybookApi', 'useStorybookState', ], - '@storybook/addons': ['addons', 'types', 'mockChannel'], '@storybook/client-logger': ['deprecate', 'logger', 'once', 'pretty'], '@storybook/types': ['Addon_TypesEnum'], } as const; diff --git a/code/ui/manager/src/globals/globals.ts b/code/ui/manager/src/globals/globals.ts index 1ef93c38bc94..e8296a16fd83 100644 --- a/code/ui/manager/src/globals/globals.ts +++ b/code/ui/manager/src/globals/globals.ts @@ -5,11 +5,11 @@ export const globalsNameReferenceMap = { '@storybook/components': '__STORYBOOK_COMPONENTS__', '@storybook/channels': '__STORYBOOK_CHANNELS__', '@storybook/core-events': '__STORYBOOK_CORE_EVENTS__', + '@storybook/core-events/manager-errors': '__STORYBOOK_CORE_EVENTS_MANAGER_ERRORS__', '@storybook/router': '__STORYBOOK_ROUTER__', '@storybook/theming': '__STORYBOOK_THEMING__', - '@storybook/api': '__STORYBOOK_API__', // deprecated, remove in 8.0 + '@storybook/icons': '__STORYBOOK_ICONS__', '@storybook/manager-api': '__STORYBOOK_API__', - '@storybook/addons': '__STORYBOOK_ADDONS__', '@storybook/client-logger': '__STORYBOOK_CLIENT_LOGGER__', '@storybook/types': '__STORYBOOK_TYPES__', } as const; diff --git a/code/ui/manager/src/globals/runtime.ts b/code/ui/manager/src/globals/runtime.ts index 59f5f8fc1a09..8b617d586add 100644 --- a/code/ui/manager/src/globals/runtime.ts +++ b/code/ui/manager/src/globals/runtime.ts @@ -4,7 +4,9 @@ import * as REACT_DOM from 'react-dom'; import * as COMPONENTS from '@storybook/components'; import * as CHANNELS from '@storybook/channels'; import * as EVENTS from '@storybook/core-events'; +import * as EVENTS_MANAGER_ERRORS from '@storybook/core-events/manager-errors'; import * as ROUTER from '@storybook/router'; +import * as ICONS from '@storybook/icons'; import * as THEMING from '@storybook/theming'; import * as MANAGER_API from '@storybook/manager-api'; import * as TYPES from '@storybook/types'; @@ -19,16 +21,11 @@ export const globalsNameValueMap: Required = ({ provider }) => ( const Main: FC<{ provider: Provider }> = ({ provider }) => { const navigate = useNavigate(); + return ( {(locationData) => ( @@ -47,32 +50,32 @@ const Main: FC<{ provider: Provider }> = ({ provider }) => { navigate={navigate} docsOptions={global?.DOCS_OPTIONS || {}} > - {({ state, api }: Combo) => { - const panelCount = Object.keys(api.getElements(types.PANEL)).length; + {(combo: Combo) => { + const { state, api } = combo; + const setManagerLayoutState = useCallback< + ComponentProps['setManagerLayoutState'] + >( + (sizes) => { + api.setSizes(sizes); + }, + [api] + ); + const pages: Addon_PageType[] = useMemo( () => [settingsPageAddon, ...Object.values(api.getElements(types.experimental_PAGE))], [Object.keys(api.getElements(types.experimental_PAGE)).join()] ); - const story = api.getData(state.storyId, state.refId); - const isLoading = story - ? !!state.refs[state.refId] && !state.refs[state.refId].previewInitialized - : !state.previewInitialized; - - const layout = useMemo( - () => (isLoading ? { ...state.layout, showPanel: false } : state.layout), - [isLoading, state.layout] - ); - return ( - + + + ); }} @@ -87,7 +90,8 @@ export function renderStorybookUI(domNode: HTMLElement, provider: Provider) { throw new ProviderDoesNotExtendBaseProviderError(); } - ReactDOM.render(, domNode); + const root = createRoot(domNode); + root.render(); } export { Provider }; diff --git a/code/ui/manager/src/runtime.ts b/code/ui/manager/src/runtime.ts index f66bde4de3d3..861fc3b88fcb 100644 --- a/code/ui/manager/src/runtime.ts +++ b/code/ui/manager/src/runtime.ts @@ -5,14 +5,10 @@ import type { AddonStore } from '@storybook/manager-api'; import { addons } from '@storybook/manager-api'; import type { Addon_Types, Addon_Config } from '@storybook/types'; import { createBrowserChannel } from '@storybook/channels'; -import { CHANNEL_CREATED, TELEMETRY_ERROR } from '@storybook/core-events'; +import { CHANNEL_CREATED } from '@storybook/core-events'; import Provider from './provider'; import { renderStorybookUI } from './index'; -import { globalsNameValueMap } from './globals/runtime'; -import { globalPackages, globalsNameReferenceMap } from './globals/globals'; -import { prepareForTelemetry, shouldSkipError } from './utils/prepareForTelemetry'; - const { FEATURES, CONFIG_TYPE } = global; class ReactProvider extends Provider { @@ -57,27 +53,6 @@ class ReactProvider extends Provider { } } -// Apply all the globals -globalPackages.forEach((key) => { - global[globalsNameReferenceMap[key]] = globalsNameValueMap[key]; -}); - -global.sendTelemetryError = (error) => { - if (!shouldSkipError(error)) { - const channel = global.__STORYBOOK_ADDONS_CHANNEL__; - channel.emit(TELEMETRY_ERROR, prepareForTelemetry(error)); - } -}; - -// handle all uncaught errors at the root of the application and log to telemetry -global.addEventListener('error', (args) => { - const error = args.error || args; - global.sendTelemetryError(error); -}); -global.addEventListener('unhandledrejection', ({ reason }) => { - global.sendTelemetryError(reason); -}); - const { document } = global; const rootEl = document.getElementById('root'); renderStorybookUI(rootEl, new ReactProvider()); diff --git a/code/ui/manager/src/settings/About.tsx b/code/ui/manager/src/settings/About.tsx new file mode 100644 index 000000000000..797af9dcc732 --- /dev/null +++ b/code/ui/manager/src/settings/About.tsx @@ -0,0 +1,102 @@ +import type { FC } from 'react'; +import React from 'react'; +import { styled } from '@storybook/theming'; + +import { Button as BaseButton, Link, StorybookIcon } from '@storybook/components'; +import { DocumentIcon, GithubIcon } from '@storybook/icons'; +import { UpgradeBlock } from '../components/upgrade/UpgradeBlock'; + +const Header = styled.header(({ theme }) => ({ + marginBottom: 32, + fontSize: theme.typography.size.l2, + color: theme.base === 'light' ? theme.color.darkest : theme.color.lightest, + fontWeight: theme.typography.weight.bold, + alignItems: 'center', + display: 'flex', + + '> svg': { + height: 48, + width: 'auto', + marginRight: 8, + }, +})); + +const Container = styled.div({ + display: `flex`, + alignItems: 'center', + justifyContent: 'center', + height: 'calc(100% - 40px)', + flexDirection: 'column', +}); + +const Footer = styled.div(({ theme }) => ({ + marginBottom: 24, + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + color: theme.base === 'light' ? theme.color.dark : theme.color.lightest, + fontWeight: theme.typography.weight.regular, + fontSize: theme.typography.size.s2, +})); + +const SquareButton = styled(BaseButton)(({ theme }) => ({ + '&&': { + borderRadius: 4, + fontSize: '13px', + lineHeight: '14px', + color: theme.base === 'light' ? theme.color.darker : theme.color.lightest, + padding: '9px 12px', + svg: { + marginRight: 6, + }, + }, +})); + +const StyledLink = styled(Link as any)(({ theme }) => ({ + '&&': { + fontWeight: theme.typography.weight.bold, + color: theme.base === 'light' ? theme.color.dark : theme.color.light, + }, + '&:hover': { + color: theme.base === 'light' ? theme.color.darkest : theme.color.lightest, + }, +})); + +const AboutScreen: FC<{ onNavigateToWhatsNew?: () => void }> = ({ onNavigateToWhatsNew }) => { + return ( + +
    +
    + Storybook +
    + +
    + + + ); +}; + +export { AboutScreen }; diff --git a/code/ui/manager/src/settings/about_page.tsx b/code/ui/manager/src/settings/AboutPage.tsx similarity index 77% rename from code/ui/manager/src/settings/about_page.tsx rename to code/ui/manager/src/settings/AboutPage.tsx index e20d89d5362a..4d39f43dba36 100644 --- a/code/ui/manager/src/settings/about_page.tsx +++ b/code/ui/manager/src/settings/AboutPage.tsx @@ -1,12 +1,14 @@ -import type { FC } from 'react'; +import type { FC, PropsWithChildren } from 'react'; import React, { Component, useCallback } from 'react'; import { type API, useStorybookApi, useStorybookState } from '@storybook/manager-api'; -import { AboutScreen } from './about'; +import { AboutScreen } from './About'; // Clear a notification on mount. This could be exported by core/notifications.js perhaps? -class NotificationClearer extends Component<{ api: API; notificationId: string }> { +class NotificationClearer extends Component< + PropsWithChildren<{ api: API; notificationId: string }> +> { componentDidMount() { const { api, notificationId } = this.props; api.clearNotification(notificationId); @@ -18,7 +20,7 @@ class NotificationClearer extends Component<{ api: API; notificationId: string } } } -const AboutPage: FC = () => { +export const AboutPage: FC = () => { const api = useStorybookApi(); const state = useStorybookState(); @@ -28,7 +30,6 @@ const AboutPage: FC = () => { return ( { ); }; - -export { AboutPage }; diff --git a/code/ui/manager/src/settings/shortcuts_page.tsx b/code/ui/manager/src/settings/ShortcutsPage.tsx similarity index 100% rename from code/ui/manager/src/settings/shortcuts_page.tsx rename to code/ui/manager/src/settings/ShortcutsPage.tsx diff --git a/code/ui/manager/src/settings/about.stories.tsx b/code/ui/manager/src/settings/about.stories.tsx index 67fcabcf6667..3ef0bf84397e 100644 --- a/code/ui/manager/src/settings/about.stories.tsx +++ b/code/ui/manager/src/settings/about.stories.tsx @@ -1,11 +1,13 @@ import type { Meta, StoryObj } from '@storybook/react'; import React from 'react'; -import { AboutScreen } from './about'; +import { AboutScreen } from './About'; +import UpgradeBlockStoriesMeta from '../components/upgrade/UpgradeBlock.stories'; const meta = { component: AboutScreen, title: 'Settings/AboutScreen', decorators: [ + UpgradeBlockStoriesMeta.decorators[0], (Story) => (
    ; export const Default: Story = { - args: { - current: { - version: '7.0.1', - }, - }, parameters: { design: { type: 'figma', diff --git a/code/ui/manager/src/settings/about.tsx b/code/ui/manager/src/settings/about.tsx deleted file mode 100644 index 7fb70f5eae59..000000000000 --- a/code/ui/manager/src/settings/about.tsx +++ /dev/null @@ -1,162 +0,0 @@ -/* eslint-disable no-nested-ternary */ -import type { FC } from 'react'; -import React, { useState } from 'react'; -import { styled } from '@storybook/theming'; -import type { State } from '@storybook/manager-api'; - -import { Button as BaseButton, Icons, Link, StorybookIcon } from '@storybook/components'; - -const Header = styled.header(({ theme }) => ({ - marginBottom: 32, - fontSize: theme.typography.size.l2, - color: theme.base === 'light' ? theme.color.darkest : theme.color.lightest, - fontWeight: theme.typography.weight.bold, - alignItems: 'center', - display: 'flex', - - '> svg': { - height: 48, - width: 'auto', - marginRight: 8, - }, -})); - -const Container = styled.div({ - display: `flex`, - alignItems: 'center', - justifyContent: 'center', - height: 'calc(100% - 40px)', - flexDirection: 'column', -}); - -const UpgradeBlock = styled.div(({ theme }) => { - return { - border: '1px solid', - borderRadius: 5, - padding: 20, - margin: 20, - marginTop: 0, - maxWidth: 400, - borderColor: theme.appBorderColor, - fontSize: theme.typography.size.s2, - }; -}); - -const Code = styled.pre(({ theme }) => ({ - background: theme.base === 'light' ? 'rgba(0, 0, 0, 0.05)' : theme.appBorderColor, - fontSize: theme.typography.size.s2 - 1, - margin: '4px 0 16px', -})); - -const Footer = styled.div(({ theme }) => ({ - marginBottom: 24, - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - color: theme.base === 'light' ? theme.color.dark : theme.color.lightest, - fontWeight: theme.typography.weight.regular, - fontSize: theme.typography.size.s2, -})); - -const SquareButton = styled(BaseButton)(({ theme }) => ({ - '&&': { - borderRadius: 4, - fontSize: '13px', - lineHeight: '14px', - color: theme.base === 'light' ? theme.color.darker : theme.color.lightest, - padding: '9px 12px', - svg: { - marginRight: 6, - }, - }, -})); - -const TabButton = styled(BaseButton)<{ active: boolean }>(({ theme, active }) => ({ - '&&': { - padding: 2, - paddingRight: 8, - margin: 0, - color: active - ? theme.color.secondary - : theme.base === 'light' - ? theme.color.dark - : theme.color.lightest, - }, -})); - -const StyledLink = styled(Link as any)(({ theme }) => ({ - '&&': { - fontWeight: theme.typography.weight.bold, - color: theme.base === 'light' ? theme.color.dark : theme.color.light, - }, - '&:hover': { - color: theme.base === 'light' ? theme.color.darkest : theme.color.lightest, - }, -})); - -const AboutScreen: FC<{ - current: State['versions']['current']; - onNavigateToWhatsNew?: () => void; -}> = ({ current, onNavigateToWhatsNew }) => { - const [activeTab, setActiveTab] = useState<'npm' | 'pnpm'>('npm'); - return ( - -
    -
    - Storybook -
    - - You are on Storybook {current.version} -

    Run the following script to check for updates and upgrade to the latest version.

    -
    - setActiveTab('npm')}> - npm - - setActiveTab('pnpm')}> - pnpm - -
    - - - {activeTab === 'npm' - ? 'npx storybook@latest upgrade' - : 'pnpm dlx storybook@latest upgrade'} - - {onNavigateToWhatsNew && ( - // eslint-disable-next-line jsx-a11y/anchor-is-valid - See what's new in Storybook - )} -
    - -
    -
    -
    - - - GitHub - - - - - Documentation - -
    -
    - Open source software maintained by{' '} - Chromatic and the{' '} - - Storybook Community - -
    -
    - - ); -}; - -export { AboutScreen }; diff --git a/code/ui/manager/src/settings/defaultShortcuts.tsx b/code/ui/manager/src/settings/defaultShortcuts.tsx new file mode 100644 index 000000000000..bd17f36f036d --- /dev/null +++ b/code/ui/manager/src/settings/defaultShortcuts.tsx @@ -0,0 +1,23 @@ +import type { State } from 'lib/manager-api/src'; + +export const defaultShortcuts: State['shortcuts'] = { + fullScreen: ['F'], + togglePanel: ['A'], + panelPosition: ['D'], + toggleNav: ['S'], + toolbar: ['T'], + search: ['/'], + focusNav: ['1'], + focusIframe: ['2'], + focusPanel: ['3'], + prevComponent: ['alt', 'ArrowUp'], + nextComponent: ['alt', 'ArrowDown'], + prevStory: ['alt', 'ArrowLeft'], + nextStory: ['alt', 'ArrowRight'], + shortcutsPage: ['ctrl', 'shift', ','], + aboutPage: [','], + escape: ['escape'], + collapseAll: ['ctrl', 'shift', 'ArrowUp'], + expandAll: ['ctrl', 'shift', 'ArrowDown'], + remount: ['alt', 'R'], +}; diff --git a/code/ui/manager/src/settings/index.tsx b/code/ui/manager/src/settings/index.tsx index 24b0b12a8229..eec87d2ae18e 100644 --- a/code/ui/manager/src/settings/index.tsx +++ b/code/ui/manager/src/settings/index.tsx @@ -1,5 +1,5 @@ import { useStorybookApi, useStorybookState, types } from '@storybook/manager-api'; -import { IconButton, Icons, FlexBar, TabBar, TabButton, ScrollArea } from '@storybook/components'; +import { IconButton, FlexBar, TabBar, TabButton, ScrollArea } from '@storybook/components'; import { Location, Route } from '@storybook/router'; import { styled } from '@storybook/theming'; import { global } from '@storybook/global'; @@ -7,9 +7,10 @@ import type { FC, SyntheticEvent } from 'react'; import React, { Fragment } from 'react'; import type { Addon_PageType } from '@storybook/types'; -import { AboutPage } from './about_page'; +import { CloseIcon } from '@storybook/icons'; +import { AboutPage } from './AboutPage'; +import { ShortcutsPage } from './ShortcutsPage'; import { WhatsNewPage } from './whats_new_page'; -import { ShortcutsPage } from './shortcuts_page'; import { matchesModifiers, matchesKeyCode } from '../keybinding'; const { document } = global; @@ -45,19 +46,9 @@ const TabBarButton = React.memo(function TabBarButton({ ); }); -const Content = styled(ScrollArea)( - { - position: 'absolute', - top: 40, - left: 0, - right: 0, - bottom: 0, - overflow: 'auto', - }, - ({ theme }) => ({ - background: theme.background.content, - }) -); +const Content = styled(ScrollArea)(({ theme }) => ({ + background: theme.background.content, +})); const Pages: FC<{ onClose: () => void; @@ -94,7 +85,7 @@ const Pages: FC<{ }} title="Close settings page" > - + diff --git a/code/ui/manager/src/settings/shortcuts.stories.tsx b/code/ui/manager/src/settings/shortcuts.stories.tsx index e3260e43bf8e..47d7397584e4 100644 --- a/code/ui/manager/src/settings/shortcuts.stories.tsx +++ b/code/ui/manager/src/settings/shortcuts.stories.tsx @@ -3,28 +3,7 @@ import { actions as makeActions } from '@storybook/addon-actions'; import type { DecoratorFn } from '@storybook/react'; import { ShortcutsScreen } from './shortcuts'; - -const defaultShortcuts = { - fullScreen: ['F'], - togglePanel: ['A'], - panelPosition: ['D'], - toggleNav: ['S'], - toolbar: ['T'], - search: ['/'], - focusNav: ['1'], - focusIframe: ['2'], - focusPanel: ['3'], - prevComponent: ['alt', 'ArrowUp'], - nextComponent: ['alt', 'ArrowDown'], - prevStory: ['alt', 'ArrowLeft'], - nextStory: ['alt', 'ArrowRight'], - shortcutsPage: ['ctrl', 'shift', ','], - aboutPage: [','], - escape: ['escape'], // This one is not customizable - collapseAll: ['ctrl', 'shift', 'ArrowUp'], - expandAll: ['ctrl', 'shift', 'ArrowDown'], - remount: ['alt', 'R'], -}; +import { defaultShortcuts } from './defaultShortcuts'; const actions = makeActions( 'setShortcut', diff --git a/code/ui/manager/src/settings/shortcuts.tsx b/code/ui/manager/src/settings/shortcuts.tsx index 57de523eb8b7..dc02ff9166b0 100644 --- a/code/ui/manager/src/settings/shortcuts.tsx +++ b/code/ui/manager/src/settings/shortcuts.tsx @@ -7,7 +7,7 @@ import { shortcutToHumanString, shortcutMatchesShortcut, } from '@storybook/manager-api'; -import { Form, Icons } from '@storybook/components'; +import { Button, Form, Icons } from '@storybook/components'; import SettingsFooter from './SettingsFooter'; const Header = styled.header(({ theme }) => ({ @@ -307,9 +307,14 @@ class ShortcutsScreen extends ComponentKeyboard shortcuts {layout} - + diff --git a/code/ui/manager/src/settings/whats_new.tsx b/code/ui/manager/src/settings/whats_new.tsx index b9e11aea2a7b..ee6aba4e6c53 100644 --- a/code/ui/manager/src/settings/whats_new.tsx +++ b/code/ui/manager/src/settings/whats_new.tsx @@ -1,9 +1,10 @@ import type { ComponentProps, FC } from 'react'; import React, { Fragment, useEffect, useState } from 'react'; import { styled, useTheme } from '@storybook/theming'; -import { Button, IconButton, Icons, Loader } from '@storybook/components'; +import { Button, IconButton, Loader } from '@storybook/components'; import { useStorybookApi, useStorybookState } from '@storybook/manager-api'; import { global } from '@storybook/global'; +import { EyeCloseIcon, EyeIcon, HeartIcon, AlertIcon as AlertIconSvg } from '@storybook/icons'; const Centered = styled.div({ top: '50%', @@ -77,7 +78,7 @@ export const WhatsNewFooter = ({ return (
    - +
    Share this with your team.
    {copyText} @@ -86,12 +87,12 @@ export const WhatsNewFooter = ({ {isNotificationsEnabled ? ( <> - +  Hide notifications ) : ( <> - +  Show notifications )} @@ -117,8 +118,8 @@ const Iframe = styled.iframe<{ isLoaded: boolean }>( ({ isLoaded }) => ({ visibility: isLoaded ? 'visible' : 'hidden' }) ); -const AlertIcon = styled(((props) => ) as FC< - Omit, 'icon'> +const AlertIcon = styled(((props) => ) as FC< + Omit, 'icon'> >)(({ theme }) => ({ color: theme.textMutedColor, width: 32, diff --git a/code/ui/manager/src/typings.d.ts b/code/ui/manager/src/typings.d.ts index bce29ea466a7..93ee4ae948d6 100644 --- a/code/ui/manager/src/typings.d.ts +++ b/code/ui/manager/src/typings.d.ts @@ -8,7 +8,7 @@ declare var PREVIEW_URL: any; declare var __STORYBOOK_ADDONS_MANAGER: any; declare var RELEASE_NOTES_DATA: any; -declare var FEATURES: import('@storybook/types').StorybookConfig['features']; +declare var FEATURES: import('@storybook/types').StorybookConfigRaw['features']; declare var REFS: any; declare var VERSIONCHECK: any; @@ -19,10 +19,11 @@ declare var __REACT_DOM__: any; declare var __STORYBOOK_COMPONENTS__: any; declare var __STORYBOOK_CHANNELS__: any; declare var __STORYBOOK_CORE_EVENTS__: any; +declare var __STORYBOOK_CORE_EVENTS_MANAGER_ERRORS__: any; declare var __STORYBOOK_ROUTER__: any; declare var __STORYBOOK_THEMING__: any; declare var __STORYBOOK_API__: any; -declare var __STORYBOOK_ADDONS__: any; +declare var __STORYBOOK_ICONS__: any; declare var __STORYBOOK_CLIENT_LOGGER__: any; declare var __STORYBOOK_ADDONS_CHANNEL__: any; declare var __STORYBOOK_TYPES__: any; diff --git a/code/yarn.lock b/code/yarn.lock index be5721edec43..f404c86ceb6a 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -24,7 +24,7 @@ __metadata: languageName: node linkType: hard -"@adobe/css-tools@npm:^4.0.1, @adobe/css-tools@npm:^4.3.0": +"@adobe/css-tools@npm:^4.0.1, @adobe/css-tools@npm:^4.3.1": version: 4.3.1 resolution: "@adobe/css-tools@npm:4.3.1" checksum: 05672719b544cc0c21ae3ed0eb6349bf458e9d09457578eeeb07cf0f696469ac6417e9c9be1b129e5d6a18098a061c1db55b2275591760ef30a79822436fcbfa @@ -41,13 +41,13 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/architect@npm:0.1602.4": - version: 0.1602.4 - resolution: "@angular-devkit/architect@npm:0.1602.4" +"@angular-devkit/architect@npm:0.1602.10": + version: 0.1602.10 + resolution: "@angular-devkit/architect@npm:0.1602.10" dependencies: - "@angular-devkit/core": "npm:16.2.4" + "@angular-devkit/core": "npm:16.2.10" rxjs: "npm:7.8.1" - checksum: 001004daa67a6c31e20bb1c1711f1b122d744d4003749399e4f72e18e6c5006dc77162bdde7dc8614b0509edec5f25cfff4dec9df6c111e5fa7036c21b207232 + checksum: ec10fdf77f5874df16151c77e587a03433a40b34528e905a3a2a86c81a1f2a1994bf2837aed39c8dbcc087b60403c8bb81899ba9f7d603fccfae75ff4abfbc9c languageName: node linkType: hard @@ -62,13 +62,13 @@ __metadata: linkType: hard "@angular-devkit/build-angular@npm:^16.0.0-rc.4": - version: 16.2.4 - resolution: "@angular-devkit/build-angular@npm:16.2.4" + version: 16.2.10 + resolution: "@angular-devkit/build-angular@npm:16.2.10" dependencies: "@ampproject/remapping": "npm:2.2.1" - "@angular-devkit/architect": "npm:0.1602.4" - "@angular-devkit/build-webpack": "npm:0.1602.4" - "@angular-devkit/core": "npm:16.2.4" + "@angular-devkit/architect": "npm:0.1602.10" + "@angular-devkit/build-webpack": "npm:0.1602.10" + "@angular-devkit/core": "npm:16.2.10" "@babel/core": "npm:7.22.9" "@babel/generator": "npm:7.22.9" "@babel/helper-annotate-as-pure": "npm:7.22.5" @@ -80,7 +80,7 @@ __metadata: "@babel/runtime": "npm:7.22.6" "@babel/template": "npm:7.22.5" "@discoveryjs/json-ext": "npm:0.5.7" - "@ngtools/webpack": "npm:16.2.4" + "@ngtools/webpack": "npm:16.2.10" "@vitejs/plugin-basic-ssl": "npm:1.0.1" ansi-colors: "npm:4.1.3" autoprefixer: "npm:10.4.14" @@ -111,7 +111,7 @@ __metadata: parse5-html-rewriting-stream: "npm:7.0.0" picomatch: "npm:2.3.1" piscina: "npm:4.0.0" - postcss: "npm:8.4.27" + postcss: "npm:8.4.31" postcss-loader: "npm:7.3.3" resolve-url-loader: "npm:5.0.0" rxjs: "npm:7.8.1" @@ -164,20 +164,20 @@ __metadata: optional: true tailwindcss: optional: true - checksum: d0f3ea4ae60b0bb5f90da51fe68ac7be804e583cfec797a61c1b166e7621683e0a2f7b2e05a9ba00a93f31a9d0398f3bbe8f07fa0ff7a8a6c566ce16fce2f09f + checksum: 7654c61cf9e0458d2391081d27cb2095a4ca2149777abf69f9786d383b7a5a7c8e18f390e5cc5cf6064e0ea56b7dcfa24f3a6c89afd7074fecda5b319617ef38 languageName: node linkType: hard -"@angular-devkit/build-webpack@npm:0.1602.4": - version: 0.1602.4 - resolution: "@angular-devkit/build-webpack@npm:0.1602.4" +"@angular-devkit/build-webpack@npm:0.1602.10": + version: 0.1602.10 + resolution: "@angular-devkit/build-webpack@npm:0.1602.10" dependencies: - "@angular-devkit/architect": "npm:0.1602.4" + "@angular-devkit/architect": "npm:0.1602.10" rxjs: "npm:7.8.1" peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^4.0.0 - checksum: af362fddde0e8475fbec2798a7e7fb4a646f3aa29e0575245388db5bfd3d923fd0186116710e677d09d0e93a0fbc130022076a93013df8d321a3295fc9b1c2ef + checksum: e78fd4bfb0956109490b4a6be61a33c5435a84cf22b462d7b60367c2dc570737875305f7ff9843304a3570c16b02b69a1c69e2c4373ab25957bf9bde82df8e7f languageName: node linkType: hard @@ -199,7 +199,26 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/core@npm:16.2.4, @angular-devkit/core@npm:^16.0.0-rc.4": +"@angular-devkit/core@npm:16.2.10": + version: 16.2.10 + resolution: "@angular-devkit/core@npm:16.2.10" + dependencies: + ajv: "npm:8.12.0" + ajv-formats: "npm:2.1.1" + jsonc-parser: "npm:3.2.0" + picomatch: "npm:2.3.1" + rxjs: "npm:7.8.1" + source-map: "npm:0.7.4" + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + checksum: b3252540dde1c248027c9bf532b1024cf1169c4f6b2c6319cd22747db7e3320770031490062ccaae9981f403606c0d229dc6ab78fb11cde74e3633e7fc834e97 + languageName: node + linkType: hard + +"@angular-devkit/core@npm:^16.0.0-rc.4": version: 16.2.4 resolution: "@angular-devkit/core@npm:16.2.4" dependencies: @@ -218,38 +237,38 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/schematics@npm:16.2.4": - version: 16.2.4 - resolution: "@angular-devkit/schematics@npm:16.2.4" +"@angular-devkit/schematics@npm:16.2.10": + version: 16.2.10 + resolution: "@angular-devkit/schematics@npm:16.2.10" dependencies: - "@angular-devkit/core": "npm:16.2.4" + "@angular-devkit/core": "npm:16.2.10" jsonc-parser: "npm:3.2.0" magic-string: "npm:0.30.1" ora: "npm:5.4.1" rxjs: "npm:7.8.1" - checksum: 153cd8cc7219a4002413c443688c70912237c98c745e62626273720271f131ec1ae8dd464fb73946e86dedf4cbb4a3651ef0547747fa5ee627ef27c197d675d7 + checksum: 47ff66fb24a0dd9e674fbcd644b3bea3a045b10348accbb7ad0b94ebf45d4957675e3b3be8c26fa2c6226431af59fa478516945ef83aa6c2dc8964b2e16146b0 languageName: node linkType: hard "@angular/animations@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/animations@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/animations@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 16.2.7 - checksum: 3d3d603a7f9a0d8932b0783ba120623bf5ea94842ff0ed3225262834664ba2ddb3c723b944f3a06862f90c063b73e41b06d8fe0837e29ee1bed1f1eef8773d54 + "@angular/core": 16.2.12 + checksum: ac1bf1cd4abce7b5137c068fb21e28574db6153faee7a10d9b6c6605be477b4f26a4647c8c5d1116f70926669f01491e564aa616510921dd5f44cd507a4b9d33 languageName: node linkType: hard "@angular/cli@npm:^16.0.0-rc.4": - version: 16.2.4 - resolution: "@angular/cli@npm:16.2.4" + version: 16.2.10 + resolution: "@angular/cli@npm:16.2.10" dependencies: - "@angular-devkit/architect": "npm:0.1602.4" - "@angular-devkit/core": "npm:16.2.4" - "@angular-devkit/schematics": "npm:16.2.4" - "@schematics/angular": "npm:16.2.4" + "@angular-devkit/architect": "npm:0.1602.10" + "@angular-devkit/core": "npm:16.2.10" + "@angular-devkit/schematics": "npm:16.2.10" + "@schematics/angular": "npm:16.2.10" "@yarnpkg/lockfile": "npm:1.1.0" ansi-colors: "npm:4.1.3" ini: "npm:4.1.1" @@ -266,27 +285,27 @@ __metadata: yargs: "npm:17.7.2" bin: ng: bin/ng.js - checksum: 2d919ed87cc03c89163988ab854d121477511782f0c9e115141d257e1af0f2ed8aa7709b04baee56b68e0e9bb75fe24b877214c9e1062f4a7654f3ddc26ae3b4 + checksum: fab8d9f00501b92f11e52cf179ff2197d816815f1466228882827a40189eb9b61227df5c499ad61a8e25b9eefa47374ee7e7731691b300eb289c81551acecee0 languageName: node linkType: hard "@angular/common@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/common@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/common@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 16.2.7 + "@angular/core": 16.2.12 rxjs: ^6.5.3 || ^7.4.0 - checksum: 6182db26e2c6f8a4cda58ea5573d0884856e2be9d20903e2f495d31e615edc59fc1db135bbe1d1b1b4c534727ee8e307d3f6fc76e190dc90bf19d7cbdde7def5 + checksum: a5bd26a6fd41a08bfdb56b99cc362df014740736e1f8cfca690e4ab2e64572a1b6bc9a2e8bcdc94ed1346593a699e157dffebbc69def5828ff7e597d1b31de33 languageName: node linkType: hard "@angular/compiler-cli@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/compiler-cli@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/compiler-cli@npm:16.2.12" dependencies: - "@babel/core": "npm:7.22.5" + "@babel/core": "npm:7.23.2" "@jridgewell/sourcemap-codec": "npm:^1.4.14" chokidar: "npm:^3.0.0" convert-source-map: "npm:^1.5.1" @@ -295,83 +314,83 @@ __metadata: tslib: "npm:^2.3.0" yargs: "npm:^17.2.1" peerDependencies: - "@angular/compiler": 16.2.7 + "@angular/compiler": 16.2.12 typescript: ">=4.9.3 <5.2" bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js ngcc: bundles/ngcc/index.js - checksum: e3a5460e385ad8b3eeeeca79ca7d334990bb30928f9714fa60a0c8748b49cd04e25a14ae58beadd491ddae20787020cc846c40ce328f5c6625c23523113c33af + checksum: abe11a775d7c898b585e4a773f42b4e4b0a99b11d9e16276c9cd64404ba3c32be35a7c4cb65f44b2abe58fdc4b28d2bd52f45b6a64dad414b93f52eff991ba97 languageName: node linkType: hard "@angular/compiler@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/compiler@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/compiler@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 16.2.7 + "@angular/core": 16.2.12 peerDependenciesMeta: "@angular/core": optional: true - checksum: edbd286f289548f8e1539c82f02b4452326552cef39dc7f2ee2df14d382a8f754f4370e7d99a8526728a8a6180d098e23b066d2f96e7c58e20f6aab33ceef8e4 + checksum: ddc6065ec263c69320e45e65a63c9a6e310cd1eeca51242b19c58db03c987140bcde3be2fd03cb7a52f8a2590a5c8780a7a4a13a9bc7b451dd25c7b245f13df7 languageName: node linkType: hard "@angular/core@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/core@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/core@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.13.0 - checksum: 5d06adabe8985cd1e91aea9cf95002b5b0784cbdf12ac5ea75c9ce4cc238e0d0640cf81f8b57b08781d02129c1dfaf544419d40e9ee728593c40e42d22c52612 + checksum: 4a4a9fee1a160e922b28f264eed82b85f595f66aebddf2343533e0c7a5f947e11cb11b98a463f591bfd902f8846f24bfc4eceead61d35ef15922d8821e2cd5d5 languageName: node linkType: hard "@angular/forms@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/forms@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/forms@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 16.2.7 - "@angular/core": 16.2.7 - "@angular/platform-browser": 16.2.7 + "@angular/common": 16.2.12 + "@angular/core": 16.2.12 + "@angular/platform-browser": 16.2.12 rxjs: ^6.5.3 || ^7.4.0 - checksum: d31bf4fbf366c6cbfaf9418dd5588694567ca6282b2efe47c6e2ed7073c8e739865dd0d8c43b3b7344b7e968f958a35bc4f740b793c6e30f7dced12f25d09f7d + checksum: 4b167441e17914e7147be615718e21ece7a49942e45a0ee6708c36b72f2ff0f06fd56fbcee5a7e0909c3b6bacfac27ca19f9a32fdfc61615bb5b4a6643c2324b languageName: node linkType: hard "@angular/platform-browser-dynamic@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/platform-browser-dynamic@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/platform-browser-dynamic@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 16.2.7 - "@angular/compiler": 16.2.7 - "@angular/core": 16.2.7 - "@angular/platform-browser": 16.2.7 - checksum: a8be89497ba2823abd46352df2c36ac93ed53540d36ca1953d57458742c27d76afe9a5d93ddd7b79f10154b4d107f2581d5408bc166d6bc208ccfa395b2047ae + "@angular/common": 16.2.12 + "@angular/compiler": 16.2.12 + "@angular/core": 16.2.12 + "@angular/platform-browser": 16.2.12 + checksum: b11bcc6a5f09d775a037385475f1b06123b31ef545b3c58e6458a6bedb9565faf2f0b85e226ebb2172f14d79a1928d8294d559ff700695077b88f8fd4b812094 languageName: node linkType: hard "@angular/platform-browser@npm:^16.0.0-rc.4": - version: 16.2.7 - resolution: "@angular/platform-browser@npm:16.2.7" + version: 16.2.12 + resolution: "@angular/platform-browser@npm:16.2.12" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/animations": 16.2.7 - "@angular/common": 16.2.7 - "@angular/core": 16.2.7 + "@angular/animations": 16.2.12 + "@angular/common": 16.2.12 + "@angular/core": 16.2.12 peerDependenciesMeta: "@angular/animations": optional: true - checksum: cfb0aeb969845893353d02ed5be52e13019aac91e2689d81c98064a41a7155e91714fbd031a7fc1e4ebd9b9b0db6813dfbec93529df0f4856df25bb0d9695a8e + checksum: 076ab476c4a64cf0c60a1d71001bc79ecb0d384443312bb85fdf7deaa105cec15d3a5abc6b696fb1ffb7413581f94fd9b8e9b0e9d1652027ee15217fe7719e3e languageName: node linkType: hard @@ -393,18 +412,7 @@ __metadata: languageName: node linkType: hard -"@axe-core/puppeteer@npm:^4.2.0": - version: 4.7.3 - resolution: "@axe-core/puppeteer@npm:4.7.3" - dependencies: - axe-core: "npm:^4.7.0" - peerDependencies: - puppeteer: ">=1.10.0" - checksum: 24161a6c8ee3ab33f09e66f73bb81d70c69feb5c2e8cb1a1ba6a6e06ecb204768dbf443bc76abfa95c3fb637fd21ea4270478591b45a00a939b9b3909c11bc4e - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.22.5, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.22.5": version: 7.22.13 resolution: "@babel/code-frame@npm:7.22.13" dependencies: @@ -414,10 +422,20 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.20, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": - version: 7.22.20 - resolution: "@babel/compat-data@npm:7.22.20" - checksum: 73c0f7cf4a1181a0a58bbee6a8b69dc4ba1beec1e764686a586db067e8160044d3a28da0a3542f044f3f31fa662ab22fd061dfe3fc9520dc1cee2252f460db30 +"@babel/code-frame@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/code-frame@npm:7.23.4" + dependencies: + "@babel/highlight": "npm:^7.23.4" + chalk: "npm:^2.4.2" + checksum: 2ef6f5e10004c4e8b755961b68570db0ea556ccb17a37c13a7f1fed1f4e273aed6c1ae1fcb86abb991620d8be083e1472a7ea5429f05bc342de54c027b07ea83 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/compat-data@npm:7.23.3" + checksum: c6af331753c34ee8a5678bc94404320826cb56b1dda3efc1311ec8fb0774e78225132f3c1acc988440ace667f14a838e297a822692b95758aa63da406e1f97a1 languageName: node linkType: hard @@ -429,25 +447,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/core@npm:7.23.2" + version: 7.23.3 + resolution: "@babel/core@npm:7.23.3" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.22.13" - "@babel/generator": "npm:^7.23.0" + "@babel/generator": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-module-transforms": "npm:^7.23.0" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helpers": "npm:^7.23.2" - "@babel/parser": "npm:^7.23.0" + "@babel/parser": "npm:^7.23.3" "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/traverse": "npm:^7.23.3" + "@babel/types": "npm:^7.23.3" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 14ad6e0a3ac0085dc008e7fb0c8513f0a3e39f2ab883a964a89ef1311338d49cf085c94cb6165c07fdec0fdcc6e865ce4811253c479f9f45ac375226dfe3ad3b + checksum: 08d43b749e24052d12713a7fb1f0c0d1275d4fb056d00846faeb8da79ecf6d0ba91a11b6afec407b8b0f9388d00e2c2f485f282bef0ade4d6d0a17de191a4287 languageName: node linkType: hard @@ -475,6 +493,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/generator@npm:7.23.4" + dependencies: + "@babel/types": "npm:^7.23.4" + "@jridgewell/gen-mapping": "npm:^0.3.2" + "@jridgewell/trace-mapping": "npm:^0.3.17" + jsesc: "npm:^2.5.1" + checksum: 79b87ef49c4af1b4356b2fcab80ed92dfcad7927c3d6d89c4f749fd947768de3ec129467fb8eee0fe53cf8fc38b4d34d44487f714a9c23bee981c9cba3a670e4 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:7.22.5, @babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -484,7 +514,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: @@ -493,7 +523,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.22.9": +"@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.22.9": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: @@ -506,7 +536,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.22.5": +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" dependencies: @@ -525,7 +555,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" dependencies: @@ -597,7 +627,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": +"@babel/helper-module-transforms@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-module-transforms@npm:7.23.0" dependencies: @@ -643,7 +673,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5, @babel/helper-remap-async-to-generator@npm:^7.22.9": +"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: @@ -656,7 +686,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": +"@babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.9": version: 7.22.20 resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: @@ -703,6 +733,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -729,13 +766,13 @@ __metadata: linkType: hard "@babel/helpers@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/helpers@npm:7.23.2" + version: 7.23.4 + resolution: "@babel/helpers@npm:7.23.4" dependencies: "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - checksum: 3a6a939c5277a27486e7c626812f0643b35d1c053ac2eb66911f5ae6c0a4e4bcdd40750eba36b766b0ee8a753484287f50ae56232a5f8f2947116723e44b9e35 + "@babel/traverse": "npm:^7.23.4" + "@babel/types": "npm:^7.23.4" + checksum: 6bb552b3de530f5eaae99f5410826b5877bae38ccd95cb5809c9a0cef99bcdb9f5db373309c1cf873f5d68927993515323985bac0ff1b811f2437f2e3ae994b8 languageName: node linkType: hard @@ -750,16 +787,27 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.11.5, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.7.0, @babel/parser@npm:^7.8.6, @babel/parser@npm:^7.9.6": - version: 7.23.0 - resolution: "@babel/parser@npm:7.23.0" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + checksum: fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.11.5, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.4, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.7.0, @babel/parser@npm:^7.9.6": + version: 7.23.4 + resolution: "@babel/parser@npm:7.23.4" bin: parser: ./bin/babel-parser.js - checksum: ab4ea9360ed4ba3c728c5a9bf33035103ebde20a7e943c4ae1d42becb02a313d731d12a93c795c5a19777031e4022e64b92a52262eda902522a1a18649826283 + checksum: 9115cd9c5855a6c7a8dd246938b1316dc1014ad36e01240c1e94ada63218ca39aa63d953d1bff8074a2737933448bc50736eb3da52ffc5c11a256c66d0accc2b languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.5": +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" dependencies: @@ -770,7 +818,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.5": +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.5, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 356a4e9fc52d7ca761ce6857fc58e2295c2785d22565760e6a5680be86c6e5883ab86e0ba25ef572882c01713d3a31ae6cfa3e3222cdb95e6026671dab1fa415 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" dependencies: @@ -783,6 +842,31 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.5, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: a8785f099d55ca71ed89815e0f3a636a80c16031f80934cfec17c928d096ee0798964733320c8b145ef36ba429c5e19d5107b06231e0ab6777cfb0f01adfdc23 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 0f43b74741d50e637ba4dcef2786621126fe4da6ccf4ee2e94423ee23f6a04ecd91d458e59764c43e4968be139e5197ee43be8a2fea2c09f0b202a3391e548cc + languageName: node + linkType: hard + "@babel/plugin-proposal-async-generator-functions@npm:7.20.7": version: 7.20.7 resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" @@ -810,17 +894,17 @@ __metadata: linkType: hard "@babel/plugin-proposal-decorators@npm:^7.13.5": - version: 7.23.0 - resolution: "@babel/plugin-proposal-decorators@npm:7.23.0" + version: 7.23.3 + resolution: "@babel/plugin-proposal-decorators@npm:7.23.3" dependencies: "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-replace-supers": "npm:^7.22.20" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/plugin-syntax-decorators": "npm:^7.22.10" + "@babel/plugin-syntax-decorators": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 983e7113f9ca3b2ae632869f71accec48cb652d68840697c3977071d44879657ca6b4427ed02e76e448e385d0feca9bd3d40edfaf1530c6c6c25fe8b97d46689 + checksum: b32d0e197d7abbb84f78ab361f7cb6ce8b5f90e5a04bf3afb8d43b51653c3f47b0e9ba8d02a643de7390c408d3842e4017446b8cc8e8319695c92568646ba7ef languageName: node linkType: hard @@ -940,14 +1024,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/plugin-syntax-decorators@npm:7.22.10" +"@babel/plugin-syntax-decorators@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-decorators@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cf606ef13ed98b3adf560ede27a873c0ab37e884c762a6f15493c881f5a78b67f24dcdd5c70e8cd8f39dbe4b23475cb98619729812f29feb2dcc241130195e7c + checksum: 86299c050b0a5b6565d6b9e3529f2d6dca4780215ab88050bdd0ae9a576868a17f9cd1e140857089cc5d06bdfeb89f0711285f99481b82316896a552a62e449f languageName: node linkType: hard @@ -973,36 +1057,36 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-flow@npm:7.22.5" +"@babel/plugin-syntax-flow@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-flow@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 07afc7df02141597968532bfbfa3f6c0ad21a2bdd885d0e5e035dcf60fdf35f0995631c9750b464e1a6f2feea14160a82787f914e88e8f7115dc99f09853e43e + checksum: 8a5e1e8b6a3728a2c8fe6d70c09a43642e737d9c0485e1b041cd3a6021ef05376ec3c9137be3b118c622ba09b5770d26fdc525473f8d06d4ab9e46de2783dd0a languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" +"@babel/plugin-syntax-import-assertions@npm:^7.22.5, @babel/plugin-syntax-import-assertions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b297d7c757c746ed0ef3496ad749ae2ce648ec73dae5184120b191c280e62da7dc104ee126bc0053dfece3ce198a5ee7dc1cbf4768860f666afef5dee84a7146 + checksum: 7db8b59f75667bada2293353bb66b9d5651a673b22c72f47da9f5c46e719142481601b745f9822212fd7522f92e26e8576af37116f85dae1b5e5967f80d0faab languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.22.5" +"@babel/plugin-syntax-import-attributes@npm:^7.22.5, @babel/plugin-syntax-import-attributes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: de0b104a82cb8ffdc29472177210936609b973665a2ad8ef26c078251d7c728fbd521119de4c417285408a8bae345b5da09cd4a4a3311619f71b9b2c64cce3fa + checksum: 99b40d33d79205a8e04bb5dea56fd72906ffc317513b20ca7319e7683e18fce8ea2eea5e9171056f92b979dc0ab1e31b2cb5171177a5ba61e05b54fe7850a606 languageName: node linkType: hard @@ -1028,7 +1112,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.7.2": +"@babel/plugin-syntax-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" dependencies: @@ -1039,7 +1123,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.23.3": +"@babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.23.3 resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" dependencies: @@ -1138,7 +1222,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.22.5, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" dependencies: @@ -1149,7 +1233,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3": +"@babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.23.3 resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" dependencies: @@ -1172,28 +1256,28 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.22.5" +"@babel/plugin-transform-arrow-functions@npm:^7.22.5, @babel/plugin-transform-arrow-functions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1b24d47ddac6ae2fe8c7fab9a020fdb6a556d17d8c5f189bb470ff2958a5437fe6441521fd3d850f4283a1131d7a0acf3e8ebe789f9077f54bab4e2e8c6df176 + checksum: b128315c058f5728d29b0b78723659b11de88247ea4d0388f0b935cddf60a80c40b9067acf45cbbe055bd796928faef152a09d9e4a0695465aca4394d9f109ca languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.22.15, @babel/plugin-transform-async-generator-functions@npm:^7.22.7": - version: 7.22.15 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.15" +"@babel/plugin-transform-async-generator-functions@npm:^7.22.7, @babel/plugin-transform-async-generator-functions@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-remap-async-to-generator": "npm:^7.22.9" + "@babel/helper-remap-async-to-generator": "npm:^7.22.20" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e6fea97d765c57d1bf592a2bc15b1dd0ee6247b06d2fed5c468cc9a4f4ba790b407a061f6c42cc68cd3dc18481415c6d2ffe5abc7afb23993a79a9147a232195 + checksum: f2eef4de609975a3f7da7832576b5ffc93e43c80f87e1a99e886b0f8591096cfc4c37e2d5f52fdeaa2a9c09a25a59f3e621159abaca75d3193922a5c0e4cbe0c languageName: node linkType: hard @@ -1211,7 +1295,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:7.22.5, @babel/plugin-transform-async-to-generator@npm:^7.22.5": +"@babel/plugin-transform-async-to-generator@npm:7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" dependencies: @@ -1224,18 +1308,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" +"@babel/plugin-transform-async-to-generator@npm:^7.22.5, @babel/plugin-transform-async-to-generator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" + dependencies: + "@babel/helper-module-imports": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-remap-async-to-generator": "npm:^7.22.20" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: da3ffd413eef02a8e2cfee3e0bb0d5fc0fcb795c187bc14a5a8e8874cdbdc43bbf00089c587412d7752d97efc5967c3c18ff5398e3017b9a14a06126f017e7e9 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoped-functions@npm:^7.22.5, @babel/plugin-transform-block-scoped-functions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 82c12a11277528184a979163de7189ceb00129f60dd930b0d5313454310bf71205f302fb2bf0430247161c8a22aaa9fb9eec1459f9f7468206422c191978fd59 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoping@npm:^7.22.5, @babel/plugin-transform-block-scoping@npm:^7.23.3, @babel/plugin-transform-block-scoping@npm:^7.8.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 21878d4f0040f5001c4a14e17759e80bf699cb883a497552fa882dbc05230b100e8572345654b091021d5c4227555ed2bf40c8d6ba16a54d81145abfe0022cf8 + checksum: 83006804dddf980ab1bcd6d67bc381e24b58c776507c34f990468f820d0da71dba3697355ca4856532fa2eeb2a1e3e73c780f03760b5507a511cbedb0308e276 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.22.15, @babel/plugin-transform-block-scoping@npm:^7.22.5, @babel/plugin-transform-block-scoping@npm:^7.23.0, @babel/plugin-transform-block-scoping@npm:^7.8.3": +"@babel/plugin-transform-block-scoping@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0" dependencies: @@ -1246,19 +1354,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-class-properties@npm:7.22.5" +"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 707f976d3aea2b52dad36a5695a71af8956f9b1d5dec02c2b8cce7ff3b5e60df4cbe059c71ae0b7983034dc639de654a2c928b97e4e01ebf436d58ea43639e7d + checksum: bca30d576f539eef216494b56d610f1a64aa9375de4134bc021d9660f1fa735b1d7cc413029f22abc0b7cb737e3a57935c8ae9d8bd1730921ccb1deebce51bfd languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.22.11, @babel/plugin-transform-class-static-block@npm:^7.22.5": +"@babel/plugin-transform-class-static-block@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-class-static-block@npm:7.22.11" dependencies: @@ -1271,7 +1379,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.22.15, @babel/plugin-transform-classes@npm:^7.22.6": +"@babel/plugin-transform-class-static-block@npm:^7.22.5, @babel/plugin-transform-class-static-block@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: fdca96640ef29d8641a7f8de106f65f18871b38cc01c0f7b696d2b49c76b77816b30a812c08e759d06dd10b4d9b3af6b5e4ac22a2017a88c4077972224b77ab0 + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-classes@npm:7.22.15" dependencies: @@ -1290,19 +1411,49 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" +"@babel/plugin-transform-classes@npm:^7.22.6, @babel/plugin-transform-classes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-classes@npm:7.23.3" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.22.20" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 88bfd332db0ba5cbfb8557a2ba5a7185151aebc9cfe3035b014aa6d795556acbe672bb8c78da3c9fd1d23f55a333d14b5daa127ef037f5ced5198b6d79a146d6 + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.22.5, @babel/plugin-transform-computed-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/template": "npm:^7.22.15" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3ca8a006f8e652b58c21ecb84df1d01a73f0a96b1d216fd09a890b235dd90cb966b152b603b88f7e850ae238644b1636ce5c30b7c029c0934b43383932372e4a + languageName: node + linkType: hard + +"@babel/plugin-transform-destructuring@npm:^7.22.5, @babel/plugin-transform-destructuring@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 22ecea23c1635083f5473092c5fbca62cbf7a85764bcf3e704c850446d68fe946097f6001c4cbfc92b4aee27ed30b375773ee479f749293e41fdb8f1fb8fcb67 + checksum: 717e9a62c1b0c93c507f87b4eaf839ec08d3c3147f14d74ae240d8749488d9762a8b3950132be620a069bde70f4b3e4ee9867b226c973fcc40f3cdec975cde71 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.22.15, @babel/plugin-transform-destructuring@npm:^7.22.5, @babel/plugin-transform-destructuring@npm:^7.23.0": +"@babel/plugin-transform-destructuring@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-destructuring@npm:7.23.0" dependencies: @@ -1325,18 +1476,30 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" +"@babel/plugin-transform-dotall-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6c89286d1277c2a63802a453c797c87c1203f89e4c25115f7b6620f5fce15d8c8d37af613222f6aa497aa98773577a6ec8752e79e13d59bc5429270677ea010b + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-keys@npm:^7.22.5, @babel/plugin-transform-duplicate-keys@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 82772fdcc1301358bc722c1316bea071ad0cd5893ca95b08e183748e044277a93ee90f9c641ac7873a00e4b31a8df7cf8c0981ca98d01becb4864a11b22c09d1 + checksum: 7e2640e4e6adccd5e7b0615b6e9239d7c98363e21c52086ea13759dfa11cf7159b255fc5331c2de435639ea8eb6acefae115ae0d797a3d19d12587652f8052a5 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.22.11, @babel/plugin-transform-dynamic-import@npm:^7.22.5": +"@babel/plugin-transform-dynamic-import@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.11" dependencies: @@ -1348,43 +1511,55 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" +"@babel/plugin-transform-dynamic-import@npm:^7.22.5, @babel/plugin-transform-dynamic-import@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e8832460cfc9e087561fa42a796bb4eb181e6983d6db85c6dcec15f98af4ae3d13fcab18a262252a43b075d79ac93aaa38d33022bc5a870d2760c6888ba5d211 + checksum: 19ae4a4a2ca86d35224734c41c48b2aa6a13139f3cfa1cbd18c0e65e461de8b65687dec7e52b7a72bb49db04465394c776aa1b13a2af5dc975b2a0cde3dcab67 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.22.5": - version: 7.22.11 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.11" +"@babel/plugin-transform-exponentiation-operator@npm:^7.22.5, @babel/plugin-transform-exponentiation-operator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5c33ee6a1bdc52fcdf0807f445b27e3fbdce33008531885e65a699762327565fffbcfde8395be7f21bcb22d582e425eddae45650c986462bb84ba68f43687516 + languageName: node + linkType: hard + +"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.22.5, @babel/plugin-transform-export-namespace-from@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2b65ddf9ab4cfa8ffc72983c689b99d9ce0fe74846c2e518a1955f703e1fe073d0865810959164800613c3235a29cf9cae3567a46bf9cb53a2384469d3913e85 + checksum: 38bf04f851e36240bbe83ace4169da626524f4107bfb91f05b4ad93a5fb6a36d5b3d30b8883c1ba575ccfc1bac7938e90ca2e3cb227f7b3f4a9424beec6fd4a7 languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.22.5" +"@babel/plugin-transform-flow-strip-types@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-flow": "npm:^7.22.5" + "@babel/plugin-syntax-flow": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5949a8e5214e3fc65d31dab0551423cea9d9eef35faa5d0004707ba7347baf96166aa400907ce7498f754db4e1e9d039ca434a508546b0dc9fdae9a42e814c1a + checksum: 9ab627f9668fc1f95564b26bffd6706f86205960d9ccc168236752fbef65dbe10aa0ce74faae12f48bb3b72ec7f38ef2a78b4874c222c1e85754e981639f3b33 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.22.15, @babel/plugin-transform-for-of@npm:^7.22.5": +"@babel/plugin-transform-for-of@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-for-of@npm:7.22.15" dependencies: @@ -1395,20 +1570,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-function-name@npm:7.22.5" +"@babel/plugin-transform-for-of@npm:^7.22.5, @babel/plugin-transform-for-of@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.5" - "@babel/helper-function-name": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 206bdef2ff91c29a7d94c77778ad79f18bdb2cd6a30179449f2b95af04637cb68d96625dc673d9a0961b6b7088bd325bbed7540caf9aa8f69e5b003d6ba20456 + checksum: 8a36202cfee312ba80e509c7c2131e6773524e572b4dc64a8ee95bd912634fdeb5ea91c6c7747ee30e03562d0f0d333f88ed7dbb929b36b60b8d74189189e12f + languageName: node + linkType: hard + +"@babel/plugin-transform-function-name@npm:^7.22.5, @babel/plugin-transform-function-name@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-function-name@npm:7.23.3" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 89cb9747802118048115cf92a8f310752f02030549b26f008904990cbdc86c3d4a68e07ca3b5c46de8a46ed4df2cb576ac222c74c56de67253d2a3ddc2956083 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.22.11, @babel/plugin-transform-json-strings@npm:^7.22.5": +"@babel/plugin-transform-json-strings@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-json-strings@npm:7.22.11" dependencies: @@ -1420,18 +1606,30 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-literals@npm:7.22.5" +"@babel/plugin-transform-json-strings@npm:^7.22.5, @babel/plugin-transform-json-strings@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 39e82223992a9ad857722ae051291935403852ad24b0dd64c645ca1c10517b6bf9822377d88643fed8b3e61a4e3f7e5ae41cf90eb07c40a786505d47d5970e54 + languageName: node + linkType: hard + +"@babel/plugin-transform-literals@npm:^7.22.5, @babel/plugin-transform-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1003d0cf98e9ae432889bcf5f3d5f7d463f777fc2c74b0d4a1a93b51e83606c263a16146e34f0a06b291300aa5f2001d6e8bf65ed1bf478ab071b714bf158aa5 + checksum: 8292106b106201464c2bfdd5c014fe6a9ca1c0256eb0a8031deb20081e21906fe68b156186f77d993c23eeab6d8d6f5f66e8895eec7ed97ce6de5dbcafbcd7f4 languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11, @babel/plugin-transform-logical-assignment-operators@npm:^7.22.5": +"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" dependencies: @@ -1443,43 +1641,54 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.5, @babel/plugin-transform-logical-assignment-operators@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87b034dd13143904e405887e6125d76c27902563486efc66b7d9a9d8f9406b76c6ac42d7b37224014af5783d7edb465db0cdecd659fa3227baad0b3a6a35deff + languageName: node + linkType: hard + +"@babel/plugin-transform-member-expression-literals@npm:^7.22.5, @babel/plugin-transform-member-expression-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 731a341b17511809ae435b64822d4d093e86fd928b572028e6742bdfba271c57070860b0f3da080a76c5574d58c4f369fac3f7bf0f450b37920c0fc6fe27bb4e + checksum: 687f24f3ec60b627fef6e87b9e2770df77f76727b9d5f54fa4c84a495bb24eb4a20f1a6240fa22d339d45aac5eaeb1b39882e941bfd00cf498f9c53478d1ec88 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.22.5, @babel/plugin-transform-modules-amd@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0" +"@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.22.5, @babel/plugin-transform-modules-amd@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.0" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: dda02864029ff66955e21d19c3d245aad69792b75e748de1391403bc86c8e9720b4f320b0db8413a29c11ba63b168146cf849180b5677bc6a74bfd085d20376d + checksum: 9f7ec036f7cfc588833a4dd117a44813b64aa4c1fd5bfb6c78f60198c1d290938213090c93a46f97a68a2490fad909e21a82b2472e95da74d108c125df21c8d5 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.2.0, @babel/plugin-transform-modules-commonjs@npm:^7.22.15, @babel/plugin-transform-modules-commonjs@npm:^7.22.5, @babel/plugin-transform-modules-commonjs@npm:^7.23.0": +"@babel/plugin-transform-modules-amd@npm:^7.23.0": version: 7.23.0 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0" dependencies: "@babel/helper-module-transforms": "npm:^7.23.0" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-simple-access": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1f015764c2e63445d46660e7a2eb9002c20def04daf98fa93c9dadb5bd55adbefefd1ccdc11bcafa5e2f04275939d2414482703bc35bc60d6ca2bf1f67b720e3 + checksum: dda02864029ff66955e21d19c3d245aad69792b75e748de1391403bc86c8e9720b4f320b0db8413a29c11ba63b168146cf849180b5677bc6a74bfd085d20376d languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.23.3": +"@babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.2.0, @babel/plugin-transform-modules-commonjs@npm:^7.22.5, @babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" dependencies: @@ -1492,7 +1701,21 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.22.11, @babel/plugin-transform-modules-systemjs@npm:^7.22.5, @babel/plugin-transform-modules-systemjs@npm:^7.23.0": +"@babel/plugin-transform-modules-systemjs@npm:^7.22.5, @babel/plugin-transform-modules-systemjs@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" + dependencies: + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-validator-identifier": "npm:^7.22.20" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0d55280a276510222c8896bf4e581acb84824aa5b14c824f7102242ad6bc5104aaffe5ab22fe4d27518f4ae2811bd59c36d0c0bfa695157f9cfce33f0517a069 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0" dependencies: @@ -1506,15 +1729,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" +"@babel/plugin-transform-modules-umd@npm:^7.22.5, @babel/plugin-transform-modules-umd@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f4a40e18986182a2b1be6af949aaff67a7d112af3d26bbd4319d05b50f323a62a10b32b5584148e4630bdffbd4d85b31c0d571fe4f601354898b837b87afca4c + checksum: f0d2f890a15b4367d0d8f160bed7062bdb145c728c24e9bfbc1211c7925aae5df72a88df3832c92dd2011927edfed4da1b1249e4c78402e893509316c0c2caa6 languageName: node linkType: hard @@ -1530,80 +1753,80 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-new-target@npm:7.22.5" +"@babel/plugin-transform-new-target@npm:^7.22.5, @babel/plugin-transform-new-target@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-new-target@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 22ead0668bfd8db9166a4a47579d9f44726b59f21104561a6dd851156336741abdc5c576558e042c58c4b4fd577d3e29e4bd836021007f3381c33fe3c88dca19 + checksum: f489b9e1f17b42b2ba6312d58351e757cb23a8409f64f2bb6af4c09d015359588a5d68943b20756f141d0931a94431c782f3ed1225228a930a04b07be0c31b04 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.5": - version: 7.22.11 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.11" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.5, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 328c0ebfbbc82256af00252fb795996b093f57b528a57afcb30843ca52d24a6d824029ad6d22f042f3af336bb4dc1963b4841c2ad774424b02d14ae7cfff2701 + checksum: bce490d22da5c87ff27fffaff6ad5a4d4979b8d7b72e30857f191e9c1e1824ba73bb8d7081166289369e388f94f0ce5383a593b1fc84d09464a062c75f824b0b languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.22.11, @babel/plugin-transform-numeric-separator@npm:^7.22.5": - version: 7.22.11 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.11" +"@babel/plugin-transform-numeric-separator@npm:^7.22.11, @babel/plugin-transform-numeric-separator@npm:^7.22.5, @babel/plugin-transform-numeric-separator@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fcde065002948c9c39f853be99c38b02aa1a1eb453e70ab1a164feb250c1fcbf1edd38071e28ed8bde6840b8a394af8b291b2ab2d793f283872ba43f89cf6dd2 + checksum: e34902da4f5588dc4812c92cb1f6a5e3e3647baf7b4623e30942f551bf1297621abec4e322ebfa50b320c987c0f34d9eb4355b3d289961d9035e2126e3119c12 languageName: node linkType: hard "@babel/plugin-transform-object-assign@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-assign@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-object-assign@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c80ca956ccc45c68a6f35e8aea80e08c0a653e4baf243727d4258f242d312d71be20e3fad35a1f2cd9d58b30dcbb5cdf5f8d6c6614a3f8c6079d90f9b1dadee6 + checksum: 44467e8bd8eaae3fe54834dac9d1647d2b2598529a90722281832f6905d485c05e37b5fbd6fd7660c5d2e32e6f005824cda8a9321ddac2e2d619536fafc9783c languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.22.15, @babel/plugin-transform-object-rest-spread@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.15" +"@babel/plugin-transform-object-rest-spread@npm:^7.22.15, @babel/plugin-transform-object-rest-spread@npm:^7.22.5, @babel/plugin-transform-object-rest-spread@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" dependencies: - "@babel/compat-data": "npm:^7.22.9" + "@babel/compat-data": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.22.15" + "@babel/plugin-transform-parameters": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c485084360607a4392227d8af461e0f313953a6088221826668f90e92df6e16da04e2b3424e283c2980586095430d1068ae6e549b828dfa3891e2d1a397bd034 + checksum: b56017992ffe7fcd1dd9a9da67c39995a141820316266bcf7d77dc912980d228ccbd3f36191d234f5cc389b09157b5d2a955e33e8fb368319534affd1c72b262 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-super@npm:7.22.5" +"@babel/plugin-transform-object-super@npm:^7.22.5, @babel/plugin-transform-object-super@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-object-super@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 062a78ff897c095a71f0db577bd4e4654659d542cb9ef79ec0fda7873ee6fefe31a0cb8a6c2e307e16dacaae1f50d48572184a59e1235b8d9d9cb2f38c4259ce + checksum: a6856fd8c0afbe5b3318c344d4d201d009f4051e2f6ff6237ff2660593e93c5997a58772b13d639077c3e29ced3440247b29c496cd77b13af1e7559a70009775 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.22.11, @babel/plugin-transform-optional-catch-binding@npm:^7.22.5": +"@babel/plugin-transform-optional-catch-binding@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.11" dependencies: @@ -1615,20 +1838,45 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.15, @babel/plugin-transform-optional-chaining@npm:^7.22.6, @babel/plugin-transform-optional-chaining@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" +"@babel/plugin-transform-optional-catch-binding@npm:^7.22.5, @babel/plugin-transform-optional-catch-binding@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4ef61812af0e4928485e28301226ce61139a8b8cea9e9a919215ebec4891b9fea2eb7a83dc3090e2679b7d7b2c8653da601fbc297d2addc54a908b315173991e + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-chaining@npm:^7.22.15": + version: 7.23.0 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 checksum: 2bf605b908c75f8d7616e8be52e4656983f2b027032260fbf5279f28297a67a1a28ec3ed60cd5760537dbd08a021246b8092ce06fb2418884390230b807142b3 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.22.15, @babel/plugin-transform-parameters@npm:^7.22.5": +"@babel/plugin-transform-optional-chaining@npm:^7.22.6, @babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 305b773c29ad61255b0e83ec1e92b2f7af6aa58be4cba1e3852bddaa14f7d2afd7b4438f41c28b179d6faac7eb8d4fb5530a17920294f25d459b8f84406bfbfb + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-parameters@npm:7.22.15" dependencies: @@ -1639,19 +1887,30 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-private-methods@npm:7.22.5" +"@babel/plugin-transform-parameters@npm:^7.22.5, @babel/plugin-transform-parameters@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-parameters@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a8d4cbe0f6ba68d158f5b4215c63004fc37a1fdc539036eb388a9792017c8496ea970a1932ccb929308f61e53dc56676ed01d8df6f42bc0a85c7fd5ba82482b7 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a62f2e47ca30f6b8043201483c5a505e3d54416e6ddfbe7cb696a1db853a4281b1fffee9f883fe26ac72ba02bba0db5832d69e02f2eb4746e9811b8779287cc1 + checksum: 745a655edcd111b7f91882b921671ca0613079760d8c9befe336b8a9bc4ce6bb49c0c08941831c950afb1b225b4b2d3eaac8842e732db095b04db38efd8c34f4 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.22.11, @babel/plugin-transform-private-property-in-object@npm:^7.22.5": +"@babel/plugin-transform-private-property-in-object@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.11" dependencies: @@ -1665,29 +1924,43 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" +"@babel/plugin-transform-private-property-in-object@npm:^7.22.5, @babel/plugin-transform-private-property-in-object@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8d25b7b01b5f487cfc1a296555273c1ddad45276f01039130f57eb9ab0fafa0560d10d972323071042e73ac3b8bab596543c9d1a877229624a52e6535084ea51 + checksum: 8d31b28f24204b4d13514cd3a8f3033abf575b1a6039759ddd6e1d82dd33ba7281f9bc85c9f38072a665d69bfa26dc40737eefaf9d397b024654a483d2357bf5 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-display-name@npm:7.22.5" +"@babel/plugin-transform-property-literals@npm:^7.22.5, @babel/plugin-transform-property-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b2549f23f90cf276c2e3058c2225c3711c2ad1c417e336d3391199445a9776dd791b83be47b2b9a7ae374b40652d74b822387e31fa5267a37bf49c122e1a9747 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-display-name@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 41e0167ecd8e5281e427556146b1d3bee8652bcd0664be013f16ffeeb4d61b7ab0b1e59bcc2c923774f0d265f78012628d5277880f758f3675893226f9be012e + checksum: 3aed142af7bd1aed1df2bdad91ed33ba1cdd5c3c67ce6eafba821ff72f129162a197ffb55f1eb1775af276abd5545934489a8257fef6c6665ddf253a4f39a939 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.16.7, @babel/plugin-transform-react-jsx-development@npm:^7.22.5": +"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" dependencies: @@ -1699,55 +1972,55 @@ __metadata: linkType: hard "@babel/plugin-transform-react-jsx-self@npm:^7.18.6": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 263091bdede1f448cb2c59b84eb69972c15d3f022c929a75337bd20d8b65551ac38cd26dad1946eaa93289643506b10ddaea3445a28cb8fca5a773a22a0df90b + checksum: 6b586508fc58998483d4ee93a7e784c4f4d2350e2633739cf1990b7ad172e13906f72382fdaf7f07b4e3c7e7555342634d392bdeb1a079bb64762c6368ca9a32 languageName: node linkType: hard "@babel/plugin-transform-react-jsx-source@npm:^7.19.6": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: defc9debb76b4295e3617ef7795a0533dbbecef6f51bf5ba4bfc162df892a84fd39e14d5f1b9a5aad7b09b97074fef4c6756f9d2036eef5a9874acabe198f75a + checksum: a3aad7cf738e9bfaddc26cdbb83bb9684c2e689d26fb0793d772af0c8da0cd25bb02523d192fbc6946c32143e56b472c1d33fa82466b3f2d3346e1ce8fe83cf6 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.14.9, @babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" +"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": + version: 7.23.4 + resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/types": "npm:^7.22.15" + "@babel/plugin-syntax-jsx": "npm:^7.23.3" + "@babel/types": "npm:^7.23.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: db37491e3eea5530521e177380312f308f01f806866fa0ce08d48fc5a8c9eaf9a954f778fa1ff477248afb72e916eb66ab3d35254bb6a8979f8b8e74a0fd8873 + checksum: 8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5" +"@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 18db2e2346d79ebe4a3f85f51fa7757a63a09bc6da7f339e6ce9e7534de68b5165fe7d49ac363dee6ba3f81eb904d44bf9c13653331805f9b236a1d9fec7e018 + checksum: 76287adeab656fb7f39243e5ab6a8c60069cf69fffeebd1566457d56cb2f966366a23bd755d3e369f4d0437459e3b76243df370caa7d7d2287a8560b66c53ca2 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.22.10, @babel/plugin-transform-regenerator@npm:^7.22.5": +"@babel/plugin-transform-regenerator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" dependencies: @@ -1759,14 +2032,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" +"@babel/plugin-transform-regenerator@npm:^7.22.5, @babel/plugin-transform-regenerator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.22.5" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3b0e989ae5db78894ee300b24e07fbcec490c39ab48629c519377581cf94e90308f4ddc10a8914edc9f403e2d3ac7a7ae0ae09003629d852da03e2ba846299c6 + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.22.5, @babel/plugin-transform-reserved-words@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3ee861941b1d3f9e50f1bb97a2067f33c868b8cd5fd3419a610b2ad5f3afef5f9e4b3740d26a617dc1a9e169a33477821d96b6917c774ea87cac6790d341abbd + checksum: 4e6d61f6c9757592661cfbd2c39c4f61551557b98cb5f0995ef10f5540f67e18dde8a42b09716d58943b6e4b7ef5c9bcf19902839e7328a4d49149e0fecdbfcd languageName: node linkType: hard @@ -1787,18 +2072,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.13.9": - version: 7.22.15 - resolution: "@babel/plugin-transform-runtime@npm:7.22.15" + version: 7.23.4 + resolution: "@babel/plugin-transform-runtime@npm:7.23.4" dependencies: "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.5" - babel-plugin-polyfill-corejs3: "npm:^0.8.3" - babel-plugin-polyfill-regenerator: "npm:^0.5.2" + babel-plugin-polyfill-corejs2: "npm:^0.4.6" + babel-plugin-polyfill-corejs3: "npm:^0.8.5" + babel-plugin-polyfill-regenerator: "npm:^0.5.3" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a01c4bc83c720e55367de978ab5c93ed6e27cd0f5e932c3628df6aed4331ee876868a3bf9a8c588aecf1ae2894dd5a6ffb21362af19b232d9fd2e836af431828 + checksum: 6ac29012550cdd10b65ec43fef0c7f43904ec458c43d597f627d8f52807413e57ea94e3986dbace576d734e67c2d09be5e43e77c72567d18f8c4ac5e19844625 languageName: node linkType: hard @@ -1818,63 +2103,77 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.22.5" +"@babel/plugin-transform-shorthand-properties@npm:^7.22.5, @babel/plugin-transform-shorthand-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d2dd6b7033f536dd74569d7343bf3ca88c4bc12575e572a2c5446f42a1ebc8e69cec5e38fc0e63ac7c4a48b944a3225e4317d5db94287b9a5b381a5045c0cdb2 + checksum: c423c66fec0b6503f50561741754c84366ef9e9818442c8881fbaa90cc363fd137084b9431cdc00ed2f1fd8c8a1a5982c4a7e1f2af3769db4caf2ac7ea55d4f0 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-spread@npm:7.22.5" +"@babel/plugin-transform-spread@npm:^7.22.5, @babel/plugin-transform-spread@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-spread@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f8896b00d69557a4aafb3f48b7db6fbaa8462588e733afc4eabfdf79b12a6aed7d20341d160d704205591f0a43d04971d391fa80328f61240d1edc918079a1b0 + checksum: a348e4ae47e4ceeceb760506ec7bf835ccc18a2cf70ec74ebfbe41bc172fa2412b05b7d1b86836f8aee375e41a04ff20486074778d0e2d19d668b33dc52e9dbb languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" +"@babel/plugin-transform-sticky-regex@npm:^7.22.5, @babel/plugin-transform-sticky-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 42d9295d357415b55c04967ff1cd124cdcbabf2635614f9ad4f8b372d9ae35f6c02bf7473a5418b91e75235960cb1e61493e2c0581cb55bf9719b0986bcd22a5 + checksum: cd15c407906b41e4b924ea151e455c11274dba050771ee7154ad88a1a274140ac5e84efc8d08c4379f2f0cec8a09e4a0a3b2a3a954ba6a67d9fb35df1c714c56 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" +"@babel/plugin-transform-template-literals@npm:^7.22.5, @babel/plugin-transform-template-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1fc597716edf9f5c7bc74e2fead4d7751467500486dd17092af90ccbd65c5fc4a1db2e9c86e9ed1a9f206f6a3403bbc07eab50b0c2b8e50f819b4118f2cf71ef + checksum: 9b5f43788b9ffcb8f2b445a16b1aa40fcf23cb0446a4649445f098ec6b4cb751f243a535da623d59fefe48f4c40552f5621187a61811779076bab26863e3373d languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" +"@babel/plugin-transform-typeof-symbol@npm:^7.22.5, @babel/plugin-transform-typeof-symbol@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 277084dd3e873d62541f683173c7cf33b8317f7714335b7e861cc5b4b76f09acbf532a4c9dfbcf7756d29bc07b94b48bd9356af478f424865a86c7d5798be7c0 + checksum: 50e81d84c6059878be2a0e41e0d790cab10882cfb8fa85e8c2665ccb0b3cd7233f49197f17427bc7c1b36c80e07076640ecf1b641888d78b9cb91bc16478d84a languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.13.0, @babel/plugin-transform-typescript@npm:^7.22.15": +"@babel/plugin-transform-typescript@npm:^7.13.0": + version: 7.23.4 + resolution: "@babel/plugin-transform-typescript@npm:7.23.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/plugin-syntax-typescript": "npm:^7.23.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 657294f8e0d59fc2b765a230cd1635a575c2dee33aba45e8fc0fbe6ef86ffae007f8c9ca41665ac9629f49a922caf844d14b9a7990dddd2f64aee969d6fb14a4 + languageName: node + linkType: hard + +"@babel/plugin-transform-typescript@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-typescript@npm:7.22.15" dependencies: @@ -1902,7 +2201,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.22.10, @babel/plugin-transform-unicode-escapes@npm:^7.22.5": +"@babel/plugin-transform-unicode-escapes@npm:^7.22.10": version: 7.22.10 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.10" dependencies: @@ -1913,39 +2212,50 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.22.5" +"@babel/plugin-transform-unicode-escapes@npm:^7.22.5, @babel/plugin-transform-unicode-escapes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: da424c1e99af0e920d21f7f121fb9503d0771597a4bd14130fb5f116407be29e9340c049d04733b3d8a132effe4f4585fe3cc9630ae3294a2df9199c8dfd7075 + checksum: f1ed54742dc982666f471df5d087cfda9c6dbf7842bec2d0f7893ed359b142a38c0210358f297ab5c7a3e11ec0dfb0e523de2e2edf48b62f257aaadd5f068866 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" +"@babel/plugin-transform-unicode-property-regex@npm:^7.22.5, @babel/plugin-transform-unicode-property-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4cfaf4bb724a5c55a6fb5b0ee6ebbeba78dc700b9bc0043715d4b37409d90b43c888735c613690a1ec0d8d8e41a500b9d3f0395aa9f55b174449c8407663684b + checksum: dca5702d43fac70351623a12e4dfa454fd028a67498888522b644fd1a02534fabd440106897e886ebcc6ce6a39c58094ca29953b6f51bc67372aa8845a5ae49f languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.22.5" +"@babel/plugin-transform-unicode-regex@npm:^7.22.5, @babel/plugin-transform-unicode-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: df824dcca2f6e731f61d69103e87d5dd974d8a04e46e28684a4ba935ae633d876bded09b8db890fd72d0caf7b9638e2672b753671783613cc78d472951e2df8c + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.22.5, @babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: af37b468332db051f0aaa144adbfab39574e570f613e121b58a551e3cbb7083c9f8c32a83ba2641172a4065128052643468438c19ad098cd62b2d97140dc483e + checksum: 30fe1d29af8395a867d40a63a250ca89072033d9bc7d4587eeebeaf4ad7f776aab83064321bfdb1d09d7e29a1d392852361f4f60a353f0f4d1a3b435dcbf256b languageName: node linkType: hard @@ -2050,23 +2360,24 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.16.5": - version: 7.22.20 - resolution: "@babel/preset-env@npm:7.22.20" + version: 7.23.3 + resolution: "@babel/preset-env@npm:7.23.3" dependencies: - "@babel/compat-data": "npm:^7.22.20" + "@babel/compat-data": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.3" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.22.5" - "@babel/plugin-syntax-import-attributes": "npm:^7.22.5" + "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" + "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -2078,64 +2389,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.22.5" - "@babel/plugin-transform-async-generator-functions": "npm:^7.22.15" - "@babel/plugin-transform-async-to-generator": "npm:^7.22.5" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.22.5" - "@babel/plugin-transform-block-scoping": "npm:^7.22.15" - "@babel/plugin-transform-class-properties": "npm:^7.22.5" - "@babel/plugin-transform-class-static-block": "npm:^7.22.11" - "@babel/plugin-transform-classes": "npm:^7.22.15" - "@babel/plugin-transform-computed-properties": "npm:^7.22.5" - "@babel/plugin-transform-destructuring": "npm:^7.22.15" - "@babel/plugin-transform-dotall-regex": "npm:^7.22.5" - "@babel/plugin-transform-duplicate-keys": "npm:^7.22.5" - "@babel/plugin-transform-dynamic-import": "npm:^7.22.11" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.22.5" - "@babel/plugin-transform-export-namespace-from": "npm:^7.22.11" - "@babel/plugin-transform-for-of": "npm:^7.22.15" - "@babel/plugin-transform-function-name": "npm:^7.22.5" - "@babel/plugin-transform-json-strings": "npm:^7.22.11" - "@babel/plugin-transform-literals": "npm:^7.22.5" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.22.11" - "@babel/plugin-transform-member-expression-literals": "npm:^7.22.5" - "@babel/plugin-transform-modules-amd": "npm:^7.22.5" - "@babel/plugin-transform-modules-commonjs": "npm:^7.22.15" - "@babel/plugin-transform-modules-systemjs": "npm:^7.22.11" - "@babel/plugin-transform-modules-umd": "npm:^7.22.5" + "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" + "@babel/plugin-transform-async-generator-functions": "npm:^7.23.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" + "@babel/plugin-transform-block-scoping": "npm:^7.23.3" + "@babel/plugin-transform-class-properties": "npm:^7.23.3" + "@babel/plugin-transform-class-static-block": "npm:^7.23.3" + "@babel/plugin-transform-classes": "npm:^7.23.3" + "@babel/plugin-transform-computed-properties": "npm:^7.23.3" + "@babel/plugin-transform-destructuring": "npm:^7.23.3" + "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" + "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" + "@babel/plugin-transform-dynamic-import": "npm:^7.23.3" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" + "@babel/plugin-transform-export-namespace-from": "npm:^7.23.3" + "@babel/plugin-transform-for-of": "npm:^7.23.3" + "@babel/plugin-transform-function-name": "npm:^7.23.3" + "@babel/plugin-transform-json-strings": "npm:^7.23.3" + "@babel/plugin-transform-literals": "npm:^7.23.3" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.3" + "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" + "@babel/plugin-transform-modules-amd": "npm:^7.23.3" + "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" + "@babel/plugin-transform-modules-systemjs": "npm:^7.23.3" + "@babel/plugin-transform-modules-umd": "npm:^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.22.11" - "@babel/plugin-transform-numeric-separator": "npm:^7.22.11" - "@babel/plugin-transform-object-rest-spread": "npm:^7.22.15" - "@babel/plugin-transform-object-super": "npm:^7.22.5" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.22.11" - "@babel/plugin-transform-optional-chaining": "npm:^7.22.15" - "@babel/plugin-transform-parameters": "npm:^7.22.15" - "@babel/plugin-transform-private-methods": "npm:^7.22.5" - "@babel/plugin-transform-private-property-in-object": "npm:^7.22.11" - "@babel/plugin-transform-property-literals": "npm:^7.22.5" - "@babel/plugin-transform-regenerator": "npm:^7.22.10" - "@babel/plugin-transform-reserved-words": "npm:^7.22.5" - "@babel/plugin-transform-shorthand-properties": "npm:^7.22.5" - "@babel/plugin-transform-spread": "npm:^7.22.5" - "@babel/plugin-transform-sticky-regex": "npm:^7.22.5" - "@babel/plugin-transform-template-literals": "npm:^7.22.5" - "@babel/plugin-transform-typeof-symbol": "npm:^7.22.5" - "@babel/plugin-transform-unicode-escapes": "npm:^7.22.10" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.22.5" - "@babel/plugin-transform-unicode-regex": "npm:^7.22.5" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.22.5" + "@babel/plugin-transform-new-target": "npm:^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.3" + "@babel/plugin-transform-numeric-separator": "npm:^7.23.3" + "@babel/plugin-transform-object-rest-spread": "npm:^7.23.3" + "@babel/plugin-transform-object-super": "npm:^7.23.3" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-private-methods": "npm:^7.23.3" + "@babel/plugin-transform-private-property-in-object": "npm:^7.23.3" + "@babel/plugin-transform-property-literals": "npm:^7.23.3" + "@babel/plugin-transform-regenerator": "npm:^7.23.3" + "@babel/plugin-transform-reserved-words": "npm:^7.23.3" + "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" + "@babel/plugin-transform-spread": "npm:^7.23.3" + "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" + "@babel/plugin-transform-template-literals": "npm:^7.23.3" + "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" + "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" + "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - "@babel/types": "npm:^7.22.19" - babel-plugin-polyfill-corejs2: "npm:^0.4.5" - babel-plugin-polyfill-corejs3: "npm:^0.8.3" - babel-plugin-polyfill-regenerator: "npm:^0.5.2" + babel-plugin-polyfill-corejs2: "npm:^0.4.6" + babel-plugin-polyfill-corejs3: "npm:^0.8.5" + babel-plugin-polyfill-regenerator: "npm:^0.5.3" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3adf4209a785aec7bfc1a331845ca623acd115e01ff0f9c918b1bc67f69f9e06e6aad4c06940a5001c4c2189617d8c6f8b7fb4720ed7beb9b92d0bdf399692f7 + checksum: 36b02a86817ab5474bb74a8d62a110723b0b05904a52ddc5627cf89457525b8d5ac0739b8e435a6ae12ef8b90cd5fc191169898c3dc2ac9d2c84026b02f2580a languageName: node linkType: hard @@ -2230,15 +2540,15 @@ __metadata: linkType: hard "@babel/preset-flow@npm:^7.13.13, @babel/preset-flow@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/preset-flow@npm:7.22.15" + version: 7.23.3 + resolution: "@babel/preset-flow@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-flow-strip-types": "npm:^7.22.5" + "@babel/plugin-transform-flow-strip-types": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7eef0c84ec1889d6c4f7a67d7d1a81703420eed123a8c23f25af148eead77907f0bd701f3e729fdb37d3ddb2a373bf43938b36a9ba17f546111ddb9521466b92 + checksum: 1cf109925791f2af679f03289848d27596b4f27cb0ad4ee74a8dd4c1cbecc119bdef3b45cbbe12489bc9bdf61163f94c1c0bf6013cc58c325f1cc99edc01bda9 languageName: node linkType: hard @@ -2271,37 +2581,22 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/preset-react@npm:7.22.15" + version: 7.23.3 + resolution: "@babel/preset-react@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.22.5" + "@babel/plugin-transform-react-display-name": "npm:^7.23.3" "@babel/plugin-transform-react-jsx": "npm:^7.22.15" "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 80940aa494292b7f689d902b76828cb3ab4eaf4e6421107f23388b6ea7316ab25ccd817b766fde5c40787fd92f1cba1f660190bfd71965c902e49b42c9e290c2 - languageName: node - linkType: hard - -"@babel/preset-typescript@npm:^7.13.0": - version: 7.23.0 - resolution: "@babel/preset-typescript@npm:7.23.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.0" - "@babel/plugin-transform-typescript": "npm:^7.22.15" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 97e246bd14eefad1dd93144200e62aedfb8577fac4172c8da4760b1c2272680fe06780ad87fea1ab81b62e32a23fc9f8e9f10c31a1c22cabf879cb3025e2fed8 + checksum: cecb2493e09fd4ffa5effcef1d06e968386b1bfe077a99834f7e8ef249208274fca62fe5a6b3986ef1c1c3900b2eb409adb528ae1b73dba31397b16f9262e83c languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.23.0": +"@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.23.0": version: 7.23.3 resolution: "@babel/preset-typescript@npm:7.23.3" dependencies: @@ -2354,12 +2649,12 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.10.2": - version: 7.23.1 - resolution: "@babel/runtime-corejs3@npm:7.23.1" + version: 7.23.4 + resolution: "@babel/runtime-corejs3@npm:7.23.4" dependencies: core-js-pure: "npm:^3.30.2" regenerator-runtime: "npm:^0.14.0" - checksum: 6e2c2b11779ff56c88b1f3a8742498640f7271ad4fcf9cfd24052bbb236a5e7c4c7c8d81cda751da3b4effa678736303deb78441c5752e63bfb90d6453fd870f + checksum: 31fa117b451fb8f34290aa7bd2016f12254663e78641f75ec28599c5d6a63f4f7c0e796eced0bb89194a491dfae0edc61364d0ffb4efbf19a9e46bfca6848a58 languageName: node linkType: hard @@ -2390,12 +2685,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": - version: 7.23.1 - resolution: "@babel/runtime@npm:7.23.1" +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": + version: 7.23.4 + resolution: "@babel/runtime@npm:7.23.4" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: e57ab1436d4845efe67c3f76d578508bb584173690ecfeac105bc4e09d64b2aa6a53c1e03bca3c97cc238e5390a804e5a4ded211e6350243b735905ca45a4822 + checksum: db2bf183cd0119599b903ca51ca0aeea8e0ab478a16be1aae10dd90473ed614159d3e5adfdd8f8f3d840402428ce0d90b5c01aae95da9e45a2dd83e02d85ca27 languageName: node linkType: hard @@ -2428,18 +2723,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:7.8.6": - version: 7.8.6 - resolution: "@babel/template@npm:7.8.6" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@babel/parser": "npm:^7.8.6" - "@babel/types": "npm:^7.8.6" - checksum: c89b2f39452083303beaaabc794ebf83194bb5599647c54591d3b8358b42d720bab050daa34450052e4fdf21bcb77cf60b6419fec73d50eb2ce60c4abfe7292e - languageName: node - linkType: hard - -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.3.3, @babel/template@npm:^7.7.0": +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3, @babel/template@npm:^7.7.0": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" dependencies: @@ -2486,7 +2770,25 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.11.5, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.4, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.0, @babel/types@npm:^7.7.2, @babel/types@npm:^7.8.3, @babel/types@npm:^7.8.6, @babel/types@npm:^7.9.6": +"@babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/traverse@npm:7.23.4" + dependencies: + "@babel/code-frame": "npm:^7.23.4" + "@babel/generator": "npm:^7.23.4" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.23.4" + "@babel/types": "npm:^7.23.4" + debug: "npm:^4.1.0" + globals: "npm:^11.1.0" + checksum: a423d2b90934efe4ed423d67d91d6aa33ad035d6a175420fa9715376720584b4e7a7002be4bf55b085b7e675b7aba8c615e01560d6d9c47341427e1fe8039c68 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.11.5, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.4, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.0, @babel/types@npm:^7.7.2, @babel/types@npm:^7.8.3, @babel/types@npm:^7.9.6": version: 7.23.0 resolution: "@babel/types@npm:7.23.0" dependencies: @@ -2497,6 +2799,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.23.3, @babel/types@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/types@npm:7.23.4" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 231954418e0d052a8e69c9d84dde31baffd91d38d99624d18f160e14aa32b094b9e3e91c9c065ea88ea80c6e1589b17bb8b843b950c20c112f32c17482f7cf1f + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -2727,7 +3040,7 @@ __metadata: languageName: node linkType: hard -"@emotion/jest@npm:^11.10.0, @emotion/jest@npm:^11.8.0": +"@emotion/jest@npm:^11.10.0": version: 11.11.0 resolution: "@emotion/jest@npm:11.11.0" dependencies: @@ -3012,15 +3325,15 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.9.1 - resolution: "@eslint-community/regexpp@npm:4.9.1" - checksum: d0e1bd1a37cb2cb6bbac88dfe97b62b412d4b6ea3a4bb1c4e1e503be03125063db5d80999cef9728f57b19b49979aa902ac68182bcf5f80dfce6fa9a9d34eee1 + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" +"@eslint/eslintrc@npm:^2.1.3": + version: 2.1.3 + resolution: "@eslint/eslintrc@npm:2.1.3" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" @@ -3031,14 +3344,14 @@ __metadata: js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 00efdc3797e6f05518060522b7788e5f5aff02f13facbd0c83b176c3dee86554023283a5f68542df379c5137685d2d29745c87f62bf2406a1d38d95471f44ce6 + checksum: f4103f4346126292eb15581c5a1d12bef03410fd3719dedbdb92e1f7031d46a5a2d60de8566790445d5d4b70b75ba050876799a11f5fff8265a91ee3fa77dab0 languageName: node linkType: hard -"@eslint/js@npm:8.50.0": - version: 8.50.0 - resolution: "@eslint/js@npm:8.50.0" - checksum: 92cb0a823869e85f287bd172f14a6a20d7d65c3f4db886a0356a9efebfe8fe519e9ead84a5687bd18f45eca417bdcce96e3b83fe3feae8baf0f8f44d14073bae +"@eslint/js@npm:8.54.0": + version: 8.54.0 + resolution: "@eslint/js@npm:8.54.0" + checksum: d61fb4a0be6af2d8cb290121c329697664a75d6255a29926d5454fb02aeb02b87112f67fdf218d10abac42f90c570ac366126751baefc5405d0e017ed0c946c5 languageName: node linkType: hard @@ -3070,44 +3383,6 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.2": - version: 1.5.0 - resolution: "@floating-ui/core@npm:1.5.0" - dependencies: - "@floating-ui/utils": "npm:^0.1.3" - checksum: bca811cefd09c3f56c4cf58c3e94826c1ce4a0b40124e9030ddca2ef1cc68b4ddc5ba5b4d7cc94c9555aea6876d2428a77a2ae261fe5b39c79df247a9518b053 - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.5.1": - version: 1.5.3 - resolution: "@floating-ui/dom@npm:1.5.3" - dependencies: - "@floating-ui/core": "npm:^1.4.2" - "@floating-ui/utils": "npm:^0.1.3" - checksum: e5f30b911f939e40003851077bba441f269ae689bdc43c674bee43aa98fc6b7a5f59be432d27b7be599b1e4ab7b15c752875ea777a89cff01d157e593b78b25b - languageName: node - linkType: hard - -"@floating-ui/react-dom@npm:^2.0.0": - version: 2.0.2 - resolution: "@floating-ui/react-dom@npm:2.0.2" - dependencies: - "@floating-ui/dom": "npm:^1.5.1" - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: bfd07cfc9047a31e92e223dbbe48f2cdb75460126217b35cfbf8555eaf1718ce7c11f4ee4d39bdee89eaf9ad0a5c4dd9af443a552116fc3478a19a9f6283bdf6 - languageName: node - linkType: hard - -"@floating-ui/utils@npm:^0.1.3": - version: 0.1.6 - resolution: "@floating-ui/utils@npm:0.1.6" - checksum: 0a089db0e0526b89e83cb0a773a903517db5c9067cd473febfd8fa91a3a2ccbc3a835234796c1bb528def21dbb67be50e28d9c473cb58a6d90679d7e549b9c0c - languageName: node - linkType: hard - "@gitbeaker/core@npm:^35.8.1": version: 35.8.1 resolution: "@gitbeaker/core@npm:35.8.1" @@ -3538,14 +3813,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.11": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" dependencies: - "@humanwhocodes/object-schema": "npm:^1.2.1" + "@humanwhocodes/object-schema": "npm:^2.0.1" debug: "npm:^4.1.1" minimatch: "npm:^3.0.5" - checksum: 4195f68e485f7d1a7c95cf0f126cc41f7223eeda2f1b46b893123c99b35bb76145c37d25e2ba452d54815ed69bb656c0ce9e343ffa984470c08afa6e82a4713f + checksum: d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a languageName: node linkType: hard @@ -3563,10 +3838,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: c3c35fdb70c04a569278351c75553e293ae339684ed75895edc79facc7276e351115786946658d78133130c0cca80e57e2203bc07f8fa7fe7980300e8deef7db +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: 9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac languageName: node linkType: hard @@ -3962,12 +4237,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.19 - resolution: "@jridgewell/trace-mapping@npm:0.3.19" + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 845e6c6efca621b2b85e4d13fd25c319b6e4ab1ea78d4385ff6c0f78322ea0fcdfec8ac763aa4b56e8378c96d7bef101a2638c7a1a076f7d62f6376230c940a7 + checksum: 0ea0b2675cf513ec44dc25605616a3c9b808b9832e74b5b63c44260d66b58558bba65764f81928fc1033ead911f8718dca1134049c3e7a93937faf436671df31 languageName: node linkType: hard @@ -3993,9 +4268,9 @@ __metadata: linkType: hard "@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": - version: 1.1.1 - resolution: "@lit-labs/ssr-dom-shim@npm:1.1.1" - checksum: bc530a6d390a71e44a74f0d79ab78df0c3cf814f5a69e64c60271d626f4b871d0269c82f2b1bcaf9ef1a84f361f50a1fc70c790873cded769e8f0e4f1fa01ff8 + version: 1.1.2 + resolution: "@lit-labs/ssr-dom-shim@npm:1.1.2" + checksum: e51c7c156317ac95cac8d534d8608ac2a9dda7441f14f73e9e66a995d277851a90315324fe74690d1169a66dce645ed9674a8f5a9a467d183156de1c87549b23 languageName: node linkType: hard @@ -4031,84 +4306,84 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.0.2": - version: 14.0.2 - resolution: "@next/env@npm:14.0.2" - checksum: 9fad703ce13b7b7fecf898d3c239f8976f2ec7f3c7c461c06da70898a0221775c48e1a2e2c76740216c4093c2db9bd7adaacd196586cd4283e09eb89de4c1db6 +"@next/env@npm:14.0.3": + version: 14.0.3 + resolution: "@next/env@npm:14.0.3" + checksum: 8688367c22461a075b5406463d16c284cf58e6861418e974fbd5901721da73402988340f8dd72d8e2e41e32ae0b7f24f91bd49029ee6e63424361587165febc5 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-darwin-arm64@npm:14.0.2" +"@next/swc-darwin-arm64@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-darwin-arm64@npm:14.0.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-darwin-x64@npm:14.0.2" +"@next/swc-darwin-x64@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-darwin-x64@npm:14.0.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-linux-arm64-gnu@npm:14.0.2" +"@next/swc-linux-arm64-gnu@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-linux-arm64-gnu@npm:14.0.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-linux-arm64-musl@npm:14.0.2" +"@next/swc-linux-arm64-musl@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-linux-arm64-musl@npm:14.0.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-linux-x64-gnu@npm:14.0.2" +"@next/swc-linux-x64-gnu@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-linux-x64-gnu@npm:14.0.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-linux-x64-musl@npm:14.0.2" +"@next/swc-linux-x64-musl@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-linux-x64-musl@npm:14.0.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-win32-arm64-msvc@npm:14.0.2" +"@next/swc-win32-arm64-msvc@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-win32-arm64-msvc@npm:14.0.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-win32-ia32-msvc@npm:14.0.2" +"@next/swc-win32-ia32-msvc@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-win32-ia32-msvc@npm:14.0.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.0.2": - version: 14.0.2 - resolution: "@next/swc-win32-x64-msvc@npm:14.0.2" +"@next/swc-win32-x64-msvc@npm:14.0.3": + version: 14.0.3 + resolution: "@next/swc-win32-x64-msvc@npm:14.0.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@ngtools/webpack@npm:16.2.4": - version: 16.2.4 - resolution: "@ngtools/webpack@npm:16.2.4" +"@ngtools/webpack@npm:16.2.10": + version: 16.2.10 + resolution: "@ngtools/webpack@npm:16.2.10" peerDependencies: "@angular/compiler-cli": ^16.0.0 typescript: ">=4.9.3 <5.2" webpack: ^5.54.0 - checksum: 7bbf12e04e922372b9b8d29a8ee3dd3dd5f9bb12aaf82f85156bfd2270284875553fa5dc19566c30f3769960e701051204de646fce573098febabb629415e044 + checksum: 74c4296c2b713efb065d506a7681dbcb55a11a7666fd4458d867030ae1fd0b82fec22cfea808390b4543ee720ed691fbe9d767d2a1b92aa196f8c595b0fb9b5d languageName: node linkType: hard @@ -4139,6 +4414,19 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 7b89590598476dda88e79c473766b67c682aae6e0ab0213491daa6083dcc0c171f86b3868f5506f22c09aa5ea69ad7dfb78f4bf39a8dca375d89a42f408645b3 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.0 resolution: "@npmcli/fs@npm:3.1.0" @@ -4592,28 +4880,28 @@ __metadata: linkType: hard "@preact/preset-vite@npm:^2.0.0": - version: 2.5.0 - resolution: "@preact/preset-vite@npm:2.5.0" + version: 2.7.0 + resolution: "@preact/preset-vite@npm:2.7.0" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.14.9" - "@babel/plugin-transform-react-jsx-development": "npm:^7.16.7" - "@prefresh/vite": "npm:^2.2.8" + "@babel/plugin-transform-react-jsx": "npm:^7.22.15" + "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" + "@prefresh/vite": "npm:^2.4.1" "@rollup/pluginutils": "npm:^4.1.1" babel-plugin-transform-hook-names: "npm:^1.0.2" - debug: "npm:^4.3.1" - kolorist: "npm:^1.2.10" - resolve: "npm:^1.20.0" + debug: "npm:^4.3.4" + kolorist: "npm:^1.8.0" + resolve: "npm:^1.22.8" peerDependencies: "@babel/core": 7.x - vite: 2.x || 3.x || 4.x - checksum: 109f2a64717357f76685cd45ec1f709c2ba83e88a8dc485b39dec8cb1178eda765fe929b47d83690cbee1fa6181209f79ba4f7cbec15bcaa1cbb45730af8946a + vite: 2.x || 3.x || 4.x || 5.x + checksum: 95a5a87d804d9f33d98f7c8db93fe27de0d626b2794e745734bcad7a7d89db5a3ad37712feb188f1857d834658de33167f524b3040e8cea48ef422da6a1e74db languageName: node linkType: hard -"@prefresh/babel-plugin@npm:0.5.0": - version: 0.5.0 - resolution: "@prefresh/babel-plugin@npm:0.5.0" - checksum: 71cbfb52f3f4e29c2cc6a3b7adee87ac7d9c074edfe2f87b3f90ab006123572fab6dd679aa125b8a94e4669578f172ef0b1732d0d6c2b2fc158d0c765a87b70f +"@prefresh/babel-plugin@npm:0.5.1": + version: 0.5.1 + resolution: "@prefresh/babel-plugin@npm:0.5.1" + checksum: f9153c210427adbddb4403502f8fa845f6207516de2d162f5d550683a87173dc3eaabc6be2bb4f1206b882cdd23339f2092567be8d09794a3d06a5626942b1e4 languageName: node linkType: hard @@ -4633,19 +4921,19 @@ __metadata: languageName: node linkType: hard -"@prefresh/vite@npm:^2.2.8": - version: 2.4.1 - resolution: "@prefresh/vite@npm:2.4.1" +"@prefresh/vite@npm:^2.4.1": + version: 2.4.4 + resolution: "@prefresh/vite@npm:2.4.4" dependencies: "@babel/core": "npm:^7.22.1" - "@prefresh/babel-plugin": "npm:0.5.0" + "@prefresh/babel-plugin": "npm:0.5.1" "@prefresh/core": "npm:^1.5.1" "@prefresh/utils": "npm:^1.2.0" "@rollup/pluginutils": "npm:^4.2.1" peerDependencies: preact: ^10.4.0 vite: ">=2.0.0" - checksum: 939b4667ed83acfff6a879c8bff78d028b85c74f9e1cde656cf344768b888f6ba6b9927ee5e5efeecfc877fc6e6088c4c252e3f476604aecedaaf83cdfef7c45 + checksum: 31c3fcdcfbfd31921d41f01ca027515d4411f4169c2d3810578bf87b61609d155a1a410c977f098839982adb8da2d88674382cc4a5e55b6fe249a59be60a2483 languageName: node linkType: hard @@ -4656,481 +4944,35 @@ __metadata: "@babel/runtime": "npm:^7.13.10" checksum: 42e4870cd14459da6da03e43c7507dc4c807ed787a87bda52912a0d1d6d5013326b697c18c9625fc6a2cf0af2b45d9c86747985b45358fd92ab646b983978e3c languageName: node - linkType: hard - -"@radix-ui/primitive@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/primitive@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - checksum: 912216455537db3ca77f3e7f70174fb2b454fbd4a37a0acb7cfadad9ab6131abdfb787472242574460a3c301edf45738340cc84f6717982710082840fde7d916 - languageName: node - linkType: hard - -"@radix-ui/react-arrow@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-arrow@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-primitive": "npm: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 - checksum: c931f6d7e0bac50fd1654a0303a303aff74a68a13a33a851a43a7c88677b53a92ca6557920b9105144a3002f899ce888437d20ddd7803a5c716edac99587626d - languageName: node - linkType: hard - -"@radix-ui/react-collection@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-collection@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-slot": "npm: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 - checksum: cefa56383d7451ca79e4bd5a29aaeef6c205a04297213efd149aaead82fc8cde4fb8298e20e6b3613e5696e43f814fb4489805428f6604834fb31f73c6725fa8 - languageName: node - linkType: hard - -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: be06f8dab35b5a1bffa7a5982fb26218ddade1acb751288333e3b89d7b4a7dfb5a6371be83876dac0ec2ebe0866d295e8618b778608e1965342986ea448040ec - languageName: node - linkType: hard - -"@radix-ui/react-context@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-context@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 3de5761b32cc70cd61715527f29d8c699c01ab28c195ced972ccbc7025763a373a68f18c9f948c7a7b922e469fd2df7fee5f7536e3f7bad44ffc06d959359333 - languageName: node - linkType: hard - -"@radix-ui/react-direction@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-direction@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: b1a45b4d1d5070ca3b5864b920f6c6210c962bdb519abb62b38b1baef9d06737dc3d8ecdb61860b7504a735235a539652f5977c7299ec021da84e6b0f64d988a - languageName: node - linkType: hard - -"@radix-ui/react-dismissable-layer@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-dismissable-layer@npm:1.0.4" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - "@radix-ui/react-use-escape-keydown": "npm: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 - checksum: a7b9695092cd4109a7b4a4a66b7f634c42d4f39aa0893621a8ee5e8bc90f8ae27e741df66db726c341a60d2115e3f813520fee1f5cc4fb05d77914b4ade3819f - languageName: node - linkType: hard - -"@radix-ui/react-focus-guards@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-focus-guards@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: d5fd4e5aa9d9a87c8ad490b3b4992d6f1d9eddf18e56df2a2bcf8744c4332b275d73377fd193df3e6ba0ad9608dc497709beca5c64de2b834d5f5350b3c9a272 - languageName: node - linkType: hard - -"@radix-ui/react-focus-scope@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-focus-scope@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm: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 - checksum: bfff46919666c122f5b812ee427494ae8408c0eebee30337bd2ce0eedf539f0feaa242f790304ef9df15425b837010ffc6061ce467bedd2c5fd9373bee2b95da - languageName: node - linkType: hard - -"@radix-ui/react-id@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-id@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-layout-effect": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: e2859ca58bea171c956098ace7ecf615cf9432f58a118b779a14720746b3adcf0351c36c75de131548672d3cd290ca238198acbd33b88dc4706f98312e9317ad - languageName: node - linkType: hard - -"@radix-ui/react-popper@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-popper@npm:1.1.2" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@floating-ui/react-dom": "npm:^2.0.0" - "@radix-ui/react-arrow": "npm:1.0.3" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - "@radix-ui/react-use-layout-effect": "npm:1.0.1" - "@radix-ui/react-use-rect": "npm:1.0.1" - "@radix-ui/react-use-size": "npm:1.0.1" - "@radix-ui/rect": "npm: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 - checksum: 4bd069b79f7046af2c0967b8e43f727cd09834cbd6df1e3d5a943c4f83428ff8b646882737fdf7593c22e261a1d13768a5c020138d79503862ae2e1729081bba - languageName: node - linkType: hard - -"@radix-ui/react-portal@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-portal@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-primitive": "npm: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 - checksum: baf295bbbf09ead37b64ee1dc025a6a540960f5e60552766d78f6065504c67d4bcf49fad5e2073617d9a3011daafad625aa3bd1da7a886c704833b22a49e888f - languageName: node - linkType: hard - -"@radix-ui/react-presence@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-presence@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-use-layout-effect": "npm: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 - checksum: 90780618b265fe794a8f1ddaa5bfd3c71a1127fa79330a14d32722e6265b44452a9dd36efe4e769129d33e57f979f6b8713e2cbf2e2755326aa3b0f337185b6e - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-primitive@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-slot": "npm: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 - checksum: 67a66ff8898a5e7739eda228ab6f5ce808858da1dce967014138d87e72b6bbfc93dc1467c706d98d1a2b93bf0b6e09233d1a24d31c78227b078444c1a69c42be - languageName: node - linkType: hard - -"@radix-ui/react-roving-focus@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-roving-focus@npm:1.0.4" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-collection": "npm:1.0.3" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-direction": "npm:1.0.1" - "@radix-ui/react-id": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - "@radix-ui/react-use-controllable-state": "npm: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 - checksum: 61e3ddfd1647e64fba855434ff41e8e7ba707244fe8841f78c450fbdce525383b64259279475615d030dbf1625cbffd8eeebee72d91bf6978794f5dbcf887fc0 - languageName: node - linkType: hard - -"@radix-ui/react-scroll-area@npm:^1.0.5": - version: 1.0.5 - resolution: "@radix-ui/react-scroll-area@npm:1.0.5" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/number": "npm:1.0.1" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-direction": "npm:1.0.1" - "@radix-ui/react-presence": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - "@radix-ui/react-use-layout-effect": "npm: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 - checksum: a08818aeeb15920a02e708699a8bdc85c26eab0579ab741129b464a799b5d9a04f81810a2d200f1cf4aef03452067770e87b0f81593a689350fcd7e51819e4cb - languageName: node - linkType: hard - -"@radix-ui/react-select@npm:^1.2.2": - version: 1.2.2 - resolution: "@radix-ui/react-select@npm:1.2.2" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/number": "npm:1.0.1" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-collection": "npm:1.0.3" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-direction": "npm:1.0.1" - "@radix-ui/react-dismissable-layer": "npm:1.0.4" - "@radix-ui/react-focus-guards": "npm:1.0.1" - "@radix-ui/react-focus-scope": "npm:1.0.3" - "@radix-ui/react-id": "npm:1.0.1" - "@radix-ui/react-popper": "npm:1.1.2" - "@radix-ui/react-portal": "npm:1.0.3" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-slot": "npm:1.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - "@radix-ui/react-use-controllable-state": "npm:1.0.1" - "@radix-ui/react-use-layout-effect": "npm:1.0.1" - "@radix-ui/react-use-previous": "npm:1.0.1" - "@radix-ui/react-visually-hidden": "npm:1.0.3" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm: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 - checksum: 888fffa703a8f79b45c01d5f03ad9aae66250ddfff827bbba4f222c4d0720aa2f01a3e4b6bd80acabaf5e2fa7ad79de9e9dfd14831f7f4c24337d4d8dfb58ccc - languageName: node - linkType: hard - -"@radix-ui/react-separator@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-separator@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-primitive": "npm: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 - checksum: 87bcde47343f2bc4439a0dc34381f557905d9b3c1e8c5a0d32ceea62a8ef84f3abf671c5cb29309fc87759ad41d39af619ba546cf54109d64c8746e3ca683de3 - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 3af6ea4891e6fa8091e666802adffe7718b3cd390a10fa9229a5f40f8efded9f3918ea01b046103d93923d41cc32119505ebb6bde76cad07a87b6cf4f2119347 - languageName: node - linkType: hard - -"@radix-ui/react-toggle-group@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-toggle-group@npm:1.0.4" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-direction": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-roving-focus": "npm:1.0.4" - "@radix-ui/react-toggle": "npm:1.0.3" - "@radix-ui/react-use-controllable-state": "npm: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 - checksum: 4f4761965022759ac0950ac026029b64049e1f18ef07a01ddde788b7606efcb262c9ae3a418de0c0756bf7285182ed0d268502c6f17ba86d2ff27eee5507bbf7 - languageName: node - linkType: hard - -"@radix-ui/react-toggle@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-toggle@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-controllable-state": "npm: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 - checksum: 9b487dad213ea7e70b0aa205e7c6f790a6f2bf394c39912e22dbe003403fd0d24a41c2efd31695fc31ab7bac286f28253dbb2fc5202cacd572ebf909f1fdc86c + linkType: hard + +"@radix-ui/primitive@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/primitive@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 912216455537db3ca77f3e7f70174fb2b454fbd4a37a0acb7cfadad9ab6131abdfb787472242574460a3c301edf45738340cc84f6717982710082840fde7d916 languageName: node linkType: hard -"@radix-ui/react-toolbar@npm:^1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-toolbar@npm:1.0.4" +"@radix-ui/react-compose-refs@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-compose-refs@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-direction": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-roving-focus": "npm:1.0.4" - "@radix-ui/react-separator": "npm:1.0.3" - "@radix-ui/react-toggle-group": "npm:1.0.4" 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 - checksum: 3ed7ebe22ef2e8369e08bb59776671a7b8c413628249c338b8db86b4b9ac40127b4201d5bd4a9c23ea1fd21464769b4fa427d3ebcda3a7fcdbd45b256b5a753a + checksum: be06f8dab35b5a1bffa7a5982fb26218ddade1acb751288333e3b89d7b4a7dfb5a6371be83876dac0ec2ebe0866d295e8618b778608e1965342986ea448040ec languageName: node linkType: hard -"@radix-ui/react-use-callback-ref@npm:1.0.1": +"@radix-ui/react-context@npm:1.0.1": version: 1.0.1 - resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" + resolution: "@radix-ui/react-context@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" peerDependencies: @@ -5139,130 +4981,137 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 331b432be1edc960ca148637ae6087220873ee828ceb13bd155926ef8f49e862812de5b379129f6aaefcd11be53715f3237e6caa9a33d9c0abfff43f3ba58938 + checksum: 3de5761b32cc70cd61715527f29d8c699c01ab28c195ced972ccbc7025763a373a68f18c9f948c7a7b922e469fd2df7fee5f7536e3f7bad44ffc06d959359333 languageName: node linkType: hard -"@radix-ui/react-use-controllable-state@npm:1.0.1": +"@radix-ui/react-direction@npm:1.0.1": version: 1.0.1 - resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" + resolution: "@radix-ui/react-direction@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 29b069dbf09e48bca321af6272574ad0fc7283174e7d092731a10663fe00c0e6b4bde5e1b5ea67725fe48dcbe8026e7ff0d69d42891c62cbb9ca408498171fbe + checksum: b1a45b4d1d5070ca3b5864b920f6c6210c962bdb519abb62b38b1baef9d06737dc3d8ecdb61860b7504a735235a539652f5977c7299ec021da84e6b0f64d988a languageName: node linkType: hard -"@radix-ui/react-use-escape-keydown@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm: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 - checksum: 3c94c78902dcb40b60083ee2184614f45c95a189178f52d89323b467bd04bcf5fdb1bc4d43debecd7f0b572c3843c7e04edbcb56f40a4b4b43936fb2770fb8ad + "@types/react-dom": + optional: true + checksum: 90780618b265fe794a8f1ddaa5bfd3c71a1127fa79330a14d32722e6265b44452a9dd36efe4e769129d33e57f979f6b8713e2cbf2e2755326aa3b0f337185b6e languageName: node linkType: hard -"@radix-ui/react-use-layout-effect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" +"@radix-ui/react-primitive@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-primitive@npm:1.0.3" dependencies: "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-slot": "npm: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 - checksum: 13cd0c38395c5838bc9a18238020d3bcf67fb340039e6d1cbf438be1b91d64cf6900b78121f3dc9219faeb40dcc7b523ce0f17e4a41631655690e5a30a40886a + "@types/react-dom": + optional: true + checksum: 67a66ff8898a5e7739eda228ab6f5ce808858da1dce967014138d87e72b6bbfc93dc1467c706d98d1a2b93bf0b6e09233d1a24d31c78227b078444c1a69c42be languageName: node linkType: hard -"@radix-ui/react-use-previous@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-previous@npm:1.0.1" +"@radix-ui/react-scroll-area@npm:^1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-scroll-area@npm:1.0.5" dependencies: "@babel/runtime": "npm:^7.13.10" + "@radix-ui/number": "npm:1.0.1" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm: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 - checksum: f5fbc602108668484a4ed506b7842482222d1d03094362e26abb7fdd593eee8794fc47d85b3524fb9d00884801c89a6eefd0bed0971eba1ec189c637b6afd398 + "@types/react-dom": + optional: true + checksum: a08818aeeb15920a02e708699a8bdc85c26eab0579ab741129b464a799b5d9a04f81810a2d200f1cf4aef03452067770e87b0f81593a689350fcd7e51819e4cb languageName: node linkType: hard -"@radix-ui/react-use-rect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-rect@npm:1.0.1" +"@radix-ui/react-slot@npm:1.0.2, @radix-ui/react-slot@npm:^1.0.2": + version: 1.0.2 + resolution: "@radix-ui/react-slot@npm:1.0.2" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/rect": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 94c5ab31dfd3678c0cb77a30025e82b3a287577c1a8674b0d703a36d27434bc9c59790e0bebf57ed153f0b8e0d8c3b9675fc9787b9eac525a09abcda8fa9e7eb + checksum: 3af6ea4891e6fa8091e666802adffe7718b3cd390a10fa9229a5f40f8efded9f3918ea01b046103d93923d41cc32119505ebb6bde76cad07a87b6cf4f2119347 languageName: node linkType: hard -"@radix-ui/react-use-size@npm:1.0.1": +"@radix-ui/react-use-callback-ref@npm:1.0.1": version: 1.0.1 - resolution: "@radix-ui/react-use-size@npm:1.0.1" + resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-layout-effect": "npm:1.0.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: "@types/react": optional: true - checksum: b109a4b3781781c4dc641a1173f0a6fcb0b0f7b2d7cdba5848a46070c9fb4e518909a46c20a3c2efbc78737c64859c59ead837f2940e8c8394d1c503ef58773b + checksum: 331b432be1edc960ca148637ae6087220873ee828ceb13bd155926ef8f49e862812de5b379129f6aaefcd11be53715f3237e6caa9a33d9c0abfff43f3ba58938 languageName: node linkType: hard -"@radix-ui/react-visually-hidden@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-visually-hidden@npm:1.0.3" +"@radix-ui/react-use-layout-effect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" dependencies: "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-primitive": "npm: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 - checksum: 0cbc12c2156b3fa0e40090cafd8525ce84c16a6b5a038a8e8fc7cbb16ed6da9ab369593962c57a18c41a16ec8713e0195c68ea34072ef1ca254ed4d4c0770bb4 - languageName: node - linkType: hard - -"@radix-ui/rect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/rect@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - checksum: 4c5159661340acc31b11e1f2ebd87a1521d39bfa287544dd2cd75b399539a4b625d38a1501c90ceae21fcca18ed164b0c3735817ff140ae334098192c110e571 + checksum: 13cd0c38395c5838bc9a18238020d3bcf67fb340039e6d1cbf438be1b91d64cf6900b78121f3dc9219faeb40dcc7b523ce0f17e4a41631655690e5a30a40886a languageName: node linkType: hard @@ -5277,29 +5126,29 @@ __metadata: linkType: hard "@rollup/pluginutils@npm:^5.0.2": - version: 5.0.4 - resolution: "@rollup/pluginutils@npm:5.0.4" + version: 5.0.5 + resolution: "@rollup/pluginutils@npm:5.0.5" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" picomatch: "npm:^2.3.1" peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 4114d0dbc22623d33ee38885e90afada4d96fae92e9645693fe438f6313832377ffb6b2809d90e96cc269339a54e2c0c46a739f621d9041050b0b751020f726b + checksum: 18a1f5a9afa993a76663cc2102169cd546786b39a3e92bdc8a2a0b408b509d070a02b20970a30daa9d5d0b1b591b5e7734add84b3aaf263178aef5a26cfab2cf languageName: node linkType: hard -"@schematics/angular@npm:16.2.4": - version: 16.2.4 - resolution: "@schematics/angular@npm:16.2.4" +"@schematics/angular@npm:16.2.10": + version: 16.2.10 + resolution: "@schematics/angular@npm:16.2.10" dependencies: - "@angular-devkit/core": "npm:16.2.4" - "@angular-devkit/schematics": "npm:16.2.4" + "@angular-devkit/core": "npm:16.2.10" + "@angular-devkit/schematics": "npm:16.2.10" jsonc-parser: "npm:3.2.0" - checksum: 8435fe5d85ea45c8bf848d6b4297467b25b9b0cbdc71a7b5ec80dd614f106a9e4a7738d27337507048978754ebaa241548108c94694b5359b36308d47c1f0c21 + checksum: 5e3858191908857c66c2e9cc1938a5eb123ebb074ff3a2602f3171bc302971ad13f73e7a2b60f2670c28552decc6de121792f39c0545cf299bce1543058a82b9 languageName: node linkType: hard @@ -5427,18 +5276,19 @@ __metadata: "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" - "@testing-library/react": "npm:^11.2.2" + "@testing-library/react": "npm:^14.0.0" axe-core: "npm:^4.2.0" lodash: "npm:^4.17.21" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" react-resize-detector: "npm:^7.1.2" resize-observer-polyfill: "npm:^1.5.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5457,11 +5307,11 @@ __metadata: "@types/uuid": "npm:^9.0.1" dequal: "npm:^2.0.2" polished: "npm:^4.2.2" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" react-inspector: "npm:^6.0.0" telejson: "npm:^7.2.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" uuid: "npm:^9.0.0" languageName: unknown linkType: soft @@ -5473,15 +5323,16 @@ __metadata: "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" memoizerific: "npm:^1.11.3" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5499,8 +5350,8 @@ __metadata: "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" lodash: "npm:^4.17.21" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" ts-dedent: "npm:^2.0.0" languageName: unknown linkType: soft @@ -5549,12 +5400,12 @@ __metadata: "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" fs-extra: "npm:^11.1.0" - react: "npm:^16.14.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" remark-external-links: "npm:^8.0.0" remark-slug: "npm:^6.0.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.4" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5581,7 +5432,7 @@ __metadata: "@storybook/preview-api": "workspace:*" "@storybook/vue": "workspace:*" ts-dedent: "npm:^2.0.0" - typescript: "npm:^4.9.3" + typescript: "npm:^5.3.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5596,7 +5447,7 @@ __metadata: "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" "@types/webpack-env": "npm:^1.16.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5610,6 +5461,7 @@ __metadata: "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/instrumenter": "workspace:*" "@storybook/jest": "npm:next" "@storybook/manager-api": "workspace:*" @@ -5621,10 +5473,10 @@ __metadata: formik: "npm:^2.2.9" jest-mock: "npm:^27.0.6" polished: "npm:^4.2.2" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" ts-dedent: "npm:^2.2.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5639,12 +5491,12 @@ __metadata: "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" react-resize-detector: "npm:^7.1.2" tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" upath: "npm:^2.0.1" languageName: unknown linkType: soft @@ -5663,7 +5515,7 @@ __metadata: "@storybook/types": "workspace:*" fs-extra: "npm:^11.1.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: @@ -5679,7 +5531,7 @@ __metadata: "@storybook/node-logger": "workspace:*" remark-gfm: "npm:^3.0.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5691,13 +5543,14 @@ __metadata: "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" tiny-invariant: "npm:^1.3.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5709,123 +5562,14 @@ __metadata: "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" - ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" - languageName: unknown - linkType: soft - -"@storybook/addon-storyshots-puppeteer@workspace:*, @storybook/addon-storyshots-puppeteer@workspace:addons/storyshots-puppeteer": - version: 0.0.0-use.local - resolution: "@storybook/addon-storyshots-puppeteer@workspace:addons/storyshots-puppeteer" - dependencies: - "@axe-core/puppeteer": "npm:^4.2.0" - "@storybook/csf": "npm:^0.1.2" - "@storybook/node-logger": "workspace:*" - "@storybook/types": "workspace:*" - "@types/jest-image-snapshot": "npm:^6.0.0" - "@types/puppeteer": "npm:^5.4.0" - enzyme: "npm:^3.11.0" - enzyme-to-json: "npm:^3.6.1" - jest-image-snapshot: "npm:^6.0.0" - puppeteer: "npm:^2.0.0 || ^3.0.0" - peerDependencies: - "@storybook/addon-storyshots": "workspace:*" - puppeteer: ">=2.0.0" - peerDependenciesMeta: - puppeteer: - optional: true - languageName: unknown - linkType: soft - -"@storybook/addon-storyshots@workspace:*, @storybook/addon-storyshots@workspace:addons/storyshots-core": - version: 0.0.0-use.local - resolution: "@storybook/addon-storyshots@workspace:addons/storyshots-core" - dependencies: - "@angular/core": "npm:^16.0.0-rc.4" - "@angular/platform-browser-dynamic": "npm:^16.0.0-rc.4" - "@emotion/jest": "npm:^11.8.0" - "@jest/transform": "npm:^29.3.1" - "@storybook/addon-docs": "workspace:*" - "@storybook/angular": "workspace:*" - "@storybook/babel-plugin-require-context-hook": "npm:1.0.1" - "@storybook/client-api": "workspace:*" - "@storybook/core-common": "workspace:*" - "@storybook/core-webpack": "workspace:*" - "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "workspace:*" - "@storybook/react": "workspace:*" - "@storybook/types": "workspace:*" - "@storybook/vue": "workspace:*" - "@storybook/vue3": "workspace:*" - "@types/jest-specific-snapshot": "npm:^0.5.6" - babel-loader: "npm:^9.1.2" - enzyme: "npm:^3.11.0" - enzyme-adapter-react-16: "npm:^1.15.5" - enzyme-to-json: "npm:^3.6.1" - glob: "npm:^10.0.0" - jest-preset-angular: "npm:^13.0.1" - jest-specific-snapshot: "npm:^8.0.0" - jest-vue-preprocessor: "npm:^1.7.1" - preact-render-to-string: "npm:^5.1.19" - pretty-format: "npm:^29.0.0" - react-test-renderer: "npm:^16" - read-pkg-up: "npm:^7.0.1" - rxjs: "npm:^6.6.3" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" ts-dedent: "npm:^2.0.0" - vue-jest: "npm:^5.0.0-alpha.8" - peerDependencies: - "@angular/core": ">=13.0.0" - "@angular/platform-browser-dynamic": ">=13.0.0" - "@storybook/angular": "*" - "@storybook/react": "*" - "@storybook/vue": "*" - "@storybook/vue3": "*" - jest: "*" - jest-preset-angular: " >= 12.2.3" - jest-vue-preprocessor: "*" - preact: ^10.5.13 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - rxjs: "*" - svelte: "*" - vue: "*" - vue-jest: "*" - peerDependenciesMeta: - "@angular/core": - optional: true - "@angular/platform-browser-dynamic": - optional: true - "@storybook/angular": - optional: true - "@storybook/react": - optional: true - "@storybook/vue": - optional: true - "@storybook/vue3": - optional: true - jest-preset-angular: - optional: true - jest-vue-preprocessor: - optional: true - preact: - optional: true - react: - optional: true - react-dom: - optional: true - rxjs: - optional: true - svelte: - optional: true - vue: - optional: true - vue-jest: - optional: true + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5840,14 +5584,14 @@ __metadata: "@storybook/router": "workspace:*" "@storybook/source-loader": "workspace:*" "@storybook/theming": "workspace:*" - "@types/react": "npm:^16.14.34" + "@types/react": "npm:^18.0.37" "@types/react-syntax-highlighter": "npm:11.0.5" estraverse: "npm:^5.2.0" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" react-syntax-highlighter: "npm:^15.5.0" tiny-invariant: "npm:^1.3.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5858,12 +5602,13 @@ __metadata: "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5876,9 +5621,9 @@ __metadata: "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" - typescript: "npm:~4.9.3" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5890,23 +5635,14 @@ __metadata: "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" memoizerific: "npm:^1.11.3" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" - typescript: "npm:~4.9.3" - languageName: unknown - linkType: soft - -"@storybook/addons@workspace:*, @storybook/addons@workspace:deprecated/addons": - version: 0.0.0-use.local - resolution: "@storybook/addons@workspace:deprecated/addons" - dependencies: - "@storybook/manager-api": "workspace:*" - "@storybook/preview-api": "workspace:*" - "@storybook/types": "workspace:*" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -5941,8 +5677,8 @@ __metadata: "@storybook/types": "workspace:*" "@types/cross-spawn": "npm:^6.0.2" "@types/node": "npm:^18.0.0" - "@types/react": "npm:^16.14.34" - "@types/react-dom": "npm:^16.9.14" + "@types/react": "npm:^18.0.37" + "@types/react-dom": "npm:^18.0.11" "@types/semver": "npm:^7.3.4" "@types/tmp": "npm:^0.2.3" "@types/webpack-env": "npm:^1.18.0" @@ -5957,7 +5693,7 @@ __metadata: tmp: "npm:^0.2.1" ts-dedent: "npm:^2.0.0" tsconfig-paths-webpack-plugin: "npm:^4.0.1" - typescript: "npm:^5.0.4" + typescript: "npm:^5.3.2" util-deprecate: "npm:^1.0.2" webpack: "npm:5" zone.js: "npm:^0.13.0" @@ -5983,15 +5719,6 @@ __metadata: languageName: unknown linkType: soft -"@storybook/api@workspace:*, @storybook/api@workspace:deprecated/manager-api-shim": - version: 0.0.0-use.local - resolution: "@storybook/api@workspace:deprecated/manager-api-shim" - dependencies: - "@storybook/client-logger": "workspace:*" - "@storybook/manager-api": "workspace:*" - languageName: unknown - linkType: soft - "@storybook/babel-plugin-require-context-hook@npm:1.0.1": version: 1.0.1 resolution: "@storybook/babel-plugin-require-context-hook@npm:1.0.1" @@ -6036,6 +5763,7 @@ __metadata: "@storybook/csf": "npm:^0.1.2" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/preview-api": "workspace:*" "@storybook/theming": "workspace:*" @@ -6079,7 +5807,7 @@ __metadata: fs-extra: "npm:^11.1.0" process: "npm:^0.11.10" slash: "npm:^5.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" util: "npm:^0.12.4" languageName: unknown linkType: soft @@ -6108,7 +5836,7 @@ __metadata: magic-string: "npm:^0.30.0" rollup: "npm:^3.20.1" slash: "npm:^5.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.4" peerDependencies: "@preact/preset-vite": "*" @@ -6165,7 +5893,7 @@ __metadata: swc-loader: "npm:^0.2.3" terser-webpack-plugin: "npm:^5.3.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" url: "npm:^0.11.0" util: "npm:^0.12.4" util-deprecate: "npm:^1.0.2" @@ -6179,26 +5907,6 @@ __metadata: languageName: unknown linkType: soft -"@storybook/channel-postmessage@workspace:*, @storybook/channel-postmessage@workspace:deprecated/channel-postmessage": - version: 0.0.0-use.local - resolution: "@storybook/channel-postmessage@workspace:deprecated/channel-postmessage" - dependencies: - "@storybook/channels": "workspace:*" - "@storybook/client-logger": "workspace:*" - typescript: "npm:~4.9.3" - languageName: unknown - linkType: soft - -"@storybook/channel-websocket@workspace:*, @storybook/channel-websocket@workspace:deprecated/channel-websocket": - version: 0.0.0-use.local - resolution: "@storybook/channel-websocket@workspace:deprecated/channel-websocket" - dependencies: - "@storybook/channels": "workspace:*" - "@storybook/client-logger": "workspace:*" - typescript: "npm:~4.9.3" - languageName: unknown - linkType: soft - "@storybook/channels@workspace:*, @storybook/channels@workspace:lib/channels": version: 0.0.0-use.local resolution: "@storybook/channels@workspace:lib/channels" @@ -6209,7 +5917,7 @@ __metadata: qs: "npm:^6.10.0" telejson: "npm:^7.2.0" tiny-invariant: "npm:^1.3.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6221,7 +5929,6 @@ __metadata: "@babel/preset-env": "npm:^7.23.2" "@babel/types": "npm:^7.23.0" "@ndelangen/get-tarball": "npm:^3.0.7" - "@storybook/client-api": "workspace:*" "@storybook/codemod": "workspace:*" "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" @@ -6232,7 +5939,6 @@ __metadata: "@storybook/types": "workspace:*" "@types/cross-spawn": "npm:^6.0.2" "@types/prompts": "npm:^2.0.9" - "@types/puppeteer-core": "npm:^2.1.0" "@types/semver": "npm:^7.3.4" "@types/util-deprecate": "npm:^1.0.0" "@yarnpkg/fslib": "npm:2.10.3" @@ -6256,7 +5962,6 @@ __metadata: ora: "npm:^5.4.1" prettier: "npm:^2.8.0" prompts: "npm:^2.4.0" - puppeteer-core: "npm:^2.1.1" read-pkg-up: "npm:^7.0.1" semver: "npm:^7.3.7" simple-update-notifier: "npm:^2.0.0" @@ -6264,7 +5969,7 @@ __metadata: strip-json-comments: "npm:^3.1.1" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" util-deprecate: "npm:^1.0.2" bin: getstorybook: ./bin/index.js @@ -6272,21 +5977,12 @@ __metadata: languageName: unknown linkType: soft -"@storybook/client-api@workspace:*, @storybook/client-api@workspace:deprecated/client-api": - version: 0.0.0-use.local - resolution: "@storybook/client-api@workspace:deprecated/client-api" - dependencies: - "@storybook/client-logger": "workspace:*" - "@storybook/preview-api": "workspace:*" - languageName: unknown - linkType: soft - -"@storybook/client-logger@npm:7.5.0": - version: 7.5.0 - resolution: "@storybook/client-logger@npm:7.5.0" +"@storybook/client-logger@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/client-logger@npm:7.5.3" dependencies: "@storybook/global": "npm:^5.0.0" - checksum: 90326c49a224bf21680c04ffee94725bf75658086093ccb839a8aae39476929c4719eafb18e498a148cf0dd956d4e9a5d3b2a34d09ca4fd25e2af553458558ac + checksum: 43997b47a4e49b38c599a08de1cec7a6ae6f000ec35a1d676522325aba60bc11507ad18cb0f40954bcfd77dfbb853493687e4e8fd88e2fdac07cd282ecc0d0bf languageName: node linkType: hard @@ -6295,7 +5991,7 @@ __metadata: resolution: "@storybook/client-logger@workspace:lib/client-logger" dependencies: "@storybook/global": "npm:^5.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6326,7 +6022,7 @@ __metadata: remark: "npm:^14.0.2" remark-mdx: "npm:^2.3.0" ts-dedent: "npm:^2.2.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" unist-util-is: "npm:^5.2.0" unist-util-select: "npm:^4.0.3" unist-util-visit: "npm:^4.1.2" @@ -6341,12 +6037,11 @@ __metadata: dependencies: "@popperjs/core": "npm:^2.6.0" "@radix-ui/react-scroll-area": "npm:^1.0.5" - "@radix-ui/react-select": "npm:^1.2.2" - "@radix-ui/react-toolbar": "npm:^1.0.4" + "@radix-ui/react-slot": "npm:^1.0.2" "@storybook/client-logger": "workspace:*" "@storybook/csf": "npm:^0.1.2" "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^1.1.6" + "@storybook/icons": "npm:^1.2.1" "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" "@types/react-syntax-highlighter": "npm:11.0.5" @@ -6359,7 +6054,7 @@ __metadata: react-syntax-highlighter: "npm:^15.4.5" react-textarea-autosize: "npm:^8.3.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" use-resize-observer: "npm:^9.1.0" util-deprecate: "npm:^1.0.2" peerDependencies: @@ -6368,15 +6063,6 @@ __metadata: languageName: unknown linkType: soft -"@storybook/core-client@workspace:*, @storybook/core-client@workspace:deprecated/core-client": - version: 0.0.0-use.local - resolution: "@storybook/core-client@workspace:deprecated/core-client" - dependencies: - "@storybook/client-logger": "workspace:*" - "@storybook/preview-api": "workspace:*" - languageName: unknown - linkType: soft - "@storybook/core-common@workspace:*, @storybook/core-common@workspace:lib/core-common": version: 0.0.0-use.local resolution: "@storybook/core-common@workspace:lib/core-common" @@ -6410,7 +6096,7 @@ __metadata: slash: "npm:^5.0.0" ts-dedent: "npm:^2.0.0" type-fest: "npm:~2.19" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6419,7 +6105,7 @@ __metadata: resolution: "@storybook/core-events@workspace:lib/core-events" dependencies: ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6474,7 +6160,7 @@ __metadata: telejson: "npm:^7.2.0" tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" util: "npm:^0.12.4" util-deprecate: "npm:^1.0.2" watchpack: "npm:^2.2.0" @@ -6490,8 +6176,9 @@ __metadata: "@storybook/node-logger": "workspace:*" "@storybook/types": "workspace:*" "@types/node": "npm:^18.0.0" + slash: "npm:^5.1.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" webpack: "npm:5" languageName: unknown linkType: soft @@ -6501,7 +6188,7 @@ __metadata: resolution: "@storybook/csf-plugin@workspace:lib/csf-plugin" dependencies: "@storybook/csf-tools": "workspace:*" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" unplugin: "npm:^1.3.1" languageName: unknown linkType: soft @@ -6522,7 +6209,7 @@ __metadata: js-yaml: "npm:^4.1.0" recast: "npm:^0.23.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6592,7 +6279,7 @@ __metadata: jest-specific-snapshot: "npm:^8.0.0" lodash: "npm:^4.17.21" require-from-string: "npm:^2.0.2" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6608,7 +6295,7 @@ __metadata: "@storybook/types": "workspace:*" ember-source: "npm:~3.28.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" "@types/ember__component": 4.0.8 @@ -6647,16 +6334,13 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/html-vite@workspace:frameworks/html-vite" dependencies: - "@storybook/addons": "workspace:*" "@storybook/builder-vite": "workspace:*" - "@storybook/client-api": "workspace:*" "@storybook/core-server": "workspace:*" "@storybook/html": "workspace:*" "@storybook/node-logger": "workspace:*" - "@storybook/preview-web": "workspace:*" "@types/node": "npm:^18.0.0" magic-string: "npm:^0.30.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6670,7 +6354,7 @@ __metadata: "@storybook/html": "workspace:*" "@storybook/preset-html-webpack": "workspace:*" "@types/node": "npm:^18.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" languageName: unknown @@ -6680,25 +6364,24 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/html@workspace:renderers/html" dependencies: - "@storybook/core-client": "workspace:*" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" languageName: unknown linkType: soft -"@storybook/icons@npm:^1.1.6": - version: 1.1.7 - resolution: "@storybook/icons@npm:1.1.7" +"@storybook/icons@npm:^1.2.1": + version: 1.2.2 + resolution: "@storybook/icons@npm:1.2.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 5bb97f948f2a1cfc067a120f8e17004cdf9cdef0d08558ec51659e4e4d4b1620c76ced6d15a57d84aed888c664a0f9daa7a6e7b4ef22302d95f3228aa627bc83 + checksum: b879b87f6036270fdbafba8c762f051f8d7a12fa7af6482a3426d47c9b2a22c0bcd5d7b3298252933c0dc21e61e4694785efcb88059e7b3ee979fd77f6567451 languageName: node linkType: hard @@ -6712,7 +6395,7 @@ __metadata: "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" "@vitest/utils": "npm:^0.34.6" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" util: "npm:^0.12.4" languageName: unknown linkType: soft @@ -6776,13 +6459,13 @@ __metadata: lodash: "npm:^4.17.21" memoizerific: "npm:^1.11.3" qs: "npm:^6.10.0" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" semver: "npm:^7.3.7" store2: "npm:^2.14.2" telejson: "npm:^7.2.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6792,18 +6475,19 @@ __metadata: dependencies: "@fal-works/esbuild-plugin-global-externals": "npm:^2.1.2" "@storybook/addon-designs": "npm:^7.0.4" - "@storybook/addons": "workspace:*" "@storybook/channels": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/components": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.1" "@storybook/manager-api": "workspace:*" "@storybook/router": "workspace:*" "@storybook/test": "workspace:*" "@storybook/theming": "workspace:*" "@storybook/types": "workspace:*" "@testing-library/react": "npm:^11.2.2" + "@types/react-transition-group": "npm:^4" "@types/semver": "npm:^7.3.4" browser-dtector: "npm:^3.4.0" copy-to-clipboard: "npm:^3.3.1" @@ -6815,16 +6499,17 @@ __metadata: memoizerific: "npm:^1.11.3" polished: "npm:^4.2.2" qs: "npm:^6.10.0" - react: "npm:^16.14.0" - react-dom: "npm:^16.8.0" - react-draggable: "npm:^4.4.3" - react-helmet-async: "npm:^1.0.7" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-draggable: "npm:^4.4.5" + react-helmet-async: "npm:^1.3.0" react-resize-detector: "npm:^7.1.2" + react-transition-group: "npm:^4.4.5" resolve-from: "npm:^5.0.0" semver: "npm:^7.3.7" store2: "npm:^2.14.2" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6885,7 +6570,7 @@ __metadata: ts-dedent: "npm:^2.0.0" tsconfig-paths: "npm:^4.0.0" tsconfig-paths-webpack-plugin: "npm:^4.0.1" - typescript: "npm:^4.9.3" + typescript: "npm:^5.3.2" webpack: "npm:^5.65.0" peerDependencies: "@next/font": ^13.0.0|| ^14.0.0 @@ -6912,7 +6597,7 @@ __metadata: chalk: "npm:^4.1.0" npmlog: "npm:^5.0.1" pretty-hrtime: "npm:^1.0.3" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6923,7 +6608,7 @@ __metadata: jest: "npm:^29.7.0" jest-specific-snapshot: "npm:^8.0.0" jscodeshift: "npm:^0.15.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -6935,7 +6620,7 @@ __metadata: "@storybook/builder-vite": "workspace:*" "@storybook/preact": "workspace:*" "@types/node": "npm:^18.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.0" peerDependencies: preact: ">=10" @@ -6953,7 +6638,7 @@ __metadata: "@storybook/preset-preact-webpack": "workspace:*" "@types/node": "npm:^18.0.0" preact: "npm:^10.5.13" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" preact: ^8.0.0||^10.0.0 @@ -6964,13 +6649,12 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/preact@workspace:renderers/preact" dependencies: - "@storybook/core-client": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" preact: "npm:^10.5.13" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: preact: ^8.0.0||^10.0.0 languageName: unknown @@ -6988,7 +6672,7 @@ __metadata: "@types/node": "npm:^18.0.0" pnp-webpack-plugin: "npm:^1.7.0" semver: "npm:^7.3.5" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" react-scripts: ">=5.0.0" @@ -7002,7 +6686,7 @@ __metadata: "@storybook/core-webpack": "workspace:*" "@types/node": "npm:^18.0.0" html-loader: "npm:^3.1.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" webpack: "npm:5" peerDependencies: "@babel/core": "*" @@ -7018,7 +6702,7 @@ __metadata: "@storybook/core-webpack": "workspace:*" "@types/node": "npm:^18.0.0" preact: "npm:^10.5.13" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" preact: ^8.0.0||^10.0.0 @@ -7045,7 +6729,7 @@ __metadata: react-docgen: "npm:^7.0.0" react-refresh: "npm:^0.14.0" semver: "npm:^7.3.7" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" webpack: "npm:5" peerDependencies: "@babel/core": ^7.22.0 @@ -7072,7 +6756,7 @@ __metadata: jest-specific-snapshot: "npm:^8.0.0" safe-identifier: "npm:^0.4.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" yaml: "npm:^2.3.1" yaml-loader: "npm:^0.8.0" languageName: unknown @@ -7088,7 +6772,7 @@ __metadata: svelte-loader: "npm:^3.1.9" sveltedoc-parser: "npm:^4.2.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" svelte: ^3.1.0 || ^4.0.0 @@ -7104,7 +6788,7 @@ __metadata: "@storybook/docs-tools": "workspace:*" "@types/node": "npm:^18.0.0" ts-loader: "npm:^9.2.8" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vue: "npm:^2.6.12" vue-docgen-api: "npm:^4.44.23" vue-docgen-loader: "npm:^1.5.1" @@ -7130,7 +6814,7 @@ __metadata: "@types/node": "npm:^18.0.0" "@vue/compiler-sfc": "npm:^3.2.33" ts-loader: "npm:^9.2.8" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vue: "npm:^3.2.33" vue-docgen-api: "npm:^4.46.0" vue-docgen-loader: "npm:^1.5.1" @@ -7156,7 +6840,7 @@ __metadata: babel-loader: "npm:^7.0.0 || ^8.0.0 || ^9.0.0" babel-plugin-bundled-import-meta: "npm:^0.3.1" lit: "npm:2.3.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: lit: ^2.0.0 || ^3.0.0 languageName: unknown @@ -7187,15 +6871,6 @@ __metadata: languageName: unknown linkType: soft -"@storybook/preview-web@workspace:*, @storybook/preview-web@workspace:deprecated/preview-web": - version: 0.0.0-use.local - resolution: "@storybook/preview-web@workspace:deprecated/preview-web" - dependencies: - "@storybook/client-logger": "workspace:*" - "@storybook/preview-api": "workspace:*" - languageName: unknown - linkType: soft - "@storybook/preview@workspace:*, @storybook/preview@workspace:lib/preview": version: 0.0.0-use.local resolution: "@storybook/preview@workspace:lib/preview" @@ -7206,9 +6881,7 @@ __metadata: "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" browser-dtector: "npm:^3.4.0" - fs-extra: "npm:^11.1.0" - ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7235,7 +6908,7 @@ __metadata: resolution: "@storybook/react-dom-shim@workspace:lib/react-dom-shim" dependencies: "@storybook/types": "workspace:*" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7254,7 +6927,7 @@ __metadata: "@vitejs/plugin-react": "npm:^3.0.1" magic-string: "npm:^0.30.0" react-docgen: "npm:^7.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7291,7 +6964,6 @@ __metadata: dependencies: "@babel/core": "npm:^7.23.2" "@storybook/client-logger": "workspace:*" - "@storybook/core-client": "workspace:*" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" @@ -7353,29 +7025,21 @@ __metadata: "@storybook/addon-mdx-gfm": "workspace:*" "@storybook/addon-measure": "workspace:*" "@storybook/addon-outline": "workspace:*" - "@storybook/addon-storyshots": "workspace:*" - "@storybook/addon-storyshots-puppeteer": "workspace:*" "@storybook/addon-storysource": "workspace:*" "@storybook/addon-toolbars": "workspace:*" "@storybook/addon-viewport": "workspace:*" - "@storybook/addons": "workspace:*" "@storybook/angular": "workspace:*" - "@storybook/api": "workspace:*" "@storybook/babel-plugin-require-context-hook": "npm:1.0.1" "@storybook/bench": "npm:next" "@storybook/blocks": "workspace:*" "@storybook/builder-manager": "workspace:*" "@storybook/builder-vite": "workspace:*" "@storybook/builder-webpack5": "workspace:*" - "@storybook/channel-postmessage": "workspace:*" - "@storybook/channel-websocket": "workspace:*" "@storybook/channels": "workspace:*" "@storybook/cli": "workspace:*" - "@storybook/client-api": "workspace:*" "@storybook/client-logger": "workspace:*" "@storybook/codemod": "workspace:*" "@storybook/components": "workspace:*" - "@storybook/core-client": "workspace:*" "@storybook/core-common": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/core-server": "workspace:*" @@ -7412,7 +7076,6 @@ __metadata: "@storybook/preset-web-components-webpack": "workspace:*" "@storybook/preview": "workspace:*" "@storybook/preview-api": "workspace:*" - "@storybook/preview-web": "workspace:*" "@storybook/react": "workspace:*" "@storybook/react-vite": "workspace:*" "@storybook/react-webpack5": "workspace:*" @@ -7420,7 +7083,6 @@ __metadata: "@storybook/server": "workspace:*" "@storybook/server-webpack5": "workspace:*" "@storybook/source-loader": "workspace:*" - "@storybook/store": "workspace:*" "@storybook/svelte": "workspace:*" "@storybook/svelte-webpack5": "workspace:*" "@storybook/telemetry": "workspace:*" @@ -7439,14 +7101,15 @@ __metadata: "@swc/jest": "npm:^0.2.26" "@testing-library/dom": "npm:^7.29.4" "@testing-library/jest-dom": "npm:^5.11.9" - "@testing-library/react": "npm:^11.2.2" - "@testing-library/user-event": "npm:^13.2.1" + "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.4.3" "@types/express": "npm:^4.17.11" "@types/fs-extra": "npm:^11.0.1" + "@types/jest-specific-snapshot": "npm:^0.5.6" "@types/lodash": "npm:^4.14.167" "@types/node": "npm:^18.0.0" - "@types/react": "npm:^16.14.34" - "@types/react-dom": "npm:^16.9.14" + "@types/react": "npm:^18.0.37" + "@types/react-dom": "npm:^18.0.11" "@types/semver": "npm:^7.3.4" "@types/serve-static": "npm:^1.13.8" "@typescript-eslint/eslint-plugin": "npm:^5.45.0" @@ -7467,7 +7130,7 @@ __metadata: eslint-plugin-import: "npm:^2.26.0" eslint-plugin-local-rules: "portal:../scripts/eslint-plugin-local-rules" eslint-plugin-react: "npm:^7.31.10" - eslint-plugin-storybook: "npm:^0.6.6" + eslint-plugin-storybook: "npm:^0.6.15" fs-extra: "npm:^11.1.0" github-release-from-changelog: "npm:^2.1.1" glob: "npm:^10.0.0" @@ -7475,10 +7138,10 @@ __metadata: husky: "npm:^4.3.7" jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.5.0" - jest-image-snapshot: "npm:^6.0.0" jest-junit: "npm:^16.0.0" jest-os-detection: "npm:^1.3.1" jest-serializer-html: "npm:^7.1.0" + jest-specific-snapshot: "npm:^8.0.0" jest-watch-typeahead: "npm:^2.2.1" lint-staged: "npm:^13.2.2" lodash: "npm:^4.17.21" @@ -7487,13 +7150,14 @@ __metadata: prettier: "npm:2.8.0" process: "npm:^0.11.10" raf: "npm:^3.4.1" - react: "npm:^16.14.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" semver: "npm:^7.3.7" serve-static: "npm:^1.14.1" trash: "npm:^7.0.0" ts-dedent: "npm:^2.0.0" ts-node: "npm:^10.9.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" util: "npm:^0.12.4" vite: "npm:^4.0.0" vite-plugin-turbosnap: "npm:^1.0.1" @@ -7527,11 +7191,11 @@ __metadata: lodash: "npm:^4.17.21" memoizerific: "npm:^1.11.3" qs: "npm:^6.10.0" - react: "npm:^16.8.0" - react-dom: "npm:^16.8.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" react-router-dom: "npm:6.0.2" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7544,7 +7208,7 @@ __metadata: "@storybook/preset-server-webpack": "workspace:*" "@storybook/server": "workspace:*" "@types/node": "npm:^18.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7552,7 +7216,6 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/server@workspace:renderers/server" dependencies: - "@storybook/core-client": "workspace:*" "@storybook/csf": "npm:^0.1.2" "@storybook/csf-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" @@ -7561,7 +7224,7 @@ __metadata: "@types/fs-extra": "npm:^11.0.1" fs-extra: "npm:^11.1.0" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" yaml: "npm:^2.3.1" languageName: unknown linkType: soft @@ -7576,16 +7239,7 @@ __metadata: jest-specific-snapshot: "npm:^8.0.0" lodash: "npm:^4.17.21" prettier: "npm:^2.8.0" - typescript: "npm:~4.9.3" - languageName: unknown - linkType: soft - -"@storybook/store@workspace:*, @storybook/store@workspace:deprecated/store": - version: 0.0.0-use.local - resolution: "@storybook/store@workspace:deprecated/store" - dependencies: - "@storybook/client-logger": "workspace:*" - "@storybook/preview-api": "workspace:*" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7603,7 +7257,7 @@ __metadata: svelte-preprocess: "npm:^5.0.4" sveltedoc-parser: "npm:^4.2.1" ts-dedent: "npm:^2.2.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.0" peerDependencies: svelte: ^3.0.0 || ^4.0.0 @@ -7621,7 +7275,7 @@ __metadata: "@storybook/svelte": "workspace:*" svelte: "npm:^4.0.0" svelte-loader: "npm:^3.1.9" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: "@babel/core": "*" svelte: ^3.48.0 || ^4.0.0 @@ -7634,7 +7288,6 @@ __metadata: resolution: "@storybook/svelte@workspace:renderers/svelte" dependencies: "@storybook/client-logger": "workspace:*" - "@storybook/core-client": "workspace:*" "@storybook/core-events": "workspace:*" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" @@ -7646,7 +7299,7 @@ __metadata: sveltedoc-parser: "npm:^4.2.1" ts-dedent: "npm:^2.0.0" type-fest: "npm:~2.19" - typescript: "npm:^5.0.4" + typescript: "npm:^5.3.2" peerDependencies: svelte: ^3.1.0 || ^4.0.0 languageName: unknown @@ -7661,7 +7314,7 @@ __metadata: "@storybook/svelte": "workspace:*" "@storybook/svelte-vite": "workspace:*" "@types/node": "npm:^18.0.0" - typescript: "npm:^4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.0" peerDependencies: svelte: ^3.0.0 || ^4.0.0 @@ -7683,7 +7336,7 @@ __metadata: nanoid: "npm:^4.0.2" node-fetch: "npm:^3.3.1" read-pkg-up: "npm:^7.0.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7697,14 +7350,14 @@ __metadata: "@storybook/preview-api": "workspace:*" "@testing-library/dom": "npm:^9.3.1" "@testing-library/jest-dom": "npm:^6.1.3" - "@testing-library/user-event": "npm:^14.4.3" + "@testing-library/user-event": "npm:14.3.0" "@types/chai": "npm:^4" "@vitest/expect": "npm:^0.34.2" "@vitest/spy": "npm:^0.34.1" chai: "npm:^4.3.7" ts-dedent: "npm:^2.2.0" type-fest: "npm:~2.19" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" util: "npm:^0.12.4" languageName: unknown linkType: soft @@ -7721,17 +7374,17 @@ __metadata: linkType: hard "@storybook/theming@npm:^7.0.2": - version: 7.5.0 - resolution: "@storybook/theming@npm:7.5.0" + version: 7.5.3 + resolution: "@storybook/theming@npm:7.5.3" dependencies: "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.0" - "@storybook/client-logger": "npm:7.5.0" + "@storybook/client-logger": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" memoizerific: "npm:^1.11.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 57da8e27c748cbec4dc1661cdd2d449949d97476d8e97933696b31d07c7361cbbcca8d7225cc00ca078daa160023b8965ddec7c23519ce0a4ef2658246b062e7 + checksum: 30dc5fd55617fcd7f33a6c75ddd1b2b5e1e28ce2973425fb8764f5770292659e1676264252bd14909ac9843799ab2e0a5d9e83ad3b4a29848c54600264f8af10 languageName: node linkType: hard @@ -7753,7 +7406,7 @@ __metadata: memoizerific: "npm:^1.11.3" polished: "npm:^4.2.2" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7771,7 +7424,7 @@ __metadata: "@types/fs-extra": "npm:^11.0.1" "@types/node": "npm:^18.0.0" file-system-cache: "npm:2.3.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7784,7 +7437,7 @@ __metadata: "@storybook/core-server": "workspace:*" "@storybook/vue": "workspace:*" magic-string: "npm:^0.30.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.0" vue: "npm:^2.7.10" vue-docgen-api: "npm:^4.40.0" @@ -7803,7 +7456,7 @@ __metadata: "@storybook/preset-vue-webpack": "workspace:*" "@storybook/vue": "workspace:*" "@types/node": "npm:^18.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vue: "npm:^2.6.12" vue-loader: "npm:^15.7.0" vue-template-compiler: "npm:^2.6.14" @@ -7827,7 +7480,7 @@ __metadata: "@types/node": "npm:^18.0.0" "@vitejs/plugin-vue": "npm:^4.0.0" magic-string: "npm:^0.30.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vite: "npm:^4.0.0" vue-docgen-api: "npm:^4.40.0" peerDependencies: @@ -7845,7 +7498,7 @@ __metadata: "@storybook/vue3": "workspace:*" "@types/node": "npm:^18.0.0" "@vue/compiler-sfc": "npm:3.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vue: "npm:3.0.0" peerDependencies: "@babel/core": "*" @@ -7860,7 +7513,6 @@ __metadata: resolution: "@storybook/vue3@workspace:renderers/vue3" dependencies: "@digitak/esrun": "npm:^3.2.2" - "@storybook/core-client": "workspace:*" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" @@ -7872,7 +7524,7 @@ __metadata: lodash: "npm:^4.17.21" ts-dedent: "npm:^2.0.0" type-fest: "npm:~2.19" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vue: "npm:^3.2.47" vue-component-type-helpers: "npm:latest" vue-tsc: "npm:latest" @@ -7887,14 +7539,13 @@ __metadata: resolution: "@storybook/vue@workspace:renderers/vue" dependencies: "@storybook/client-logger": "workspace:*" - "@storybook/core-client": "workspace:*" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/preview-api": "workspace:*" "@storybook/types": "workspace:*" ts-dedent: "npm:^2.0.0" type-fest: "npm:~2.19" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" vue: "npm:2.6.14" vue-tsc: "npm:latest" peerDependencies: @@ -7918,7 +7569,7 @@ __metadata: "@storybook/web-components": "workspace:*" "@types/node": "npm:^18.0.0" magic-string: "npm:^0.30.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" languageName: unknown linkType: soft @@ -7933,7 +7584,7 @@ __metadata: "@storybook/web-components": "workspace:*" "@types/node": "npm:^18.0.0" lit: "npm:2.3.1" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" peerDependencies: lit: ^2.0.0 || ^3.0.0 languageName: unknown @@ -7944,7 +7595,6 @@ __metadata: resolution: "@storybook/web-components@workspace:renderers/web-components" dependencies: "@storybook/client-logger": "workspace:*" - "@storybook/core-client": "workspace:*" "@storybook/docs-tools": "workspace:*" "@storybook/global": "npm:^5.0.0" "@storybook/manager-api": "workspace:*" @@ -7956,7 +7606,7 @@ __metadata: lit: "npm:2.3.1" tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" - typescript: "npm:~4.9.3" + typescript: "npm:^5.3.2" web-component-analyzer: "npm:^1.1.6" peerDependencies: lit: ^2.0.0 || ^3.0.0 @@ -7984,8 +7634,8 @@ __metadata: linkType: hard "@sveltejs/vite-plugin-svelte@npm:^2.4.2": - version: 2.4.6 - resolution: "@sveltejs/vite-plugin-svelte@npm:2.4.6" + version: 2.5.3 + resolution: "@sveltejs/vite-plugin-svelte@npm:2.5.3" dependencies: "@sveltejs/vite-plugin-svelte-inspector": "npm:^1.0.4" debug: "npm:^4.3.4" @@ -7995,9 +7645,9 @@ __metadata: svelte-hmr: "npm:^0.15.3" vitefu: "npm:^0.2.4" peerDependencies: - svelte: ^3.54.0 || ^4.0.0 + svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0 vite: ^4.0.0 - checksum: de7d844bf5fc12aa4caf352f5825d58f6747eef68301a492128ea6756c3c193f1d1e1f75975abd4fdfb50f5a4ff45016a94f40c29e1b0121095c63f6bc10e219 + checksum: 613a4ad18a946ddee7b82cae0d892040a9459a5ac5137cbaa91a4b7b67d504409b5dbc02d268136a740b09e42531b7516f80a0f687ca4fe2b0d99e6e483c5d06 languageName: node linkType: hard @@ -8008,9 +7658,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-darwin-arm64@npm:1.3.91" +"@swc/core-darwin-arm64@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-darwin-arm64@npm:1.3.99" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -8022,9 +7672,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-darwin-x64@npm:1.3.91" +"@swc/core-darwin-x64@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-darwin-x64@npm:1.3.99" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -8036,13 +7686,6 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.91" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@swc/core-linux-arm64-gnu@npm:1.3.82": version: 1.3.82 resolution: "@swc/core-linux-arm64-gnu@npm:1.3.82" @@ -8050,9 +7693,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.91" +"@swc/core-linux-arm64-gnu@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.99" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -8064,9 +7707,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.91" +"@swc/core-linux-arm64-musl@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.99" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -8078,9 +7721,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.91" +"@swc/core-linux-x64-gnu@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.99" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -8092,9 +7735,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-linux-x64-musl@npm:1.3.91" +"@swc/core-linux-x64-musl@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-x64-musl@npm:1.3.99" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -8106,9 +7749,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.91" +"@swc/core-win32-arm64-msvc@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.99" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -8120,9 +7763,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.91" +"@swc/core-win32-ia32-msvc@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.99" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -8134,9 +7777,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.91": - version: 1.3.91 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.91" +"@swc/core-win32-x64-msvc@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.99" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -8187,19 +7830,18 @@ __metadata: linkType: hard "@swc/core@npm:^1.3.82": - version: 1.3.91 - resolution: "@swc/core@npm:1.3.91" - dependencies: - "@swc/core-darwin-arm64": "npm:1.3.91" - "@swc/core-darwin-x64": "npm:1.3.91" - "@swc/core-linux-arm-gnueabihf": "npm:1.3.91" - "@swc/core-linux-arm64-gnu": "npm:1.3.91" - "@swc/core-linux-arm64-musl": "npm:1.3.91" - "@swc/core-linux-x64-gnu": "npm:1.3.91" - "@swc/core-linux-x64-musl": "npm:1.3.91" - "@swc/core-win32-arm64-msvc": "npm:1.3.91" - "@swc/core-win32-ia32-msvc": "npm:1.3.91" - "@swc/core-win32-x64-msvc": "npm:1.3.91" + version: 1.3.99 + resolution: "@swc/core@npm:1.3.99" + dependencies: + "@swc/core-darwin-arm64": "npm:1.3.99" + "@swc/core-darwin-x64": "npm:1.3.99" + "@swc/core-linux-arm64-gnu": "npm:1.3.99" + "@swc/core-linux-arm64-musl": "npm:1.3.99" + "@swc/core-linux-x64-gnu": "npm:1.3.99" + "@swc/core-linux-x64-musl": "npm:1.3.99" + "@swc/core-win32-arm64-msvc": "npm:1.3.99" + "@swc/core-win32-ia32-msvc": "npm:1.3.99" + "@swc/core-win32-x64-msvc": "npm:1.3.99" "@swc/counter": "npm:^0.1.1" "@swc/types": "npm:^0.1.5" peerDependencies: @@ -8209,8 +7851,6 @@ __metadata: optional: true "@swc/core-darwin-x64": optional: true - "@swc/core-linux-arm-gnueabihf": - optional: true "@swc/core-linux-arm64-gnu": optional: true "@swc/core-linux-arm64-musl": @@ -8228,7 +7868,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 1b2b2fd400d476a073d69aa4a7eba754f9388c2d72e123a5fb942291c65e5c6a186302c6daafdb68121be999c604de8f01b8ff58126614e0a4e7ca5af6c9cfc7 + checksum: ff009b70e74f4f66deba7d8967196d32f374e94c8f4e44b077ff082f5adafd1268caed739040153bb79ca27114d0cca8795bce4af6fa986d645a3ff9acf24e4b languageName: node linkType: hard @@ -8326,10 +7966,10 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.1.2, @testing-library/jest-dom@npm:^6.1.3": - version: 6.1.3 - resolution: "@testing-library/jest-dom@npm:6.1.3" + version: 6.1.4 + resolution: "@testing-library/jest-dom@npm:6.1.4" dependencies: - "@adobe/css-tools": "npm:^4.3.0" + "@adobe/css-tools": "npm:^4.3.1" "@babel/runtime": "npm:^7.9.2" aria-query: "npm:^5.0.0" chalk: "npm:^3.0.0" @@ -8351,7 +7991,7 @@ __metadata: optional: true vitest: optional: true - checksum: 544e01939d3c14a3d44ae2e2bb9fe2a0cb5a9e4992ca2728f41188fb9fb2d56e25f1a2e1c12000be2a94d8da36cb220b24020e1b5c5c4c4bede9058a0d80583d + checksum: 2e23f120613fd8ae6d5169bbc94f1a2e4c82b07182057dc94db8ec54ebf32555833442e6c43a187e59715d83704ffb5df49ba88a71f6f32d2683f3d95ba721c7 languageName: node linkType: hard @@ -8368,14 +8008,26 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^13.2.1": - version: 13.5.0 - resolution: "@testing-library/user-event@npm:13.5.0" +"@testing-library/react@npm:^14.0.0": + version: 14.1.2 + resolution: "@testing-library/react@npm:14.1.2" dependencies: "@babel/runtime": "npm:^7.12.5" + "@testing-library/dom": "npm:^9.0.0" + "@types/react-dom": "npm:^18.0.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: b5b0990d3aa0ea8b37c55804e0d5d584fc638a5c7d4df90da9a0fdb00bc981b27b6991468b2dc719982a5d0b0107a41596063ce51ad519eeab47b22bc04d6779 + languageName: node + linkType: hard + +"@testing-library/user-event@npm:14.3.0": + version: 14.3.0 + resolution: "@testing-library/user-event@npm:14.3.0" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: ff57edaeab31322c80c3f01d55404b4cebb907b9ec7672b96a1a14d053f172046b01c5f27b45677927ebee8ed91bce695a7d09edec9a48875cfacabe39d0426a + checksum: 8a0e708709f2510287568dff668bc7d6f5c4e7e17407452b7aa0fcf74732dccf511c63fc76ac514d753cb1f0586c1def59ba7f5245a9523715d37a8f198745d3 languageName: node linkType: hard @@ -8464,83 +8116,83 @@ __metadata: linkType: hard "@types/aria-query@npm:^5.0.1": - version: 5.0.2 - resolution: "@types/aria-query@npm:5.0.2" - checksum: 74579b9e3f7f5042e8a05ab103dd652e724a556a5700fab778c76c53729635b73da5d242143df1fb9447e607f904cbd81871dd2b876f0974831a794165287b20 + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 languageName: node linkType: hard "@types/babel__core@npm:^7, @types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.1.7, @types/babel__core@npm:^7.18.0": - version: 7.20.3 - resolution: "@types/babel__core@npm:7.20.3" + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" dependencies: "@babel/parser": "npm:^7.20.7" "@babel/types": "npm:^7.20.7" "@types/babel__generator": "npm:*" "@types/babel__template": "npm:*" "@types/babel__traverse": "npm:*" - checksum: 5b5f9de4df7f995c2f06f3fdad39b58bc30121d1f2daceb97dd423c9b5dcbd5c464959338824e0dbee0c758bf55c4e9fe46fafd13bd29c1834afad04f291c588 + checksum: bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff languageName: node linkType: hard "@types/babel__generator@npm:*": - version: 7.6.6 - resolution: "@types/babel__generator@npm:7.6.6" + version: 7.6.7 + resolution: "@types/babel__generator@npm:7.6.7" dependencies: "@babel/types": "npm:^7.0.0" - checksum: 214d8b170e0eb04282d0e9dfda2c27116f64751729479786c2bf1b7ec22a5e9e5bbeb70585f047b0fd580d7d8948dc2108223c5a16e998d9674de0582d4e23d7 + checksum: 2427203864ef231857e102eeb32b731a419164863983119cdd4dac9f1503c2831eb4262d05ade95d4574aa410b94c16e54e36a616758452f685a34881f4596d9 languageName: node linkType: hard "@types/babel__plugin-transform-runtime@npm:^7": - version: 7.9.4 - resolution: "@types/babel__plugin-transform-runtime@npm:7.9.4" - checksum: efbcbae29f5401733ef1ac70dd5c7c3347cf4ce8d6b886ff57cfef331d29754b5436654ab7a360b1576d9672614b624f4b4081c92222559f6d3b461d3efd7f7c + version: 7.9.5 + resolution: "@types/babel__plugin-transform-runtime@npm:7.9.5" + checksum: 119d8f88188c63eb21bf150d294991d3470e6aa90dc8ec9f634197760af8acc981564e29af9087bfa8ad713b5b5419cae03047cd225fccb9977bb97adf25a871 languageName: node linkType: hard "@types/babel__preset-env@npm:^7": - version: 7.9.4 - resolution: "@types/babel__preset-env@npm:7.9.4" - checksum: 13a0a6800c24070009728aedef26dfa084029f1ea83ec894e127a5def38cce70f2c56515af6fee5e42034362ba2732d264c3804db35f9c90e7f2f89b3bf66a1d + version: 7.9.6 + resolution: "@types/babel__preset-env@npm:7.9.6" + checksum: 639bcf58094530eb8509b302de9c42fc1a9e44e236bcbfd218e987aba7a2c15052c3a1cac7ca7f260255e74beb3b489ff877b9870f8587394457cd3aa9f64934 languageName: node linkType: hard "@types/babel__template@npm:*": - version: 7.4.3 - resolution: "@types/babel__template@npm:7.4.3" + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" dependencies: "@babel/parser": "npm:^7.1.0" "@babel/types": "npm:^7.0.0" - checksum: f989bd918e1ebfcc6e68c72a3818b7518049673c4e7ba31b11c10d5d3064261c534f3d2f3097f82f80d5fc58f56f3633c21ddf0332552a926a488c105d042c45 + checksum: cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b languageName: node linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6, @types/babel__traverse@npm:^7.18.0": - version: 7.20.3 - resolution: "@types/babel__traverse@npm:7.20.3" + version: 7.20.4 + resolution: "@types/babel__traverse@npm:7.20.4" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 295ed9b837e62e17ee43be0df45d90fff5208986bd43af593c9020d152d3b2c55328e038c2f8585926b63cc22f887f28bf3f4c805aa881e2dd0bdd5ead92ece0 + checksum: e76cb4974c7740fd61311152dc497e7b05c1c46ba554aab875544ab0a7457f343cafcad34ba8fb2ff543ab0e012ef2d3fa0c13f1a4e9a4cd9c4c703c7a2a8d62 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.3 - resolution: "@types/body-parser@npm:1.19.3" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: "@types/connect": "npm:*" "@types/node": "npm:*" - checksum: d35f76406232ee68b02b4b37b4b63cce26329f4302f55c19d5f4fd346f5b7df0994af486331849c4992567d83ded10f5beb3e200280c2142f53e0424f1565082 + checksum: aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df languageName: node linkType: hard "@types/bonjour@npm:^3.5.9": - version: 3.5.11 - resolution: "@types/bonjour@npm:3.5.11" + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" dependencies: "@types/node": "npm:*" - checksum: 963b8260708186981b6fc75fcdbf1ab95bd83ec0472c1b9649c635bdf260d2af94c2930c1a08f97c9d6e370a14737a697e05e10796f29c2a8d81f7f0a80a8ed0 + checksum: eebedbca185ac3c39dd5992ef18d9e2a9f99e7f3c2f52f5561f90e9ed482c5d224c7962db95362712f580ed5713264e777a98d8f0bd8747f4eadf62937baed16 languageName: node linkType: hard @@ -8557,87 +8209,78 @@ __metadata: linkType: hard "@types/chai@npm:^4": - version: 4.3.6 - resolution: "@types/chai@npm:4.3.6" - checksum: 388af382b11453a69808800479dcaff0323a0d1e15df1619175ebd55b294d716d560058f560ed55434e8846af46f017d7d78544822571f6322d3fac6d5f8a29d - languageName: node - linkType: hard - -"@types/cheerio@npm:^0.22.22": - version: 0.22.32 - resolution: "@types/cheerio@npm:0.22.32" - dependencies: - "@types/node": "npm:*" - checksum: 02c64de8e198e9bb2b162c3d426a00df8b558730df84bebf7d586cf23493043217f0dc81efabc13b32589839a82a974f02ade618ecdd7c528c3b574cf95bff97 + version: 4.3.11 + resolution: "@types/chai@npm:4.3.11" + checksum: 0c216ac4a19bfbf8318bb104d32e50704ee2ffc4b538b976c4326e6638fee121462402caa570662227a2a218810388aadb14bdbd3d3d474ec300b00695db448a languageName: node linkType: hard "@types/color-convert@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/color-convert@npm:2.0.1" + version: 2.0.3 + resolution: "@types/color-convert@npm:2.0.3" dependencies: "@types/color-name": "npm:*" - checksum: 53eed9d08ee8211e881cf30e5950f32202825f4233bf0411bdeacc2908f7b64b79b5c1dd4ed9748c9deeb4334dccd37d415758736863900cd1e63dac18c62b7e + checksum: a5870547660f426cddd76b54e942703e29c3b43fc26b1ba567e10b9707d144b7d8863e0af7affd9c3391815c06582571f43835c71ede270a6c58949155d18b77 languageName: node linkType: hard "@types/color-name@npm:*": - version: 1.1.1 - resolution: "@types/color-name@npm:1.1.1" - checksum: 2abeac8d8d833e0622c66f21487cc8b522792abb2eff2e40df0e3e53261728cb65bab590edf24953eb8d8653ec88044dc801d9a4e58c489a0f10c025de522868 + version: 1.1.3 + resolution: "@types/color-name@npm:1.1.3" + checksum: caea7b6446623acdbf38138a8d4416b0363314784d82b13f3e3fa29f2070bc5630f674f2c953edac5f1c9710f3302328abf912b32de5b6e799d3bdb149269fbc languageName: node linkType: hard "@types/compression@npm:^1.7.0": - version: 1.7.3 - resolution: "@types/compression@npm:1.7.3" + version: 1.7.5 + resolution: "@types/compression@npm:1.7.5" dependencies: "@types/express": "npm:*" - checksum: c6f7353ddb97193692bf31aad15fb27fd730081643f347d897b0451cd54ab2d2fce1973f1eed40548be1dde79d61f12966d35129e9cfd6392f4f78e8b09d0153 + checksum: 3818f3d10cede38a835b40b80c341eae162aef1691f2e8f81178a77dbc109f04234cf760b6066eaa06ecbb1da143433c00db2fd9999198b76cd5a193e1d09675 languageName: node linkType: hard "@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.1 - resolution: "@types/connect-history-api-fallback@npm:1.5.1" + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: "@types/express-serve-static-core": "npm:*" "@types/node": "npm:*" - checksum: 306e19429a404625ea8bee2043e67b1222ccf46cf25846d580074519bfead6839f38fe8c710e45ea66e3e39b4ed0ebe8d0e506098d31ce078711bc94fae990f2 + checksum: 1b4035b627dcd714b05a22557f942e24a57ca48e7377dde0d2f86313fe685bc0a6566512a73257a55b5665b96c3041fb29228ac93331d8133011716215de8244 languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.36 - resolution: "@types/connect@npm:3.4.36" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: "@types/node": "npm:*" - checksum: 0dd8fcf576e178e69cbc00d47be69d3198dca4d86734a00fc55de0df147982e0a5f34592117571c5979e92ce8f3e0596e31aa454496db8a43ab90c5ab1068f40 + checksum: 2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c languageName: node linkType: hard "@types/cross-spawn@npm:^6.0.2": - version: 6.0.3 - resolution: "@types/cross-spawn@npm:6.0.3" + version: 6.0.6 + resolution: "@types/cross-spawn@npm:6.0.6" dependencies: "@types/node": "npm:*" - checksum: a8de3fed3e9cacf8ee50e49139ef40b3fd03ee3c135140bdfc1536c00c38bd26c435be885c5facc97404be2e17b7c088fa588b43d6e974bab20cdb0e53ec6c9c + checksum: e3d476bb6b3a54a8934a97fe6ee4bd13e2e5eb29073929a4be76a52466602ffaea420b20774ffe8503f9fa24f3ae34817e95e7f625689fb0d1c10404f5b2889c languageName: node linkType: hard "@types/debug@npm:^4.0.0": - version: 4.1.9 - resolution: "@types/debug@npm:4.1.9" + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" dependencies: "@types/ms": "npm:*" - checksum: 8b550c47c70cc1af9a58e5c572f2418f30bface5bf5d5afa0d938923978f40be4c55646f1ab260f6f1492ca6ab065d447de23cb3b30d7b38597c2cbf89f4cb21 + checksum: 5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f languageName: node linkType: hard "@types/detect-port@npm:^1.3.0": - version: 1.3.3 - resolution: "@types/detect-port@npm:1.3.3" - checksum: 27c8000e3d41fd1158e2213b31c90b63852299ed66e4604b028a7146519530ab129b8ff867db02b06a32f61e7764f8d5aff0c44c5f543ce2b4b035e5968b62e1 + version: 1.3.5 + resolution: "@types/detect-port@npm:1.3.5" + checksum: d8dd9d0e643106a2263f530b24ffdc3409d9391c50fc5e404018ba3633947aa3777db7fb094aeb0f49a13cc998aae8889747ad9edaa02b13a2de2385f37106ef languageName: node linkType: hard @@ -8648,24 +8291,24 @@ __metadata: languageName: node linkType: hard -"@types/doctrine@npm:^0.0.8": - version: 0.0.8 - resolution: "@types/doctrine@npm:0.0.8" - checksum: ca4cab4a94526ec3579c3f10a027298028d34b4c092e4b6791afb37a5f6899208ee1e91bc9542541f31d6d3ba3d1a70408deaa1f105c22c86d23e3a87c59a43c +"@types/doctrine@npm:^0.0.9": + version: 0.0.9 + resolution: "@types/doctrine@npm:0.0.9" + checksum: cdaca493f13c321cf0cacd1973efc0ae74569633145d9e6fc1128f32217a6968c33bea1f858275239fe90c98f3be57ec8f452b416a9ff48b8e8c1098b20fa51c languageName: node linkType: hard "@types/ejs@npm:^3.1.1": - version: 3.1.3 - resolution: "@types/ejs@npm:3.1.3" - checksum: 8366861c80749a0231f58a258f1fc9ab43992e6b74d157d1fd199f273f2f7d9f016f64d61a6d899a77d86d49c2a4a569215deda899dcf2dbfef85e12d26b9715 + version: 3.1.5 + resolution: "@types/ejs@npm:3.1.5" + checksum: 13d994cf0323d7e0ad33b9384914ccd3b4cd8bf282eced3649b1621b66ee7c784ac2d120a9d7b1f43d6f873518248fb8c3221b06a649b847860b9c2389a0b0ed languageName: node linkType: hard "@types/emscripten@npm:^1.39.6": - version: 1.39.8 - resolution: "@types/emscripten@npm:1.39.8" - checksum: a2cc8ddb734b0cbead13c9d4b7733da07655529bdfbcd8a858067bd6b97f2b622935526a6d6ee5c9c5495d50854d608e34ad9a4e09700858d7b9418799e33197 + version: 1.39.10 + resolution: "@types/emscripten@npm:1.39.10" + checksum: c9adde9307d54efb5152931bfe99966fbe12fbd4d07663fb5cdc4cc1bd3a1f030882d50d4a27875b7b2d9713d160609e67b72e92177a021c9f4699ee5ac41035 languageName: node linkType: hard @@ -8677,38 +8320,38 @@ __metadata: linkType: hard "@types/eslint-scope@npm:^3.7.3": - version: 3.7.5 - resolution: "@types/eslint-scope@npm:3.7.5" + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" dependencies: "@types/eslint": "npm:*" "@types/estree": "npm:*" - checksum: 9ade676030067a14d34acb4a48362bcf16632e867d059e734cf082e0523362415ed698e3776f8fad7e346019078d63a5264992b33054182607ce20ad9eaeec80 + checksum: a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc languageName: node linkType: hard "@types/eslint@npm:*": - version: 8.44.3 - resolution: "@types/eslint@npm:8.44.3" + version: 8.44.7 + resolution: "@types/eslint@npm:8.44.7" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: d9d681efe461ec8934800a89773be251a200c9d4528ca2330bb99f4ca3bd6b2d053034d2b5fe645a1567331af2c89e364aed4be8c839f10a1028a3cbe2856b01 + checksum: 447b55ccff47668fc63466728e7e598ae16a03de8d489350e855b6020ad16f58a703e75b875376dd6cd5fcab630311a805fa7f934476637ea35819f01c9db3ca languageName: node linkType: hard "@types/estree-jsx@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/estree-jsx@npm:1.0.1" + version: 1.0.3 + resolution: "@types/estree-jsx@npm:1.0.3" dependencies: "@types/estree": "npm:*" - checksum: 3aa4d648ba3ddffa73eff63904a4ef7f78fc78c2fc22ad0ef80908e7e5839e4622dc8d8dc46708b07a6e732e72692cf234db63650c3ca608cc5b41c3e81f37a2 + checksum: 41742a7b0874f63e61396d87a46d3ca531850a0e2cd7cec304339b8df439b6371d5e8758f34de9b5d9e940486ea21305b2f74cb420754838ecdfdaba918afc66 languageName: node linkType: hard "@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.1": - version: 1.0.2 - resolution: "@types/estree@npm:1.0.2" - checksum: 4b5c601d435ea8e2205458de15fd1556b5ae6c9a8323bad8a940ea502d6c824664faca94234c0bf76bf9c87cbf6ac41abee550c9e20433256549d589c9b543bd + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d languageName: node linkType: hard @@ -8720,26 +8363,26 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.37 - resolution: "@types/express-serve-static-core@npm:4.17.37" + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 45487318802d9c44aac4323b9f5b33c24bb37c0258a5984c8ffe2b57f1bfc5b8ebbdc47149d6ce1b9e47e39b6cc4d1ef4468903a339990bfb8eac7995392f19f + checksum: dc166cbf4475c00a81fbcab120bf7477c527184be11ae149df7f26d9c1082114c68f8d387a2926fe80291b06477c8bbd9231ff4f5775de328e887695aefce269 languageName: node linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.11, @types/express@npm:^4.17.13, @types/express@npm:^4.7.0": - version: 4.17.18 - resolution: "@types/express@npm:4.17.18" + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" "@types/serve-static": "npm:*" - checksum: 6babf7bce6abdd45138f7eac058c8705dbd3a2857208c8c78d863fcd8b3b212c6569fba1f748137e5743287f82dfecf9bc4d78d31d290afff2d37700a0cdb6fe + checksum: 12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf languageName: node linkType: hard @@ -8751,12 +8394,12 @@ __metadata: linkType: hard "@types/fs-extra@npm:^11.0.1": - version: 11.0.2 - resolution: "@types/fs-extra@npm:11.0.2" + version: 11.0.4 + resolution: "@types/fs-extra@npm:11.0.4" dependencies: "@types/jsonfile": "npm:*" "@types/node": "npm:*" - checksum: 8ab94988a3376169e3daf0a546b5312039c19a7f1fb9c5a171f7602c9398155a90c0cef81ab95273e4c8c5962ab4ec280f0a1ba8e874bab2f26ca94b282c14a3 + checksum: 9e34f9b24ea464f3c0b18c3f8a82aefc36dc524cc720fc2b886e5465abc66486ff4e439ea3fb2c0acebf91f6d3f74e514f9983b1f02d4243706bdbb7511796ad languageName: node linkType: hard @@ -8778,17 +8421,7 @@ __metadata: languageName: node linkType: hard -"@types/glob@npm:*": - version: 8.1.0 - resolution: "@types/glob@npm:8.1.0" - dependencies: - "@types/minimatch": "npm:^5.1.2" - "@types/node": "npm:*" - checksum: ded07aa0d7a1caf3c47b85e262be82989ccd7933b4a14712b79c82fd45a239249811d9fc3a135b3e9457afa163e74a297033d7245b0dc63cd3d032f3906b053f - languageName: node - linkType: hard - -"@types/glob@npm:^7.1.1, @types/glob@npm:^7.1.3": +"@types/glob@npm:*, @types/glob@npm:^7.1.1, @types/glob@npm:^7.1.3": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" dependencies: @@ -8799,30 +8432,30 @@ __metadata: linkType: hard "@types/graceful-fs@npm:^4.1.3": - version: 4.1.7 - resolution: "@types/graceful-fs@npm:4.1.7" + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" dependencies: "@types/node": "npm:*" - checksum: a8c04a250cb40207b15097b33c053f5ecf4352f5107c0a2635f674dae8c9a90b28dc9bd6e28307d5aab0b5d3853e713de42110a149a6e303626915047134e87d + checksum: 235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b languageName: node linkType: hard "@types/hast@npm:^2.0.0": - version: 2.3.6 - resolution: "@types/hast@npm:2.3.6" + version: 2.3.8 + resolution: "@types/hast@npm:2.3.8" dependencies: "@types/unist": "npm:^2" - checksum: e44fa492f9ae8a0e499a738b598fc50c6cfa8131f2758ed98f292fbe67e37f4e85edb1aa53b27450bdafcf4e52c1a9660df0478914199c058193d9cffdc7d93c + checksum: 0b358a65135922df8465f5daabed08602afc9098cf9065439f2fa46a5757d1630c88c4ad208b9ff0114bed95d468a75eeed49a099615096a9ad3bb1a85d8a3a1 languageName: node linkType: hard "@types/hoist-non-react-statics@npm:^3.3.1": - version: 3.3.2 - resolution: "@types/hoist-non-react-statics@npm:3.3.2" + version: 3.3.5 + resolution: "@types/hoist-non-react-statics@npm:3.3.5" dependencies: "@types/react": "npm:*" hoist-non-react-statics: "npm:^3.3.0" - checksum: 2aaff564e7674b0b7389592f30e4681919a0a71986bc5d8c5ef67d9b5b3b46913920f5002a96fd37d8904fe5c0cc1e4cc5c92884c847b2f4a74cb30d841494d4 + checksum: 2a3b64bf3d9817d7830afa60ee314493c475fb09570a64e7737084cd482d2177ebdddf888ce837350bac51741278b077683facc9541f052d4bbe8487b4e3e618 languageName: node linkType: hard @@ -8834,93 +8467,72 @@ __metadata: linkType: hard "@types/http-cache-semantics@npm:*": - version: 4.0.2 - resolution: "@types/http-cache-semantics@npm:4.0.2" - checksum: 975258beba5a6ce446b67f9bf905385d8d44cecad54d839208e86018b0fe4a517c62ec7a169ec64ed454363628def75446fa09d99755f3797f213b596477fe97 + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 languageName: node linkType: hard "@types/http-errors@npm:*": - version: 2.0.2 - resolution: "@types/http-errors@npm:2.0.2" - checksum: ecedc65091baf7c83e0e61e7d1992112e0fa09461d69004747f55c80b801b796bdb60161e54efdac8a720b5f78a54720b0cabde3ae7094103a552d5c189222ce + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 languageName: node linkType: hard "@types/http-proxy@npm:^1.17.8": - version: 1.17.12 - resolution: "@types/http-proxy@npm:1.17.12" + version: 1.17.14 + resolution: "@types/http-proxy@npm:1.17.14" dependencies: "@types/node": "npm:*" - checksum: 06719371ece6bdf9fd28b90b03bd56e48ffca675dfaadca81ae12ca18db6e77e70a509537ebfa3b2c37810d77dc52e5a3190c09bc490668dde7e384c7b579090 + checksum: c4bffd87be9aff7e879c05bd2c28716220e0eb39788e3f8d314eee665324ad8f5f0919041cbd710254d553cd9cea023f8b776d4b1ec31d2188eac60af18c3022 languageName: node linkType: hard "@types/ip@npm:^1.1.0": - version: 1.1.1 - resolution: "@types/ip@npm:1.1.1" + version: 1.1.3 + resolution: "@types/ip@npm:1.1.3" dependencies: "@types/node": "npm:*" - checksum: cabb35bfb4255805e282f8b4b26c0cdca04a0d05016fe5c0a676aabadd1065c461bff5fdf4fca01041c7589cca10202865b1e6b02e505e569928b139353d7dfc + checksum: af576e33830196be01b71c48ad5f83380a1c51d62f394a5601e8c2a5b8b31cf6dc8fe71ac39c38d806bcf1d6f1c5c8205c129eca6b6d168c0df7ab3722df23b9 languageName: node linkType: hard "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: af5f6b64e788331ed3f7b2e2613cb6ca659c58b8500be94bbda8c995ad3da9216c006f1cfe6f66b321c39392b1bda18b16e63cef090a77d24a00b4bd5ba3b018 + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 languageName: node linkType: hard "@types/istanbul-lib-report@npm:*": - version: 3.0.1 - resolution: "@types/istanbul-lib-report@npm:3.0.1" + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" dependencies: "@types/istanbul-lib-coverage": "npm:*" - checksum: a2a002ee7ecd9079a2c06235d28d1bc77089c3d834eec7e6dac38986203634936f2a017812624acfbedabec4bddd933942f14ac93eba2dc57f581ad4f35bbf1d + checksum: 247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c languageName: node linkType: hard "@types/istanbul-reports@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/istanbul-reports@npm:3.0.2" + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: "@types/istanbul-lib-report": "npm:*" - checksum: df6c9e6865006be06bae29f63d5240b96bc7041b18a8c6d66be5b5d92ef5c95675c7a605a603029065f4f8aece7dba7360349e9d0543f512417e64a707a3c4fa - languageName: node - linkType: hard - -"@types/jest-image-snapshot@npm:^6.0.0": - version: 6.2.1 - resolution: "@types/jest-image-snapshot@npm:6.2.1" - dependencies: - "@types/jest": "npm:*" - "@types/pixelmatch": "npm:*" - ssim.js: "npm:^3.1.1" - checksum: d7bb16f2680e9b3f828f86effc9a8fee0e3d118c6138d537dfb3383333606d5dd765a5de3c1f4bd7ae6d2cc0e0528ee8aee055d66ef1d811719afbd6168ff616 + checksum: 1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee languageName: node linkType: hard "@types/jest-specific-snapshot@npm:^0.5.6": - version: 0.5.7 - resolution: "@types/jest-specific-snapshot@npm:0.5.7" + version: 0.5.9 + resolution: "@types/jest-specific-snapshot@npm:0.5.9" dependencies: "@types/jest": "npm:*" - checksum: ad18f3c6e55a533f9d9b04ae99dfdae6e6d0b5c936f348b5280325ced1c35ccf94ce629a71c3116785bb041d0192c22630d38ed30f13849fe9310935e6224fb8 - languageName: node - linkType: hard - -"@types/jest@npm:*": - version: 29.5.5 - resolution: "@types/jest@npm:29.5.5" - dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 0a3481f119099e6a0a381fec0d410cd33241267a0981576a7a832687fc3f888f79285289dc7c054c3589fd443f7ed1598d25fa7bc9708491b58da17e423b4aff + checksum: b987c7951532aa6399ef043468c2c4fae6345c1434261f03b2c501c91581f997569aafed56c67c6cc77ac7d907db003d05ae4314e6b43f6d137ea539d83484d5 languageName: node linkType: hard -"@types/jest@npm:28.1.3": +"@types/jest@npm:*, @types/jest@npm:28.1.3": version: 28.1.3 resolution: "@types/jest@npm:28.1.3" dependencies: @@ -8931,19 +8543,19 @@ __metadata: linkType: hard "@types/js-yaml@npm:^4.0.5": - version: 4.0.6 - resolution: "@types/js-yaml@npm:4.0.6" - checksum: e2e3ccdde9979973ea0afc357e753ddcd1a586cfccfeafcf5c17ab1ea3314c73faf7555d0af4da237c0c32c29cd4bc0f6a659a5e5085fe3f1fdc94d20fb19683 + version: 4.0.9 + resolution: "@types/js-yaml@npm:4.0.9" + checksum: 24de857aa8d61526bbfbbaa383aa538283ad17363fcd5bb5148e2c7f604547db36646440e739d78241ed008702a8920665d1add5618687b6743858fae00da211 languageName: node linkType: hard "@types/jscodeshift@npm:^0.11.10": - version: 0.11.10 - resolution: "@types/jscodeshift@npm:0.11.10" + version: 0.11.11 + resolution: "@types/jscodeshift@npm:0.11.11" dependencies: ast-types: "npm:^0.14.1" recast: "npm:^0.20.3" - checksum: 1d477ea1addd62a5949f028ef16bac3226341d65052e4f51d61e51789c6c7aa17e953dac34eb6d1e5a2b761fc4c7920df875e20e85cdf4122fc08836e7da547a + checksum: b3d2be46d523ae679a2c986d7f98232aabaa761c960423105286bfd682fb57f9366f6afed1e1d6b35e4923b7e038c0aa539032d7e7fd430754683078032cd578 languageName: node linkType: hard @@ -8959,9 +8571,9 @@ __metadata: linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 446fe6722899333ff647b5853fdcc9f039156d56abe517166154d3578d641841cc869f61e8b7822c24a1daeb7dfbd4fdcea84bf07c0858e2f9cca415e2ca8dd4 + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard @@ -8973,11 +8585,11 @@ __metadata: linkType: hard "@types/jsonfile@npm:*": - version: 6.1.2 - resolution: "@types/jsonfile@npm:6.1.2" + version: 6.1.4 + resolution: "@types/jsonfile@npm:6.1.4" dependencies: "@types/node": "npm:*" - checksum: c2943f9bfa7867b33fb362b88a932efdc00e9e5f2762b6ef912617cb0a3e3221a98920f8976a4cf817aa576e03d28a25391236e9644e2ebe648081b08df62ef5 + checksum: b12d068b021e4078f6ac4441353965769be87acf15326173e2aea9f3bf8ead41bd0ad29421df5bbeb0123ec3fc02eb0a734481d52903704a1454a1845896b9eb languageName: node linkType: hard @@ -8991,60 +8603,53 @@ __metadata: linkType: hard "@types/loader-utils@npm:^2.0.5": - version: 2.0.5 - resolution: "@types/loader-utils@npm:2.0.5" + version: 2.0.6 + resolution: "@types/loader-utils@npm:2.0.6" dependencies: "@types/node": "npm:*" "@types/webpack": "npm:^4" - checksum: cea54ca7c1b220ddaf281dd5420bea52ceef3150e6fe0708c4a5793a1ac61c478355178c23479eb84c1d2667235156dc2b13dbc377646ed08055f3d552354e4f + checksum: df178981861ef09f0618eae4aa865b81ed3f2c4ab1359711fe6077236f57dee31fb94f1de9bd156d0a3d252eb95da01c424f9fa822aeaf7e3057bc082bb4bda7 languageName: node linkType: hard "@types/lodash@npm:^4.14.167": - version: 4.14.199 - resolution: "@types/lodash@npm:4.14.199" - checksum: a7168a0a2a7c9e8801aa95f92b02f9d664ee938a5186d73f77a3a8447f475bbadedc1f7f746ffd2530ae34069d232bf25f4f4414077f0d81c71489e34e59173e + version: 4.14.202 + resolution: "@types/lodash@npm:4.14.202" + checksum: 6064d43c8f454170841bd67c8266cc9069d9e570a72ca63f06bceb484cb4a3ee60c9c1f305c1b9e3a87826049fd41124b8ef265c4dd08b00f6766609c7fe9973 languageName: node linkType: hard "@types/mdast@npm:^3.0.0": - version: 3.0.13 - resolution: "@types/mdast@npm:3.0.13" + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" dependencies: "@types/unist": "npm:^2" - checksum: b328d1622075a67db1d8eac78dcbd55aefb4adaf63206b58abfce902c0ce5232a2674bd0bf961696c9a3765d5fcf145378ce03075bd1690a25adc617650f1228 + checksum: fcbf716c03d1ed5465deca60862e9691414f9c43597c288c7d2aefbe274552e1bbd7aeee91b88a02597e88a28c139c57863d0126fcf8416a95fdc681d054ee3d languageName: node linkType: hard "@types/mdx@npm:^2.0.0": - version: 2.0.8 - resolution: "@types/mdx@npm:2.0.8" - checksum: 6ee0e54d886afcbc2547f1db73ac9de60603ce26592e21f5fff2ba2791f6c58d3eb7b849add8f6b8b9c10f7c8ff3855d29fe7122f532f2f64fce95fe5b8e23ef - languageName: node - linkType: hard - -"@types/mime-types@npm:^2.1.0": - version: 2.1.2 - resolution: "@types/mime-types@npm:2.1.2" - checksum: aab18eefbcd759908968958eeee6483d8559178d0a3510ca8da692b43f0d98afc8956270623586c6301165a3bd2dcbd9847a8c4d1ea1711de25bb5395686d2a3 + version: 2.0.10 + resolution: "@types/mdx@npm:2.0.10" + checksum: a2a5d71967c44c650e883eaaeb61db9c0758b9c1d675e04b7a3cfeeaee6efd5044dc9c78d780aa3fe408a2f85680bf3b723c92a1772bb6c2da35ef346d766de2 languageName: node linkType: hard "@types/mime@npm:*": - version: 3.0.2 - resolution: "@types/mime@npm:3.0.2" - checksum: 7eef33033d9990881626611ef87d0dbb06ebff96a7ee09303874389eb482acd0fbf20fe2dc96edb861095e42e6c18d5df8476840131f9c06c57be6f1c1dc77fe + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: db478bc0f99e40f7b3e01d356a9bdf7817060808a294978111340317bcd80ca35382855578c5b60fbc84ae449674bd9bb38427b18417e1f8f19e4f72f8b242cd languageName: node linkType: hard "@types/mime@npm:^1": - version: 1.3.3 - resolution: "@types/mime@npm:1.3.3" - checksum: 56c9981b637154721753d38888c2cba85f8891a16e0f1cb1286dcbd741b220ff56d99aa2be03bf7fe88b188a27e32bf1d92976dafd6574b8f345bbf0853d462c + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc languageName: node linkType: hard -"@types/minimatch@npm:*, @types/minimatch@npm:^5.1.2": +"@types/minimatch@npm:*": version: 5.1.2 resolution: "@types/minimatch@npm:5.1.2" checksum: 83cf1c11748891b714e129de0585af4c55dd4c2cafb1f1d5233d79246e5e1e19d1b5ad9e8db449667b3ffa2b6c80125c429dbee1054e9efb45758dbc4e118562 @@ -9059,35 +8664,46 @@ __metadata: linkType: hard "@types/mock-fs@npm:^4.13.1": - version: 4.13.2 - resolution: "@types/mock-fs@npm:4.13.2" + version: 4.13.4 + resolution: "@types/mock-fs@npm:4.13.4" dependencies: "@types/node": "npm:*" - checksum: c589d8ba674e9d2279c6321841ee5b4e9ba3138a8790cbe2a61ea1da1e9d254188ef9f1a2f66539b225aaebcd56f746551f4723de24afc0c430d9e7c68344a7b + checksum: 687c8e36d91031529924fd89011b7a87167ea33a1b92a9d845f0feb1a5157f168412c62ee308e57b9a71fd938197b4c71ca1784eb44e8a7cbdd816011ffd7f65 languageName: node linkType: hard "@types/ms@npm:*": - version: 0.7.32 - resolution: "@types/ms@npm:0.7.32" - checksum: 16f60d0a2485edfa459e9570aec9135d9ef08dd855630754063f3baf1d1df7a5edd0f249ff9b460a33842181250f51b27b35078b83cf6ec1dccabb4485de19d6 + version: 0.7.34 + resolution: "@types/ms@npm:0.7.34" + checksum: ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc languageName: node linkType: hard "@types/node-fetch@npm:^2.5.7, @types/node-fetch@npm:^2.6.4": - version: 2.6.6 - resolution: "@types/node-fetch@npm:2.6.6" + version: 2.6.9 + resolution: "@types/node-fetch@npm:2.6.9" dependencies: "@types/node": "npm:*" form-data: "npm:^4.0.0" - checksum: fce52a0b65f4cb9e5059c9b3250682c8f0f0c2ce1d1a18b5bbc61b5fbf5f320b76d42b4dfa5c0567fe0704bdf0c0397527008efcb0749859aaaff8c51b6ed6c1 + checksum: b15b6d518ea4dd4a21cf328e9df0a88b2e5b76f3455ddfeb9063a3b97087c50b15ab195a869dadbbeb09d08dcc915557fb6a4f72b4fe79ee42e215fce3d9b0db + languageName: node + linkType: hard + +"@types/node-forge@npm:^1.3.0": + version: 1.3.10 + resolution: "@types/node-forge@npm:1.3.10" + dependencies: + "@types/node": "npm:*" + checksum: b190e93e36e3bf5881e099df930645bbeb963c1cabb110948f90e11f5f59a2514d5632e6bd1101dfb839725eab25a8e2eba4a2b1b7551f12bc43302863e050ae languageName: node linkType: hard "@types/node@npm:*, @types/node@npm:>= 8": - version: 20.8.2 - resolution: "@types/node@npm:20.8.2" - checksum: e9952db222dd3e1cca1107d1b2aaec4e93b4af8b4fc32b42dd4fac3719f98c14edb8c591829c972d2f6e2b527bbb34af53608f6a7973f4a7dbd1d3bc929bbe8d + version: 18.18.13 + resolution: "@types/node@npm:18.18.13" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 5f1840f26b4c00e6b4945be678644a46e6689ef10d9d7795d587b76059045b99a14ca6075264296e6e91d73e098fe83df9580881278d9a6ce394b368d9c76700 languageName: node linkType: hard @@ -9099,39 +8715,32 @@ __metadata: linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.2 - resolution: "@types/normalize-package-data@npm:2.4.2" - checksum: e38713ca1befc341701c078d592d1fddc1d13eec73b4d81fbab14638221733029f03cdf410b4486b23d48fd8d3809fa36611de98220e76f71517d42b582b3509 + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 languageName: node linkType: hard "@types/npmlog@npm:^4.1.2": - version: 4.1.4 - resolution: "@types/npmlog@npm:4.1.4" - checksum: 5670c38db51f2c4a5da05657920d7597bf9da00615920b42a001fde9011f05ab1e8ec8cbc671abb47915028e3e0ace5c3d981c23684c202a00bf518f16ece01d + version: 4.1.6 + resolution: "@types/npmlog@npm:4.1.6" + dependencies: + "@types/node": "npm:*" + checksum: 432bfb14b29a383e095e099b2ddff4266051b43bc6c7ea242d10194acde2f1181a1e967bbb543f07979dd77743ead1954abac1128ec78cc2b86a5f7ea841ddcb languageName: node linkType: hard "@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: 1d3012ab2fcdad1ba313e1d065b737578f6506c8958e2a7a5bdbdef517c7e930796cb1599ee067d5dee942fb3a764df64b5eef7e9ae98548d776e86dcffba985 + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 languageName: node linkType: hard "@types/picomatch@npm:^2.3.0": - version: 2.3.1 - resolution: "@types/picomatch@npm:2.3.1" - checksum: 6ab42daf80d315495586bc7f276698395c47e28479cbc79c88ff14c81fd1fb38a76dee9c609dfe591036986b923198f1dab438865ce3583f1d380cac09870b3f - languageName: node - linkType: hard - -"@types/pixelmatch@npm:*": - version: 5.2.4 - resolution: "@types/pixelmatch@npm:5.2.4" - dependencies: - "@types/node": "npm:*" - checksum: 10ce0b806112743237a75f0fcb145cc972cc7934131b971fea375b70fb69c6dc1ee2ba63e77265348c87d69260461ae812cca140412b50e7cd42118944b41e0d + version: 2.3.3 + resolution: "@types/picomatch@npm:2.3.3" + checksum: 5ad7f891eb3e16e8eb1f51615f0b755bc44ac5dff5a1e2513229f307f72e226c917c6b9a829a97134cedbec727036f885890a55b1975b6e3f381b6545b962c4d languageName: node linkType: hard @@ -9150,99 +8759,72 @@ __metadata: linkType: hard "@types/pretty-hrtime@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/pretty-hrtime@npm:1.0.1" - checksum: e990110a3626e987319092c5149d5ea244785b83fbbd8e62605714ec1fa4317a3524ae0b6381cdc2ca92619d9a451b3fe9ff4085c42826f5398e3380d3031bff + version: 1.0.3 + resolution: "@types/pretty-hrtime@npm:1.0.3" + checksum: e4c22475c588be982b398dee9ac0b05b21078bc26581819290a4901c5b269bcaa04cae0e61e012d412e811b0897c9dab316db064208914df2f0ed0960fc5306b languageName: node linkType: hard "@types/prismjs@npm:^1.16.6": - version: 1.26.1 - resolution: "@types/prismjs@npm:1.26.1" - checksum: 74b624bd0def16ba2fe4492ac74422ed9eaf5588814c14d8825c85dd4ef05b900a3685c5ec00bb13991e9f0cc4bbda196b9de3ba75cf7c00bc8ffd960c125124 + version: 1.26.3 + resolution: "@types/prismjs@npm:1.26.3" + checksum: 3e8a64bcf0ab5f9a47ec2590938c5a8a20ac849b4949a95ed96e73e64cb890fc56e9c9b724286914717458267b28405f965709e1b9f80db5d68817a7ce5a18a9 languageName: node linkType: hard "@types/prompts@npm:^2.0.9": - version: 2.4.5 - resolution: "@types/prompts@npm:2.4.5" + version: 2.4.9 + resolution: "@types/prompts@npm:2.4.9" dependencies: "@types/node": "npm:*" kleur: "npm:^3.0.3" - checksum: a2a3e802508db79e4c6bfcab09ddb37e93279152fd127a7f4a8c1e683ee6f5429ce86f70c58eb94b76b19d98e4b6ca53bbb0b375d47b0b8c4ad4ecf178227258 + checksum: 22fe0da6807681c85e88ba283184f4be4c8a95c744ea12a638865c98c4e0c22e7f733542f6b0f1fbca02245cdc3fe84feacf9c9adf4ddd8bc98a337fd679d8d2 languageName: node linkType: hard "@types/prop-types@npm:*": - version: 15.7.8 - resolution: "@types/prop-types@npm:15.7.8" - checksum: 706b3de6faa5c1a4763fc90069f25ddc54108e8b43e9724e22f510b103c418571bf14b34b241fcacd6875650959c8374af7f4633f80ec6e33e7525cb42ef6a30 + version: 15.7.11 + resolution: "@types/prop-types@npm:15.7.11" + checksum: e53423cf9d510515ef8b47ff42f4f1b65a7b7b37c8704e2dbfcb9a60defe0c0e1f3cb1acfdeb466bad44ca938d7c79bffdd51b48ffb659df2432169d0b27a132 languageName: node linkType: hard "@types/pug@npm:^2.0.6": - version: 2.0.7 - resolution: "@types/pug@npm:2.0.7" - checksum: 3d0cf7945f56a2763d0917d63f1ebe9c86eed9bc0b64781d0d5ec842bcdf1779e1065e132300942a1c34fefa87212d877d7fad24a576c4ce52db8fb17c4dcd0e - languageName: node - linkType: hard - -"@types/puppeteer-core@npm:^2.1.0": - version: 2.1.0 - resolution: "@types/puppeteer-core@npm:2.1.0" - dependencies: - "@types/puppeteer": "npm:^2" - checksum: 67e07a59699c636cd86e501deaf880d5bd11b212f823774874f7e21ec7f10e4f1130d42ea6993750b1be1bf2b012a53dda1ecd226a46438c776717d345c847e5 - languageName: node - linkType: hard - -"@types/puppeteer@npm:^2": - version: 2.1.8 - resolution: "@types/puppeteer@npm:2.1.8" - dependencies: - "@types/node": "npm:*" - checksum: bfe9ceb9fd004d1a4a9b260857d92b82dbc2e600b005619b63686ea0eed3cb1db16ea106d26c79c5c29b9e4f32c205d6badbf53c9a013f9f374f8061b5ace2d7 - languageName: node - linkType: hard - -"@types/puppeteer@npm:^5.4.0": - version: 5.4.7 - resolution: "@types/puppeteer@npm:5.4.7" - dependencies: - "@types/node": "npm:*" - checksum: f15bccf30526151c6e42c797b844f24eb7489f0180b391857c8d6902dfa96c7f48730540229a681505ca70e9197cdac0dfbeaca0c2537526358ad5656bef703d + version: 2.0.10 + resolution: "@types/pug@npm:2.0.10" + checksum: 6fac37fd84ad4bcf755061caad274db70591699739070bc30c5c1b5f0aecf98646dc29ec8da11cfca82a2b7cc57d949a3ae50aba2f88bf098751ebdd25d9aaea languageName: node linkType: hard "@types/qs@npm:*, @types/qs@npm:^6, @types/qs@npm:^6.9.5": - version: 6.9.8 - resolution: "@types/qs@npm:6.9.8" - checksum: 336358c279818ecedc0b4f9b29fd5052ff6e05dba3f10bad4534a4624819408d0b4710a4cdf8b58dff948dbdb1ca95a00e237189505ef1abfce0e6341eb18022 + version: 6.9.10 + resolution: "@types/qs@npm:6.9.10" + checksum: 6be12e5f062d1b41eb037d59bf9cb65bc9410cedd5e6da832dfd7c8e2b3f4c91e81c9b90b51811140770e5052c6c4e8361181bd9437ddcd4515dc128b7c00353 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.5 - resolution: "@types/range-parser@npm:1.2.5" - checksum: fe4bbbbfb19f0765ea15e66e2c58e29e04f4e52055c0d348b08dbfb161c2d2a363cc21b8a6071936a0cab3f02d0f5f362a3f752b37b05ff868000dcfe9120581 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c languageName: node linkType: hard -"@types/react-dom@npm:^16.9.14": - version: 16.9.20 - resolution: "@types/react-dom@npm:16.9.20" +"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.0.11": + version: 18.2.17 + resolution: "@types/react-dom@npm:18.2.17" dependencies: - "@types/react": "npm:^16" - checksum: bfcecc8c63f8387ddca0fe277857b462b6cf85b497c5a5df340e695d4100de7b680eb2b269ac4958c65a905ec0d5e3391b1c4ed711ad55c5d1e7232bc190c235 + "@types/react": "npm:*" + checksum: 33b53078ed7e9e0cfc4dc691e938f7db1cc06353bc345947b41b581c3efe2b980c9e4eb6460dbf5ddc521dd91959194c970221a2bd4bfad9d23ebce338e12938 languageName: node linkType: hard "@types/react-modal@npm:^3.12.1": - version: 3.16.1 - resolution: "@types/react-modal@npm:3.16.1" + version: 3.16.3 + resolution: "@types/react-modal@npm:3.16.3" dependencies: "@types/react": "npm:*" - checksum: 4f586bd00e4b15633ec6607cb3266183b81419a2c0931d40e6127427e944a986d3d9a9c8a23c86cb586b15e541a1c6682f6ab0d2561a3b81fcf857772727ff44 + checksum: dfcf52fa4b5d5c203aa47ffaafade369836cb9f891e9b60e7056bf5fdfc508ebec7971bb3d4c4018f422953c1c79948755ef19da3e816c28d7c5fdacf9466af8 languageName: node linkType: hard @@ -9255,41 +8837,39 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:>=16": - version: 18.2.24 - resolution: "@types/react@npm:18.2.24" +"@types/react-transition-group@npm:^4": + version: 4.4.9 + resolution: "@types/react-transition-group@npm:4.4.9" dependencies: - "@types/prop-types": "npm:*" - "@types/scheduler": "npm:*" - csstype: "npm:^3.0.2" - checksum: a83c7ae0010b265012ef038e3e00e4708c27c523f0aa0631e44f934e9c5338a51b6db1901f91d8ba10d3dc292a3a200b2cb5e47430cde58fbf988969866fe75a + "@types/react": "npm:*" + checksum: 279cd319202f7ec24ecad174dffd19fd161250bc438bf3c62951f467093e5664a0c895b185976bf45f55b68ec901e520924216eb8abafe934b66f55337319ff5 languageName: node linkType: hard -"@types/react@npm:^16, @types/react@npm:^16.14.34": - version: 16.14.48 - resolution: "@types/react@npm:16.14.48" +"@types/react@npm:*, @types/react@npm:>=16, @types/react@npm:^18.0.37": + version: 18.2.39 + resolution: "@types/react@npm:18.2.39" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 28fbacb933d614366a28c74f398ab2bf34cc95ee6d486b8dc33c9b9d76306f32196b7885c6dc4f4d6f630e8cebfb6caee6ed118e82a1d4a5ff23f29e0d724aa4 + checksum: e91a5419d7615ab4fcaa7cb3ad2bd372093676e86c082748ab36ac394d3ed560070482d092a5488f74d6b1d913369e4dabf6eb287debed4d70cd3eb7dc135542 languageName: node linkType: hard "@types/resolve@npm:^1.20.2": - version: 1.20.3 - resolution: "@types/resolve@npm:1.20.3" - checksum: 0f499b6509186bd32faaf4ed640c166be0a6d487567cea1da9cdf3dc85e6b546451479ac80bd912daf4d8546c547d9feaf9e9867b438f7650cdd5a75169c5763 + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: a9b0549d816ff2c353077365d865a33655a141d066d0f5a3ba6fd4b28bc2f4188a510079f7c1f715b3e7af505a27374adce2a5140a3ece2a059aab3d6e1a4244 languageName: node linkType: hard "@types/responselike@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/responselike@npm:1.0.1" + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" dependencies: "@types/node": "npm:*" - checksum: f49d4765498d64e81fdff91267575caef0b364538994512605323b4ef74297f6ac5c61658713e1e1cc6d3951f6a5bcd436fcdec79c5f9d5e72c6b3f700b6f997 + checksum: a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 languageName: node linkType: hard @@ -9311,69 +8891,69 @@ __metadata: linkType: hard "@types/scheduler@npm:*": - version: 0.16.4 - resolution: "@types/scheduler@npm:0.16.4" - checksum: 2355e63251c6c6467806c9e7085f5fad350a1e87f811cf416f1e48a888b7da4ecc4bae2b67b7b10d8f5e518305ef2b5d4a8451227158552942794b87be43c5dd + version: 0.16.8 + resolution: "@types/scheduler@npm:0.16.8" + checksum: f86de504945b8fc41b1f391f847444d542e2e4067cf7e5d9bfeb5d2d2393d3203b1161bc0ef3b1e104d828dabfb60baf06e8d2c27e27ff7e8258e6e618d8c4ec languageName: node linkType: hard "@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4": - version: 7.5.3 - resolution: "@types/semver@npm:7.5.3" - checksum: 1dedcf5f50a5a345e817fdf1273a14d0c57de80eb1d47bf3f17563062be53a2c99b78755a8c88c794a03757f9cd05da61b2849bf109e1b71e30fca895529c2b0 + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: 196dc32db5f68cbcde2e6a42bb4aa5cbb100fa2b7bd9c8c82faaaf3e03fbe063e205dbb4f03c7cdf53da2edb70a0d34c9f2e601b54281b377eb8dc1743226acd languageName: node linkType: hard "@types/send@npm:*": - version: 0.17.2 - resolution: "@types/send@npm:0.17.2" + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: "@types/mime": "npm:^1" "@types/node": "npm:*" - checksum: 3fdd87a1b82fae523b2609f2acef25705b40899fed3c5f4dd40bf0dc91ad6a2c0a2b6c1494d1584525fe6e88bea271fcdb9775b3996ddc7f16d52261eea73432 + checksum: 7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c languageName: node linkType: hard "@types/serve-index@npm:^1.9.1": - version: 1.9.2 - resolution: "@types/serve-index@npm:1.9.2" + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" dependencies: "@types/express": "npm:*" - checksum: 9b82300c6930f8a768e742f89414ef84cd7bd8bc242f13a070fd754144890ba281e7ae99d018e40a256963c12be600f4bb5cfd6e3ad72c686bc9482260c168eb + checksum: 94c1b9e8f1ea36a229e098e1643d5665d9371f8c2658521718e259130a237c447059b903bac0dcc96ee2c15fd63f49aa647099b7d0d437a67a6946527a837438 languageName: node linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10, @types/serve-static@npm:^1.13.8": - version: 1.15.3 - resolution: "@types/serve-static@npm:1.15.3" + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" dependencies: "@types/http-errors": "npm:*" "@types/mime": "npm:*" "@types/node": "npm:*" - checksum: 0aaaf8fc1c0c8f96a4786928d5d79b0fff2f31e8c3b571c84cd2711129456045a9c02fa76054fb6c76f5770e2f6dbbc3b4be008e9af68bd6ce8739cb6d66c89b + checksum: 811d1a2f7e74a872195e7a013bcd87a2fb1edf07eaedcb9dcfd20c1eb4bc56ad4ea0d52141c13192c91ccda7c8aeb8a530d8a7e60b9c27f5990d7e62e0fecb03 languageName: node linkType: hard "@types/sockjs@npm:^0.3.33": - version: 0.3.34 - resolution: "@types/sockjs@npm:0.3.34" + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" dependencies: "@types/node": "npm:*" - checksum: e546c306dc7630e88a7be14faa26c6c6115847f4d334dcf7957166616c1f6d35549c93cb0985f0e0bdcc4c362fb66841b2c418c03c8df24b39be385c5496df11 + checksum: b20b7820ee813f22de4f2ce98bdd12c68c930e016a8912b1ed967595ac0d8a4cbbff44f4d486dd97f77f5927e7b5725bdac7472c9ec5b27f53a5a13179f0612f languageName: node linkType: hard "@types/source-list-map@npm:*": - version: 0.1.3 - resolution: "@types/source-list-map@npm:0.1.3" - checksum: b0734c05ebfca29c28c1418237a13561bd16e5a848c48f0b6295bd2405aa070a317e869d9e8ba6907132928d5ea5cd339076e5e205c75137de7d6aedde11e365 + version: 0.1.6 + resolution: "@types/source-list-map@npm:0.1.6" + checksum: 1e6d8d4a48535c51368c65bb2c44a1c9fd9afe2eeefefa32cbf06f9c191f7b20f638b3aa755100de0a750b0ba6a76140e912f1bee75705bc2b9a58b5a5185539 languageName: node linkType: hard "@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 3327ee919a840ffe907bbd5c1d07dfd79137dd9732d2d466cf717ceec5bb21f66296173c53bb56cff95fae4185b9cd6770df3e9745fe4ba528bbc4975f54d13f + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c languageName: node linkType: hard @@ -9392,16 +8972,16 @@ __metadata: linkType: hard "@types/symlink-or-copy@npm:^1.2.0": - version: 1.2.0 - resolution: "@types/symlink-or-copy@npm:1.2.0" - checksum: cbc621ee4eb1c8b67beecba205ff47383584f6f69e5dbfd13ddb9fce3e64355bd01ba456dc9a5719e527da87c0f710f352931bfdf97efa0e23fff65d87e9315a + version: 1.2.2 + resolution: "@types/symlink-or-copy@npm:1.2.2" + checksum: 09ee39bd319f39c775c4e2049fc4018212b9b6043736bd2046537acbb59c98af7aa725c539f32672cd2ca27144073fa1f1101b4c0ed7db3fbddb305b638895b2 languageName: node linkType: hard "@types/tapable@npm:^1": - version: 1.0.9 - resolution: "@types/tapable@npm:1.0.9" - checksum: 51e7a55432c3abf71ae5e13907eb01a576efdf66ddfcd4f2a765436e684e182df527885980d4f710250cd61304a61f7fe9d447b33fef8db1fa434a395c85933d + version: 1.0.12 + resolution: "@types/tapable@npm:1.0.12" + checksum: d6a080f5839b323eb96dd5b65a6c3161c1297d8c2433eb52437912d1c3df54e38fce12ce7a57650f6453d96942298bd0935436e2501d09e407b7f41634483131 languageName: node linkType: hard @@ -9424,46 +9004,46 @@ __metadata: linkType: hard "@types/tmp@npm:^0.2.3": - version: 0.2.4 - resolution: "@types/tmp@npm:0.2.4" - checksum: 26e19913170193420eddbe5bf83e873ef82a1af002d0871659e0bcd2af41fcc29818bba2571784a452c73094e50a7db1f1a89a6399c103bb037a095cfe67e63d + version: 0.2.6 + resolution: "@types/tmp@npm:0.2.6" + checksum: a11bfa2cd8eaa6c5d62f62a3569192d7a2c28efdc5c17af0b0551db85816b2afc8156f3ca15ac76f0b142ae1403f04f44279871424233a1f3390b2e5fc828cd0 languageName: node linkType: hard "@types/tough-cookie@npm:*": - version: 4.0.3 - resolution: "@types/tough-cookie@npm:4.0.3" - checksum: 148ca3f9874b39279e85d742676cc132b74d121f7ed7d28ec28f6bc9ff9e1a41cfc2025195f33470ab55e58d316aa32aca8ab31380767f5178f13d0a046d2ebf + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 languageName: node linkType: hard "@types/trusted-types@npm:^2.0.2": - version: 2.0.4 - resolution: "@types/trusted-types@npm:2.0.4" - checksum: ad7ca5059168880d8fa04ebf9d5f57d402bef4d7bb8a50df5103db8bf3821a334aaa2dab9937cf5d440beb707bed35b700fa387fcbce0611821d4cea7fa94dc1 + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c languageName: node linkType: hard "@types/uglify-js@npm:*": - version: 3.17.2 - resolution: "@types/uglify-js@npm:3.17.2" + version: 3.17.4 + resolution: "@types/uglify-js@npm:3.17.4" dependencies: source-map: "npm:^0.6.1" - checksum: 22ead0f6c4c5f184f5db06aa68c357ace72536ee8ccbd7abe655df2cc375ab92e1bec6c425d9be85fa309190427971c89989c0b58977e9c9167b7c26fb07b898 + checksum: e1625b203872aeb73d58df2dbe6baec8bcb7de651e44b6616e2b3b5bb2634ee535c9c8260c4e3258055adcec5fe057d8b655d6cc564916b7e4fc4ffe8bce520a languageName: node linkType: hard "@types/unist@npm:^2, @types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2": - version: 2.0.8 - resolution: "@types/unist@npm:2.0.8" - checksum: 2c4685d5258b4f543677d20dce0d72b8235e70b6c859af24fcf445f92dac98ec8a1faa0cfb43307466561fcd9dbd2534a4860000944401ac3314a685b5efe3d7 + version: 2.0.10 + resolution: "@types/unist@npm:2.0.10" + checksum: 5f247dc2229944355209ad5c8e83cfe29419fa7f0a6d557421b1985a1500444719cc9efcc42c652b55aab63c931813c88033e0202c1ac684bcd4829d66e44731 languageName: node linkType: hard "@types/util-deprecate@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/util-deprecate@npm:1.0.0" - checksum: 3f5e23aad8c9427db0ca2ef0c5b05377c11f62ad5710d2b0daf75b55339d7b646007090d5d21f007bdcb32cc62f52d918f977129639686e1856248217bb73663 + version: 1.0.3 + resolution: "@types/util-deprecate@npm:1.0.3" + checksum: 901ae94b51c1a5a7e3c88afddf9396ba25c0d0f699ca89ea0e48f121d5880c3996e037f0c83465e8a75263a27bf29347e1a584d51152c637194614a2c15f7742 languageName: node linkType: hard @@ -9475,53 +9055,53 @@ __metadata: linkType: hard "@types/uuid@npm:^9.0.1": - version: 9.0.4 - resolution: "@types/uuid@npm:9.0.4" - checksum: 3f713a67a56af20ecdfcbc31f29f7182a8aea51f1120d75daa76bb346973e014ae875c27cdd455bd0812a498330abad4ecbc1b65e1b4c507bb897fcda130f079 + version: 9.0.7 + resolution: "@types/uuid@npm:9.0.7" + checksum: b329ebd4f9d1d8e08d4f2cc211be4922d70d1149f73d5772630e4a3acfb5170c6d37b3d7a39a0412f1a56e86e8a844c7f297c798b082f90380608bf766688787 languageName: node linkType: hard "@types/webpack-env@npm:^1.16.0, @types/webpack-env@npm:^1.18.0": - version: 1.18.2 - resolution: "@types/webpack-env@npm:1.18.2" - checksum: 62a7d7e98fa462cde425c1bf9e70a84f61c522f0171a8eee493d3c26df8b0e7deff233e430c0be6bc654dded0c33f657f47d000f7e797522182817c8565d5a80 + version: 1.18.4 + resolution: "@types/webpack-env@npm:1.18.4" + checksum: 3fa77dbff0ed71685404576b0a1cf74587567fe2ee1cfd11d56d6eefcab7a61e4c9ead0eced264e289d2cf0fc74296dbd55ed6c95774fe0fd6264d156c5a59f0 languageName: node linkType: hard "@types/webpack-hot-middleware@npm:^2.25.6": - version: 2.25.7 - resolution: "@types/webpack-hot-middleware@npm:2.25.7" + version: 2.25.9 + resolution: "@types/webpack-hot-middleware@npm:2.25.9" dependencies: "@types/connect": "npm:*" tapable: "npm:^2.2.0" webpack: "npm:^5" - checksum: 5f33f415fe1eb5334aea422b42a85ae45cc1d6fc69078a7b1c58879a0bf757172c232c9c8253d90c554f1378492cbf7f4fa40b390b50892cc13b6f77e733b869 + checksum: 612d234149a2a04422650ba7ab886a699d052b18103d78384a2dc589f93b7fa6fda6046a516eede4d1c7aaeb04402cc6fd4ced17295fb6edb496d958e64c4dfd languageName: node linkType: hard "@types/webpack-sources@npm:*": - version: 3.2.1 - resolution: "@types/webpack-sources@npm:3.2.1" + version: 3.2.3 + resolution: "@types/webpack-sources@npm:3.2.3" dependencies: "@types/node": "npm:*" "@types/source-list-map": "npm:*" source-map: "npm:^0.7.3" - checksum: 651fcf880b2ed4f309fce9f47b85b7d1771a63436880792688b8c5e6e4177272dbe80c88cc4d877bc8370446499ab9b6a9ac6348b1fd2b29e56f7657f4562dd7 + checksum: 74e9dfdd38bc345ce99442f3be5b5ad1efc7af5890304175c141717a7c0b38c152e6f7fe1d2875fc19aaa68964019ff4661678eba7fdeee8c3ad42dc6dbf6b62 languageName: node linkType: hard "@types/webpack-virtual-modules@npm:^0.1.1": - version: 0.1.2 - resolution: "@types/webpack-virtual-modules@npm:0.1.2" + version: 0.1.3 + resolution: "@types/webpack-virtual-modules@npm:0.1.3" dependencies: "@types/webpack": "npm:^4" - checksum: ad3a17f798aa2bb449140f13e251952f5fe5bf8313ced93d3eae7fb82184d82985eb18a27bfae2bd2385051d8affc675d117079f8402d9645bc4376d2a73d991 + checksum: 3ead19e20df409433de7f5244d3c581ba050c691fe0aee0014fac4d9307366791e07c1db5c8beee0bd5010d4e06fd9b600dc9efc27e0aaf7d8daa9ec0714abf6 languageName: node linkType: hard "@types/webpack@npm:^4": - version: 4.41.34 - resolution: "@types/webpack@npm:4.41.34" + version: 4.41.38 + resolution: "@types/webpack@npm:4.41.38" dependencies: "@types/node": "npm:*" "@types/tapable": "npm:^1" @@ -9529,59 +9109,50 @@ __metadata: "@types/webpack-sources": "npm:*" anymatch: "npm:^3.0.0" source-map: "npm:^0.6.0" - checksum: 630ebd822e7ee85b7118d1c095370709ce493831365f7fd750bea88ac4726ef52df33cc25261922526e45b354c9fdb3edfabc7738d5b9ec18416fd502cda3838 + checksum: 5a0a7465d45a0e7701a8c863e88c6cba7660b37e4aeab851c71baf505dbab2e178be1cac82488c2e7d0ea11fb703ceddb53476daec3ec9a004e2fc1554233483 languageName: node linkType: hard "@types/ws@npm:^8, @types/ws@npm:^8.5.5": - version: 8.5.6 - resolution: "@types/ws@npm:8.5.6" + version: 8.5.10 + resolution: "@types/ws@npm:8.5.10" dependencies: "@types/node": "npm:*" - checksum: 9050eb44c23caba404f106c9ab5210aae0c5cc85b5a7ed0116d0ee1c5b4e499325cffe406b6bc71ee2d4f456e9498037d95a984a06a841a64ef58a6dd79731f4 + checksum: e9af279b984c4a04ab53295a40aa95c3e9685f04888df5c6920860d1dd073fcc57c7bd33578a04b285b2c655a0b52258d34bee0a20569dca8defb8393e1e5d29 languageName: node linkType: hard "@types/yargs-parser@npm:*": - version: 21.0.1 - resolution: "@types/yargs-parser@npm:21.0.1" - checksum: f1d723a4c4383a9c53b975820b7490186ca127237ca58eb2ee8f5eacdcdb195a81aeabd1d75560abdf22fc29f70e8bb103d7ab34c5ec49bc19196195a7bf3189 + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 languageName: node linkType: hard "@types/yargs@npm:^15.0.0": - version: 15.0.16 - resolution: "@types/yargs@npm:15.0.16" + version: 15.0.19 + resolution: "@types/yargs@npm:15.0.19" dependencies: "@types/yargs-parser": "npm:*" - checksum: 07f0960062e66226ae602fccd62e351143291d778e1f4dd645c51111e62fbedafe2a976c223dcfa7ae052e989407b62e97a7472fc1d73536110cd05502c204a5 + checksum: 9fe9b8645304a628006cbba2d1990fb015e2727274d0e3853f321a379a1242d1da2c15d2f56cff0d4313ae94f0383ccf834c3bded9fb3589608aefb3432fcf00 languageName: node linkType: hard "@types/yargs@npm:^16.0.0": - version: 16.0.6 - resolution: "@types/yargs@npm:16.0.6" + version: 16.0.9 + resolution: "@types/yargs@npm:16.0.9" dependencies: "@types/yargs-parser": "npm:*" - checksum: a2cc5796cea1aac492c856ff35e829a6a230e6d72540a9446273ab16392f6ef04b8fef05ddcff71c8106c047820b5534b22e031245ee55995b1ba0c8caa382b2 + checksum: be24bd9a56c97ddb2964c1c18f5b9fe8271a50e100dc6945989901aae58f7ce6fb8f3a591c749a518401b6301358dbd1997e83c36138a297094feae7f9ac8211 languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.26 - resolution: "@types/yargs@npm:17.0.26" + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" dependencies: "@types/yargs-parser": "npm:*" - checksum: 34ab6eff6dff086b1044c65d53131e1d14e87c0c6dc44cb6851d74d8a4d1ac4503f7d12d1e1ecff25f8aea62ff7a9d6b04b05870a0324d15bbb226ddfc1d6065 - languageName: node - linkType: hard - -"@types/yauzl@npm:^2.9.1": - version: 2.10.1 - resolution: "@types/yauzl@npm:2.10.1" - dependencies: - "@types/node": "npm:*" - checksum: d44eb8ab5c7bd024644bdf07e71d1e2618b1d6a9eb10609555a5359264b3f012f91d7add53a49a114df2d3fd6b1787f6204340b03590ea1a6c0e52a71e3bca54 + checksum: 2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf languageName: node linkType: hard @@ -9717,23 +9288,20 @@ __metadata: languageName: node linkType: hard -"@urql/core@npm:>=4.1.0": - version: 4.1.4 - resolution: "@urql/core@npm:4.1.4" - dependencies: - "@0no-co/graphql.web": "npm:^1.0.1" - wonka: "npm:^6.3.2" - checksum: 66540058380d61d9c59670d7a8b561889147a21c1d251db41fd302626ec4002d030fa292009b4ccc22f24f9efeed5f82e334782a2f57c28b8580b7274ee68813 +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d languageName: node linkType: hard -"@urql/core@npm:^4.1.0": - version: 4.1.3 - resolution: "@urql/core@npm:4.1.3" +"@urql/core@npm:>=4.1.0, @urql/core@npm:^4.2.0": + version: 4.2.0 + resolution: "@urql/core@npm:4.2.0" dependencies: "@0no-co/graphql.web": "npm:^1.0.1" wonka: "npm:^6.3.2" - checksum: 9aa5c8b9df04c79e71f4be6ce0d97cc2301d1ab7aea3ffafa9f53d89564f063dc77a011239c2a51581b50bbedc1e9dab0a3551acc7ee5dda9dd1bece2d5a1644 + checksum: dbbd500705c2bbf842674016aa69865a90c3d40c1e16034faf6423c9211c37540e975abbf448eae072b7dd38920ed517e8b34ba351f881da1764c22177ca12ed languageName: node linkType: hard @@ -9772,12 +9340,12 @@ __metadata: linkType: hard "@vitejs/plugin-vue@npm:^4.0.0": - version: 4.4.0 - resolution: "@vitejs/plugin-vue@npm:4.4.0" + version: 4.5.0 + resolution: "@vitejs/plugin-vue@npm:4.5.0" peerDependencies: - vite: ^4.0.0 + vite: ^4.0.0 || ^5.0.0 vue: ^3.2.25 - checksum: a430fbc504e2d14848b94866d52c8d5044ec216b1bf9304f53e3d3f3045da634db9c986e8ed2b0605fcc94e19fe67dc9c7e10971bd5aab444ca4167a71cd197d + checksum: d15b9c817cc6ae361a5b0975254d842a8f81bc7296112fe6ace7296e80a2bfb03ad749c7db356a0f6d5fc5af1c8d755dfe7d11fd5b7499512c44fea174334f45 languageName: node linkType: hard @@ -9843,30 +9411,31 @@ __metadata: languageName: node linkType: hard -"@volar/language-core@npm:1.10.1, @volar/language-core@npm:~1.10.0": - version: 1.10.1 - resolution: "@volar/language-core@npm:1.10.1" +"@volar/language-core@npm:1.10.10, @volar/language-core@npm:~1.10.5": + version: 1.10.10 + resolution: "@volar/language-core@npm:1.10.10" dependencies: - "@volar/source-map": "npm:1.10.1" - checksum: cc4e6b07801cc48b68d9bfb4899703afc0b1d0d0a765d952df98ae63d3109555dd2d882aab8970d599521300d50aa109c82f869a590ddd8f94106b3daf0503f8 + "@volar/source-map": "npm:1.10.10" + checksum: 286f43bffd8b67230f4a66211d14bb6a15f7adbcd88342a1b2c2a2f283dae33c7aa4be62f58d8e268aee808c0ebe32cf135f76b4f4f952d542ccef2accba7efd languageName: node linkType: hard -"@volar/source-map@npm:1.10.1, @volar/source-map@npm:~1.10.0": - version: 1.10.1 - resolution: "@volar/source-map@npm:1.10.1" +"@volar/source-map@npm:1.10.10, @volar/source-map@npm:~1.10.5": + version: 1.10.10 + resolution: "@volar/source-map@npm:1.10.10" dependencies: muggle-string: "npm:^0.3.1" - checksum: 9bfc96528d802959d19d07148238cf1b7f7ba7bf05a8cf78339dd1edfb0e755d88005057673c7a807aea74b234a63067fa433a81841b9b9bc1d6e741674f6e40 + checksum: 9ef9b3411ef4281c5fe0d57c04e4c54d5d1ccaaab2355359169789e2b2ee43d2f60774b43104825bbd80bbe934619437c74cfdde6f2a06bd7b499ba4f19a4c26 languageName: node linkType: hard -"@volar/typescript@npm:~1.10.0": - version: 1.10.1 - resolution: "@volar/typescript@npm:1.10.1" +"@volar/typescript@npm:~1.10.5": + version: 1.10.10 + resolution: "@volar/typescript@npm:1.10.10" dependencies: - "@volar/language-core": "npm:1.10.1" - checksum: daad1018ac7f9d5b45416ca8f1cabec1448c020669bcc3ad9873c277ed467b1e8a2c5849f272888cfaca5e93683f1fd67cc5532fcd1e7a5f0c3a74ad2d595ffe + "@volar/language-core": "npm:1.10.10" + path-browserify: "npm:^1.0.1" + checksum: 055bb5c377fcd7298653fa13f945046100ca3976132c6a0e779b5d8f6dec9911789e5ae8e5710479d5611002506b1735e0f9b4e7f17695fc4de39dc78d6ee7fd languageName: node linkType: hard @@ -9883,15 +9452,15 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-core@npm:3.3.4, @vue/compiler-core@npm:^3.3.4": - version: 3.3.4 - resolution: "@vue/compiler-core@npm:3.3.4" +"@vue/compiler-core@npm:3.3.9, @vue/compiler-core@npm:^3.3.4": + version: 3.3.9 + resolution: "@vue/compiler-core@npm:3.3.9" dependencies: - "@babel/parser": "npm:^7.21.3" - "@vue/shared": "npm:3.3.4" + "@babel/parser": "npm:^7.23.3" + "@vue/shared": "npm:3.3.9" estree-walker: "npm:^2.0.2" source-map-js: "npm:^1.0.2" - checksum: 941dded05d656c26f6d142fda6a8b2557b2b9918e4755f88a660fee941ae04b800c69900cfe12c2c2ee045c7d9248b0fdc36398ca938395a2107b366f7f062e0 + checksum: b7114c299f765a6df27c9e3cfdd3372644d941aece10518207b4b402778f7be6180da7532f5dc2ae1627e569f81067d27b112787e195692cb5faee3fad254192 languageName: node linkType: hard @@ -9905,24 +9474,24 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-dom@npm:3.3.4, @vue/compiler-dom@npm:^3.2.0, @vue/compiler-dom@npm:^3.3.0": - version: 3.3.4 - resolution: "@vue/compiler-dom@npm:3.3.4" +"@vue/compiler-dom@npm:3.3.9, @vue/compiler-dom@npm:^3.2.0, @vue/compiler-dom@npm:^3.3.0": + version: 3.3.9 + resolution: "@vue/compiler-dom@npm:3.3.9" dependencies: - "@vue/compiler-core": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: 4f9f0fca076dbc799e4d3d6cca5e1fdba8da9b09b496c754c3d096d5e7ee7003f99f22e51fe541ade14bc2cf1ff821f6e76d9fc15ac5bb3e0d333810acd6976e + "@vue/compiler-core": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" + checksum: cc7b731400ddcbd2f7ffc5a64e5de6af42f1c647d178f7a48d63579c5e5cf2a3f39acafeefada6bd82cfa4af6724bd7363faef0522eb2a4c2dec8304e1b36c50 languageName: node linkType: hard -"@vue/compiler-sfc@npm:2.7.14": - version: 2.7.14 - resolution: "@vue/compiler-sfc@npm:2.7.14" +"@vue/compiler-sfc@npm:2.7.15": + version: 2.7.15 + resolution: "@vue/compiler-sfc@npm:2.7.15" dependencies: "@babel/parser": "npm:^7.18.4" postcss: "npm:^8.4.14" source-map: "npm:^0.6.1" - checksum: 29fe06d8da1f8721488468653be671aaa48d63fcd03c47261164cb770b4ecbde1e1455e6affbc9ef062f2729da6988000ba470fc43a2f8a454a61d51af68725d + checksum: d5dc7667bea091702657cd9263371d407d708ab0a571da01ebff5870b7800ac709678285c7dc86ae23a0757ff8a5de13dceffc063687be6a7700f58519bd5f57 languageName: node linkType: hard @@ -9952,21 +9521,21 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.3.4, @vue/compiler-sfc@npm:^3.2.0, @vue/compiler-sfc@npm:^3.2.33": - version: 3.3.4 - resolution: "@vue/compiler-sfc@npm:3.3.4" +"@vue/compiler-sfc@npm:3.3.9, @vue/compiler-sfc@npm:^3.2.0, @vue/compiler-sfc@npm:^3.2.33": + version: 3.3.9 + resolution: "@vue/compiler-sfc@npm:3.3.9" dependencies: - "@babel/parser": "npm:^7.20.15" - "@vue/compiler-core": "npm:3.3.4" - "@vue/compiler-dom": "npm:3.3.4" - "@vue/compiler-ssr": "npm:3.3.4" - "@vue/reactivity-transform": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" + "@babel/parser": "npm:^7.23.3" + "@vue/compiler-core": "npm:3.3.9" + "@vue/compiler-dom": "npm:3.3.9" + "@vue/compiler-ssr": "npm:3.3.9" + "@vue/reactivity-transform": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" estree-walker: "npm:^2.0.2" - magic-string: "npm:^0.30.0" - postcss: "npm:^8.1.10" + magic-string: "npm:^0.30.5" + postcss: "npm:^8.4.31" source-map-js: "npm:^1.0.2" - checksum: 21e76ff9f12156d91f97b34001708ccfe1017b44f7217b6b25f0acd5762a5bc013782f69f7b7a50eb0c15b8bc395ddf76f23ca51ff20ceac273fcd600576f697 + checksum: a4f346c285268c1b30e5f837f78d0fef995e9bf553c2806d5be62aa66cc12ec6d44db5066433f14c9183f22f0310eeb9f5e872e865eb84638accd0ff7e3c8c76 languageName: node linkType: hard @@ -9980,13 +9549,13 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/compiler-ssr@npm:3.3.4" +"@vue/compiler-ssr@npm:3.3.9": + version: 3.3.9 + resolution: "@vue/compiler-ssr@npm:3.3.9" dependencies: - "@vue/compiler-dom": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: b4c103b21618cefca6ff7a870f6a52576a021fc9a34ce2f826492e5a3a729b74e28d6cfe87b6db72d5f741d2b7e2dce7772d264115d9a3e5222954ccc24a8492 + "@vue/compiler-dom": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" + checksum: 119b67a3c2a739842f9a4b4b0385986549262586ce4d9eb8bb5d308ace80f7f3a854ef302982bfd3951dc359779b25758a6e53ddaf9e2b1c95b50cd3a7e9ae58 languageName: node linkType: hard @@ -10010,16 +9579,16 @@ __metadata: languageName: node linkType: hard -"@vue/language-core@npm:1.8.15": - version: 1.8.15 - resolution: "@vue/language-core@npm:1.8.15" +"@vue/language-core@npm:1.8.22": + version: 1.8.22 + resolution: "@vue/language-core@npm:1.8.22" dependencies: - "@volar/language-core": "npm:~1.10.0" - "@volar/source-map": "npm:~1.10.0" + "@volar/language-core": "npm:~1.10.5" + "@volar/source-map": "npm:~1.10.5" "@vue/compiler-dom": "npm:^3.3.0" - "@vue/reactivity": "npm:^3.3.0" "@vue/shared": "npm:^3.3.0" - minimatch: "npm:^9.0.0" + computeds: "npm:^0.0.1" + minimatch: "npm:^9.0.3" muggle-string: "npm:^0.3.1" vue-template-compiler: "npm:^2.7.14" peerDependencies: @@ -10027,20 +9596,20 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 05ec3d660bd26cf05d17e722d1117324e1309360f0be4998c82ccac22689e31a332660086ece6b3f4f43660dfb94d1905eea0aa329b88b2f5afea944b01153e0 + checksum: b2ac52872dc9e3334858b313923a1fbb0925cd59bb768186e2224ba99f0c530492da599ad697b7da5627d41955484db0869cde967ab780e7d54df15290ed8cc0 languageName: node linkType: hard -"@vue/reactivity-transform@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/reactivity-transform@npm:3.3.4" +"@vue/reactivity-transform@npm:3.3.9": + version: 3.3.9 + resolution: "@vue/reactivity-transform@npm:3.3.9" dependencies: - "@babel/parser": "npm:^7.20.15" - "@vue/compiler-core": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" + "@babel/parser": "npm:^7.23.3" + "@vue/compiler-core": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" estree-walker: "npm:^2.0.2" - magic-string: "npm:^0.30.0" - checksum: a8e25f66e272b21b38523c361171bd5fa4f0d4787c5be09b47cc7ef3911c511544cea58dd3cebea83783700431bc870e239cc66dff8bb379f52b3709a3afb046 + magic-string: "npm:^0.30.5" + checksum: 43053f09229f1994179491a15bdd13515601074e640781e5419007ee32c68060f0fb13e7c60ee533af91dd7da0b38442bf736fa74bf5597b1181174c11c2642d languageName: node linkType: hard @@ -10053,12 +9622,12 @@ __metadata: languageName: node linkType: hard -"@vue/reactivity@npm:3.3.4, @vue/reactivity@npm:^3.3.0": - version: 3.3.4 - resolution: "@vue/reactivity@npm:3.3.4" +"@vue/reactivity@npm:3.3.9": + version: 3.3.9 + resolution: "@vue/reactivity@npm:3.3.9" dependencies: - "@vue/shared": "npm:3.3.4" - checksum: d6d0f7ab03f2d1bf688fe5ba96bbf9b3473151b30f293c22a77589f5ce6f438cb32cd8c89ab9c36fb0f8c83fd312a9df5c69cb1fb6dbba9bfead11aad1d99529 + "@vue/shared": "npm:3.3.9" + checksum: acd95e033f872260e8a8a8561eb44a91ce11c66582b3b31af0d5746372d906c3546173632c6029b53375f196f756eeb9d050f1cc0d77497210d9805df52f4c0d languageName: node linkType: hard @@ -10072,13 +9641,13 @@ __metadata: languageName: node linkType: hard -"@vue/runtime-core@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/runtime-core@npm:3.3.4" +"@vue/runtime-core@npm:3.3.9": + version: 3.3.9 + resolution: "@vue/runtime-core@npm:3.3.9" dependencies: - "@vue/reactivity": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: 1ef9d5adc7e1bdf08809bc64d6215b8bbb10ddcefa726203ff235046e991d2df5d731f843717f2195a86db8a665f7d3686b3d76c3bb63500beb38de20397ca41 + "@vue/reactivity": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" + checksum: a2fdcaa7ee4c1a1ee18ac75b23596f3b3941b6682949e1164b074a54a9b9722e50fff29de2b771f659b52410e2394b922b940a1b75123ea79fd5e0d967d88a1b languageName: node linkType: hard @@ -10093,26 +9662,26 @@ __metadata: languageName: node linkType: hard -"@vue/runtime-dom@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/runtime-dom@npm:3.3.4" +"@vue/runtime-dom@npm:3.3.9": + version: 3.3.9 + resolution: "@vue/runtime-dom@npm:3.3.9" dependencies: - "@vue/runtime-core": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - csstype: "npm:^3.1.1" - checksum: 02bbaa587cec0c0b0158c08914043373d7dfc153f0eccd977ecbe924858d625adb0aabb2dce34646ebe810a5417309d926f266631a61d66ba5c7687de21ec02a + "@vue/runtime-core": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" + csstype: "npm:^3.1.2" + checksum: 708b0dad90335d42cd5f89a072f2b13934e33bce00d82f642935c0081e8905f6d9ee3eec7a65077070a5336a050bfce46aa8eaf1803a3527d1cebb71add548d4 languageName: node linkType: hard -"@vue/server-renderer@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/server-renderer@npm:3.3.4" +"@vue/server-renderer@npm:3.3.9": + version: 3.3.9 + resolution: "@vue/server-renderer@npm:3.3.9" dependencies: - "@vue/compiler-ssr": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" + "@vue/compiler-ssr": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" peerDependencies: - vue: 3.3.4 - checksum: 0c6b6689efa113908390644df2766492d64a71d63884d8dcf49d9b1cec2d9a33348ea2d4398892619d0ddad3419d2c8f1d61f9bdd7dde3776cc803a4c9438b59 + vue: 3.3.9 + checksum: 867faafbabe66bea09ba2be95aa8e67b19fe41fd03a05074f8f67f6ed3c6908a7a3eee0137bfcf1e829d640a4ec67c33b85361b9c0930748c01f9fa4e8f25e34 languageName: node linkType: hard @@ -10123,20 +9692,10 @@ __metadata: languageName: node linkType: hard -"@vue/shared@npm:3.3.4, @vue/shared@npm:^3.3.0": - version: 3.3.4 - resolution: "@vue/shared@npm:3.3.4" - checksum: 01a337004476988a576e1681eed219031db6d8671b60cbf46f75ea55e9fa1e01f5cdf550f380fe4045e037c0ac837faed6961420cd03f6f69036518fff110bb9 - languageName: node - linkType: hard - -"@vue/typescript@npm:1.8.15": - version: 1.8.15 - resolution: "@vue/typescript@npm:1.8.15" - dependencies: - "@volar/typescript": "npm:~1.10.0" - "@vue/language-core": "npm:1.8.15" - checksum: c68808d29da93e616cd30bd4dc84aad0bb3d245d45537adc74244cc0fe93cb797e4bbdbdf2a4841b6bce088e6ef1bc70fa279fd2e1aabb794c42d908d8e46087 +"@vue/shared@npm:3.3.9, @vue/shared@npm:^3.3.0": + version: 3.3.9 + resolution: "@vue/shared@npm:3.3.9" + checksum: abf10852baf4009e838c5c12893a67e4dbb4369ec6be2892ce6294a4115d2087ecd619783bbafe048d154da48dd28763fc6c53114ab490ced45e573b2d69dbc9 languageName: node linkType: hard @@ -10415,6 +9974,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -10480,9 +10046,9 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: dbe92f5b2452c93e960c5594e666dd1fae141b965ff2cb4a1e1d0381e3e4db4274c5ce4ffa3d681a86ca2a8d4e29d5efc0670a08e23fd2800051ea387df56ca2 + version: 8.3.0 + resolution: "acorn-walk@npm:8.3.0" + checksum: 24346e595f507b6e704a60d35f3c5e1aa9891d4fb6a3fc3d856503ab718cc26cabb5e3e1ff0ff8da6ec03d60a8226ebdb602805a94f970e7f797ea3b8b09437f languageName: node linkType: hard @@ -10504,6 +10070,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.11.2": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" + bin: + acorn: bin/acorn + checksum: a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 + languageName: node + linkType: hard + "address@npm:^1.0.1": version: 1.2.2 resolution: "address@npm:1.2.2" @@ -10521,13 +10096,6 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:5": - version: 5.1.1 - resolution: "agent-base@npm:5.1.1" - checksum: 3baa3f01072c16e3955ce7802166e576cde9831af82b262aae1c780af49c0c84e82e64ba9ef9e7d1704fe29e9f0096a78a4f998ec137360fee3cb95186f97161 - languageName: node - linkType: hard - "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -10537,6 +10105,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: "npm:^4.3.4" + checksum: fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" @@ -10556,25 +10133,6 @@ __metadata: languageName: node linkType: hard -"airbnb-prop-types@npm:^2.16.0": - version: 2.16.0 - resolution: "airbnb-prop-types@npm:2.16.0" - dependencies: - array.prototype.find: "npm:^2.1.1" - function.prototype.name: "npm:^1.1.2" - is-regex: "npm:^1.1.0" - object-is: "npm:^1.1.2" - object.assign: "npm:^4.1.0" - object.entries: "npm:^1.1.2" - prop-types: "npm:^15.7.2" - prop-types-exact: "npm:^1.2.0" - react-is: "npm:^16.13.1" - peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0-alpha - checksum: c3666777bf9ee3a077ce79a02fcf79b7cf3123b11a626750826912e1f0f44772177e6667176558e10384f4501556f5e7eeb198231e9f61794864465167c8ee33 - languageName: node - linkType: hard - "ajv-formats@npm:2.1.1, ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -10833,15 +10391,6 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:^1.1.1": - version: 1.2.3 - resolution: "aria-hidden@npm:1.2.3" - dependencies: - tslib: "npm:^2.0.0" - checksum: 46b07b7273167ad3fc2625f1ecbb43f8e6f73115c66785cbb5dcf1e2508133a43b6419d610c39676ceaeb563239efbd8974d5c0187695db8b3e8c3e11f549c2d - languageName: node - linkType: hard - "aria-query@npm:5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -10861,7 +10410,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.1.3, aria-query@npm:^5.3.0": +"aria-query@npm:^5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -10902,9 +10451,9 @@ __metadata: linkType: hard "array-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "array-equal@npm:1.0.0" - checksum: 5841f0b823e6806d147d40e262a0f66cb7d3272b9f9ffa8dedb868fc7799cb410ae262a32f6f358baa6c3ee7d6271eeab86b516cdfd8f9a8fa12b4f15a18e119 + version: 1.0.2 + resolution: "array-equal@npm:1.0.2" + checksum: c308184b1df488bed0eba1a8835d77789349d3859a334cb60f77df15dc4ab232c185c78b643ae68651eef1b7148942223d72fa1aba218d24ec6cf9637fb49d8e languageName: node linkType: hard @@ -10922,7 +10471,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": version: 3.1.7 resolution: "array-includes@npm:3.1.7" dependencies: @@ -10965,32 +10514,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.filter@npm:^1.0.0": - version: 1.0.3 - resolution: "array.prototype.filter@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-array-method-boxes-properly: "npm:^1.0.0" - is-string: "npm:^1.0.7" - checksum: 8b70b5f866df5d90fa27aa5bfa30f5fefc44cbea94b0513699d761713658077c2a24cbf06aac5179eabddb6c93adc467af4c288b7a839c5bc5a769ee5a2d48ad - languageName: node - linkType: hard - -"array.prototype.find@npm:^2.1.1": - version: 2.2.2 - resolution: "array.prototype.find@npm:2.2.2" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 5008d3e6089f7047db1886d0dc2d75bdd342b886528dbca3c67920f18fd435dbc878b9c55243c96e18423d139d5ddb08cdbc8f95bd89ed4f2f53c63260eb444a - languageName: node - linkType: hard - -"array.prototype.findlastindex@npm:^1.2.2": +"array.prototype.findlastindex@npm:^1.2.3": version: 1.2.3 resolution: "array.prototype.findlastindex@npm:1.2.3" dependencies: @@ -11003,7 +10527,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1": +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -11015,7 +10539,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1": +"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -11115,10 +10639,10 @@ __metadata: languageName: node linkType: hard -"ast-types-flow@npm:^0.0.7": - version: 0.0.7 - resolution: "ast-types-flow@npm:0.0.7" - checksum: f381529f2da535949ba6cceddbdfaa33b4d5105842e147ec63582f560ea9ecc1a08f66457664f3109841d3053641fa8b9fa94ba607f1ea9f6c804fe5dee44a1d +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e languageName: node linkType: hard @@ -11162,13 +10686,6 @@ __metadata: languageName: node linkType: hard -"async-limiter@npm:~1.0.0": - version: 1.0.1 - resolution: "async-limiter@npm:1.0.1" - checksum: 0693d378cfe86842a70d4c849595a0bb50dc44c11649640ca982fa90cbfc74e3cc4753b5a0847e51933f2e9c65ce8e05576e75e5e1fd963a086e673735b35969 - languageName: node - linkType: hard - "async-promise-queue@npm:^1.0.3": version: 1.0.5 resolution: "async-promise-queue@npm:1.0.5" @@ -11198,9 +10715,9 @@ __metadata: linkType: hard "async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9 + version: 3.2.5 + resolution: "async@npm:3.2.5" + checksum: 1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 languageName: node linkType: hard @@ -11254,35 +10771,32 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:^4.2.0, axe-core@npm:^4.6.2, axe-core@npm:^4.7.0": - version: 4.8.2 - resolution: "axe-core@npm:4.8.2" - checksum: ad9e1125ba226bbc73d442996d8b9b35fed9af8bcfa995831e29c3d6b8ddb0d16bc7d18c66c5a685211296ee99fe966ae4d59051ca6fbef2a7ee7408322b9dbe +"axe-core@npm:=4.7.0": + version: 4.7.0 + resolution: "axe-core@npm:4.7.0" + checksum: 89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba languageName: node linkType: hard -"axios@npm:^0.27.2": - version: 0.27.2 - resolution: "axios@npm:0.27.2" - dependencies: - follow-redirects: "npm:^1.14.9" - form-data: "npm:^4.0.0" - checksum: 76d673d2a90629944b44d6f345f01e58e9174690f635115d5ffd4aca495d99bcd8f95c590d5ccb473513f5ebc1d1a6e8934580d0c57cdd0498c3a101313ef771 +"axe-core@npm:^4.2.0": + version: 4.8.2 + resolution: "axe-core@npm:4.8.2" + checksum: ad9e1125ba226bbc73d442996d8b9b35fed9af8bcfa995831e29c3d6b8ddb0d16bc7d18c66c5a685211296ee99fe966ae4d59051ca6fbef2a7ee7408322b9dbe languageName: node linkType: hard -"axios@npm:^1.5.1": - version: 1.6.0 - resolution: "axios@npm:1.6.0" +"axios@npm:^1.5.1, axios@npm:^1.6.1": + version: 1.6.2 + resolution: "axios@npm:1.6.2" dependencies: follow-redirects: "npm:^1.15.0" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 2879e17b96cbca7e2096d231a44e2d0f03e657d79f8928ea38ec5fbaf5a5b7bf952d580cdb58a66ba328c26eb3528b89d5a32da57cc5cf89813786c044f7e9d6 + checksum: 9b77e030e85e4f9cbcba7bb52fbff67d6ce906c92d213e0bd932346a50140faf83733bf786f55bd58301bd92f9973885c7b87d6348023e10f7eaf286d0791a1d languageName: node linkType: hard -"axobject-query@npm:^3.1.1, axobject-query@npm:^3.2.1": +"axobject-query@npm:^3.2.1": version: 3.2.1 resolution: "axobject-query@npm:3.2.1" dependencies: @@ -11460,7 +10974,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.4, babel-plugin-polyfill-corejs2@npm:^0.4.5, babel-plugin-polyfill-corejs2@npm:^0.4.6": +"babel-plugin-polyfill-corejs2@npm:^0.4.4, babel-plugin-polyfill-corejs2@npm:^0.4.6": version: 0.4.6 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" dependencies: @@ -11473,7 +10987,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.2, babel-plugin-polyfill-corejs3@npm:^0.8.3, babel-plugin-polyfill-corejs3@npm:^0.8.5": +"babel-plugin-polyfill-corejs3@npm:^0.8.2, babel-plugin-polyfill-corejs3@npm:^0.8.5": version: 0.8.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.8.6" dependencies: @@ -11485,7 +10999,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.1, babel-plugin-polyfill-regenerator@npm:^0.5.2, babel-plugin-polyfill-regenerator@npm:^0.5.3": +"babel-plugin-polyfill-regenerator@npm:^0.5.1, babel-plugin-polyfill-regenerator@npm:^0.5.3": version: 0.5.3 resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" dependencies: @@ -11516,15 +11030,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-transform-runtime@npm:6.23.0": - version: 6.23.0 - resolution: "babel-plugin-transform-runtime@npm:6.23.0" - dependencies: - babel-runtime: "npm:^6.22.0" - checksum: c9e9eaeb19de4c5527c2c4494e29e2d5e2ca37ab35b24ae7dd8c93943365526114a9d144237a2976197511dd22e8eb8cdb4d69291b346b468e0736a733d2499d - languageName: node - linkType: hard - "babel-preset-current-node-syntax@npm:^1.0.0": version: 1.0.1 resolution: "babel-preset-current-node-syntax@npm:1.0.1" @@ -11559,16 +11064,6 @@ __metadata: languageName: node linkType: hard -"babel-runtime@npm:^6.22.0": - version: 6.26.0 - resolution: "babel-runtime@npm:6.26.0" - dependencies: - core-js: "npm:^2.4.0" - regenerator-runtime: "npm:^0.11.0" - checksum: caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f - languageName: node - linkType: hard - "babel-walk@npm:3.0.0-canary-5": version: 3.0.0-canary-5 resolution: "babel-walk@npm:3.0.0-canary-5" @@ -11669,9 +11164,9 @@ __metadata: linkType: hard "big-integer@npm:^1.6.44": - version: 1.6.51 - resolution: "big-integer@npm:1.6.51" - checksum: c8139662d57f8833a44802f4b65be911679c569535ea73c5cfd3c1c8994eaead1b84b6f63e1db63833e4d4cacb6b6a9e5522178113dfdc8e4c81ed8436f1e8cc + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 languageName: node linkType: hard @@ -12196,7 +11691,7 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:^0.2.5, buffer-crc32@npm:~0.2.3": +"buffer-crc32@npm:^0.2.5": version: 0.2.13 resolution: "buffer-crc32@npm:0.2.13" checksum: cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 @@ -12224,7 +11719,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.5.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -12325,6 +11820,26 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^18.0.0": + version: 18.0.1 + resolution: "cacache@npm:18.0.1" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: a31666805a80a8b16ad3f85faf66750275a9175a3480896f4f6d31b5d53ef190484fabd71bdb6d2ea5603c717fbef09f4af03d6a65b525c8ef0afaa44c361866 + languageName: node + linkType: hard + "cache-base@npm:^1.0.1": version: 1.0.1 resolution: "cache-base@npm:1.0.1" @@ -12373,13 +11888,14 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.0.2" - checksum: 74ba3f31e715456e22e451d8d098779b861eba3c7cac0d9b510049aced70d75c231ba05071f97e1812c98e34e2bee734c0c6126653e0088c2d9819ca047f4073 + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.1" + set-function-length: "npm:^1.1.1" + checksum: a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 languageName: node linkType: hard @@ -12426,9 +11942,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001406, caniuse-lite@npm:^1.0.30001464, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001543 - resolution: "caniuse-lite@npm:1.0.30001543" - checksum: 3d80abff0c2c70167f2bbc8f5105370a6eb9f4c2b59c520eaa18b76082d45b27a292c39d2a5dcaeca253679cab5aca8ff89b569502839fadd7be8ae04fb41349 + version: 1.0.30001565 + resolution: "caniuse-lite@npm:1.0.30001565" + checksum: b400e0364651a700e39d59449ca6c65b26e2caceecc4b93ae54a01ed1f62d2a7e1333b1dc640d95fbe620ffa5be38fe4dbacd880cd7a1f42fc72bb8de9a2d0c9 languageName: node linkType: hard @@ -12594,35 +12110,6 @@ __metadata: languageName: node linkType: hard -"cheerio-select@npm:^2.1.0": - version: 2.1.0 - resolution: "cheerio-select@npm:2.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-select: "npm:^5.1.0" - css-what: "npm:^6.1.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - checksum: 2242097e593919dba4aacb97d7b8275def8b9ec70b00aa1f43335456870cfc9e284eae2080bdc832ed232dabb9eefcf56c722d152da4a154813fb8814a55d282 - languageName: node - linkType: hard - -"cheerio@npm:^1.0.0-rc.3": - version: 1.0.0-rc.12 - resolution: "cheerio@npm:1.0.0-rc.12" - dependencies: - cheerio-select: "npm:^2.1.0" - dom-serializer: "npm:^2.0.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - htmlparser2: "npm:^8.0.1" - parse5: "npm:^7.0.0" - parse5-htmlparser2-tree-adapter: "npm:^7.0.0" - checksum: c85d2f2461e3f024345b78e0bb16ad8e41492356210470dd1e7d5a91391da9fcf6c0a7cb48a9ba8820330153f0cedb4d0a60c7af15d96ecdb3092299b9d9c0cc - languageName: node - linkType: hard - "chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.4.1, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -12784,9 +12271,9 @@ __metadata: linkType: hard "cli-spinners@npm:^2.5.0": - version: 2.9.1 - resolution: "cli-spinners@npm:2.9.1" - checksum: c9b1152bd387e5b76823bdee6f19079c4017994d352627216e5d3dab9220a8402514519ad96a0a12120b80752fead98d1e7a7a5f56ce32125f92778ef47bdd8c + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 languageName: node linkType: hard @@ -13031,7 +12518,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10, colorette@npm:^2.0.19, colorette@npm:^2.0.20": +"colorette@npm:^2.0.10, colorette@npm:^2.0.20": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 @@ -13118,9 +12605,9 @@ __metadata: linkType: hard "component-emitter@npm:^1.2.1": - version: 1.3.0 - resolution: "component-emitter@npm:1.3.0" - checksum: 68774a0a3754fb6c0ba53c2e88886dfbd0c773931066abb1d7fd1b0c893b2a838d8f088ab4dca1f18cc1a4fc2e6932019eba3ded2d931b5ba2241ce40e93a24f + version: 1.3.1 + resolution: "component-emitter@npm:1.3.1" + checksum: e4900b1b790b5e76b8d71b328da41482118c0f3523a516a41be598dc2785a07fd721098d9bf6e22d89b19f4fa4e1025160dc00317ea111633a3e4f75c2b86032 languageName: node linkType: hard @@ -13155,22 +12642,17 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": +"computeds@npm:^0.0.1": version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + resolution: "computeds@npm:0.0.1" + checksum: 8a8736f1f43e4a99286519785d71a10ece8f444a2fa1fc2fe1f03dedf63f3477b45094002c85a2826f7631759c9f5a00b4ace47456997f253073fc525e8983de languageName: node linkType: hard -"concat-stream@npm:^1.6.2": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.2.2" - typedarray: "npm:^0.0.6" - checksum: 2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f languageName: node linkType: hard @@ -13354,11 +12836,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.31.0": - version: 3.33.0 - resolution: "core-js-compat@npm:3.33.0" + version: 3.33.3 + resolution: "core-js-compat@npm:3.33.3" dependencies: browserslist: "npm:^4.22.1" - checksum: 1db27222420548c65fdb92574192aa1ab434e8e3b80a347fc9c20004e459cc146e719dee8a8c3a3c0773190834e865542d3745ada27a160937fc312a14f66d5c + checksum: 779997ac791b7f7d01f21312c7b83fff2babb1f632d21fd6cfd8e9c737442475bcb660fade7e1cd7642b5c9593685bc2188089bf86b31d671e8e05e28ee30e58 languageName: node linkType: hard @@ -13372,13 +12854,13 @@ __metadata: linkType: hard "core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.30.2": - version: 3.33.0 - resolution: "core-js-pure@npm:3.33.0" - checksum: dbb683bf6c5d3671129e5029e0f8047a388818bb9720352c839f46ac5627b5fed763135b9a1df89452f2afee78e49639def6063e82fc6995c4e98c31f2892db5 + version: 3.33.3 + resolution: "core-js-pure@npm:3.33.3" + checksum: 97cf39cc013f6a4f77700762de36b495228b3c087fc04b61e86bfbfb475595529966cabbcf37e738e3a468c486e815c85118d120cc6fc4960da08a14caf69826 languageName: node linkType: hard -"core-js@npm:^2.4.0, core-js@npm:^2.6.5": +"core-js@npm:^2.6.5": version: 2.6.12 resolution: "core-js@npm:2.6.12" checksum: 00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 @@ -13386,9 +12868,9 @@ __metadata: linkType: hard "core-js@npm:^3.8.2": - version: 3.33.0 - resolution: "core-js@npm:3.33.0" - checksum: f51192f311c2d75b94ebe4eb7210f91df2cb6de101b96da1a65f43cf52b9c5cfe1ce5ebebb86281e452d2ee949730afb72fb7ac826c655c9de3a92f793cf3b80 + version: 3.33.3 + resolution: "core-js@npm:3.33.3" + checksum: 08abdc9470c8228b9d09f61e62ab312738681202c4c34e9638889125b304b235f34c4fe22e9d41c20906ac0fcc807dca57c5ff7d6b90021bf64e8fe23461d9ab languageName: node linkType: hard @@ -13649,18 +13131,6 @@ __metadata: languageName: node linkType: hard -"css@npm:^2.1.0": - version: 2.2.4 - resolution: "css@npm:2.2.4" - dependencies: - inherits: "npm:^2.0.3" - source-map: "npm:^0.6.1" - source-map-resolve: "npm:^0.5.2" - urix: "npm:^0.1.0" - checksum: 496fa66568ebd9e51b3153817dd36ec004a45780da6f818e13117e3c4e50b774af41fff70a6ff2fa03777b239c4028ff655fe571b20964b90e886441cd141569 - languageName: node - linkType: hard - "css@npm:^3.0.0": version: 3.0.0 resolution: "css@npm:3.0.0" @@ -13718,7 +13188,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.0, csstype@npm:^3.1.1": +"csstype@npm:^3.0.2, csstype@npm:^3.1.0, csstype@npm:^3.1.2": version: 3.1.2 resolution: "csstype@npm:3.1.2" checksum: 32c038af259897c807ac738d9eab16b3d86747c72b09d5c740978e06f067f9b7b1737e1b75e407c7ab1fe1543dc95f20e202b4786aeb1b8d3bdf5d5ce655e6c6 @@ -13833,7 +13303,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.1.3, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.8, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.1.3, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.8": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -13842,7 +13312,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -13931,27 +13401,27 @@ __metadata: linkType: hard "deep-equal@npm:^1.1.1": - version: 1.1.1 - resolution: "deep-equal@npm:1.1.1" + version: 1.1.2 + resolution: "deep-equal@npm:1.1.2" dependencies: - is-arguments: "npm:^1.0.4" - is-date-object: "npm:^1.0.1" - is-regex: "npm:^1.0.4" - object-is: "npm:^1.0.1" + is-arguments: "npm:^1.1.1" + is-date-object: "npm:^1.0.5" + is-regex: "npm:^1.1.4" + object-is: "npm:^1.1.5" object-keys: "npm:^1.1.1" - regexp.prototype.flags: "npm:^1.2.0" - checksum: 473d5dd1d707afd5ad3068864765590591b049d0e0d9a01931599dbbd820e35f09d0a42faa6e4644deb7cf6b7dc90f7bfdf5559f42279d67f714209b62036212 + regexp.prototype.flags: "npm:^1.5.1" + checksum: cd85d822d18e9b3e1532d0f6ba412d229aa9d22881d70da161674428ae96e47925191296f7cda29306bac252889007da40ed8449363bd1c96c708acb82068a00 languageName: node linkType: hard "deep-equal@npm:^2.0.5": - version: 2.2.2 - resolution: "deep-equal@npm:2.2.2" + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" dependencies: array-buffer-byte-length: "npm:^1.0.0" - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.5" es-get-iterator: "npm:^1.1.3" - get-intrinsic: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.2" is-arguments: "npm:^1.1.1" is-array-buffer: "npm:^3.0.2" is-date-object: "npm:^1.0.5" @@ -13961,12 +13431,12 @@ __metadata: object-is: "npm:^1.1.5" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.5.0" + regexp.prototype.flags: "npm:^1.5.1" side-channel: "npm:^1.0.4" which-boxed-primitive: "npm:^1.0.2" which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.9" - checksum: 07b46a9a848efdab223abc7e3ba612ef9168d88970c3400df185d5840a30ca384749c996ae5d7af844d6b27c42587fb73a4445c63e38aac77c2d0ed9a63faa87 + which-typed-array: "npm:^1.1.13" + checksum: a48244f90fa989f63ff5ef0cc6de1e4916b48ea0220a9c89a378561960814794a5800c600254482a2c8fd2e49d6c2e196131dc983976adb024c94a42dfe4949f languageName: node linkType: hard @@ -14040,14 +13510,14 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1": - version: 1.1.0 - resolution: "define-data-property@npm:1.1.0" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" dependencies: get-intrinsic: "npm:^1.2.1" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.0" - checksum: 312cab385c681d1fdf4085f02720a487da62c6108faaaedc51668c5f62f3425cb6370ded1d126ac6c13093451864a546074ce5c4acac4caf1d81577c10469b41 + checksum: 77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 languageName: node linkType: hard @@ -14098,9 +13568,9 @@ __metadata: linkType: hard "defu@npm:^6.1.2": - version: 6.1.2 - resolution: "defu@npm:6.1.2" - checksum: ceb467f8f30d4000ae5300105904736113826a3d4124640b70e145b243d6c78c868de03634038d870e0855ff4cdfd17324a8caf7386229501a5bb776adb682f4 + version: 6.1.3 + resolution: "defu@npm:6.1.3" + checksum: 60d0d9a6e328148d5313fe0239ba3777701291f35570b52562454653d953fec5281b084514540f8d3b60d61bad9e39b52e95b3c0451631ded220ad8fdc893455 languageName: node linkType: hard @@ -14207,13 +13677,6 @@ __metadata: languageName: node linkType: hard -"detect-node-es@npm:^1.1.0": - version: 1.1.0 - resolution: "detect-node-es@npm:1.1.0" - checksum: e562f00de23f10c27d7119e1af0e7388407eb4b06596a25f6d79a360094a109ff285de317f02b090faae093d314cf6e73ac3214f8a5bb3a0def5bece94557fbe - languageName: node - linkType: hard - "detect-node@npm:^2.0.4": version: 2.1.0 resolution: "detect-node@npm:2.1.0" @@ -14309,13 +13772,6 @@ __metadata: languageName: node linkType: hard -"discontinuous-range@npm:1.0.0": - version: 1.0.0 - resolution: "discontinuous-range@npm:1.0.0" - checksum: 487b105f83c1cc528e25e65d3c4b73958ec79769b7bd0e264414702a23a7e2b282c72982b4bef4af29fcab53f47816c3f0a5c40d85a99a490f4bc35b83dc00f8 - languageName: node - linkType: hard - "dns-equal@npm:^1.0.0": version: 1.0.0 resolution: "dns-equal@npm:1.0.0" @@ -14373,6 +13829,16 @@ __metadata: languageName: node linkType: hard +"dom-helpers@npm:^5.0.1": + version: 5.2.1 + resolution: "dom-helpers@npm:5.2.1" + dependencies: + "@babel/runtime": "npm:^7.8.7" + csstype: "npm:^3.0.2" + checksum: f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + languageName: node + linkType: hard + "dom-serializer@npm:0": version: 0.2.2 resolution: "dom-serializer@npm:0.2.2" @@ -14406,9 +13872,9 @@ __metadata: linkType: hard "domain-browser@npm:^4.22.0": - version: 4.22.0 - resolution: "domain-browser@npm:4.22.0" - checksum: 2ef7eda6d2161038fda0c9aa4c9e18cc7a0baa89ea6be975d449527c2eefd4b608425db88508e2859acc472f46f402079274b24bd75e3fb506f28c5dba203129 + version: 4.23.0 + resolution: "domain-browser@npm:4.23.0" + checksum: dfcc6ba070a2c968a4d922e7d99ef440d1076812af0d983404aadf64729f746bb4a0ad2c5e73ccd5d9cf41bc79037f2a1e4a915bdf33d07e0d77f487b635b5b2 languageName: node linkType: hard @@ -14635,9 +14101,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.535": - version: 1.4.540 - resolution: "electron-to-chromium@npm:1.4.540" - checksum: 8bacd2a06a6a78875b4f4035c97fb8155447f93d854292005f9958a5d1366597fabecc1561c642eae55815583fa3436b164c8bf8f7ca3cfe15741466b3c5e0cf + version: 1.4.595 + resolution: "electron-to-chromium@npm:1.4.595" + checksum: 4383430e18d4c4d1fd8876d286f00ddf107831b7ed6bae76d25cb4418c04940aec55f142f167c389c3e7270430402e234689901efd2431c384a9164a35b1c178 languageName: node linkType: hard @@ -14952,102 +14418,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.10.0 - resolution: "envinfo@npm:7.10.0" + version: 7.11.0 + resolution: "envinfo@npm:7.11.0" bin: envinfo: dist/cli.js - checksum: ebc7792fbedca72bc829913abe0c2a3384b883903012f97b56085afd4e83d26f7dd0652403fedd99cd3e1c93d4fb0706f5d2c3dc06ac6a1eda348280a06a9dcf - languageName: node - linkType: hard - -"enzyme-adapter-react-16@npm:^1.15.5": - version: 1.15.7 - resolution: "enzyme-adapter-react-16@npm:1.15.7" - dependencies: - enzyme-adapter-utils: "npm:^1.14.1" - enzyme-shallow-equal: "npm:^1.0.5" - has: "npm:^1.0.3" - object.assign: "npm:^4.1.4" - object.values: "npm:^1.1.5" - prop-types: "npm:^15.8.1" - react-is: "npm:^16.13.1" - react-test-renderer: "npm:^16.0.0-0" - semver: "npm:^5.7.0" - peerDependencies: - enzyme: ^3.0.0 - react: ^16.0.0-0 - react-dom: ^16.0.0-0 - checksum: 7cb69fcdc4bf2390ffe440cfa906c698b90d533032180b5b6ddf5ace1edac0e09a687b7f36706e1bba3b02a91585d8d5bd0317c237b5f5eab00bdb5512f330ee - languageName: node - linkType: hard - -"enzyme-adapter-utils@npm:^1.14.1": - version: 1.14.1 - resolution: "enzyme-adapter-utils@npm:1.14.1" - dependencies: - airbnb-prop-types: "npm:^2.16.0" - function.prototype.name: "npm:^1.1.5" - has: "npm:^1.0.3" - object.assign: "npm:^4.1.4" - object.fromentries: "npm:^2.0.5" - prop-types: "npm:^15.8.1" - semver: "npm:^5.7.1" - peerDependencies: - react: 0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0 - checksum: f07423c9181ed22fda4d761ec54aca6d9fb65d8b95da48c1471d39892f8af3d3fa54c971ed73a16acbc9a483ccda3a58f97a590bf95b4d5f77f99ae37c1ac8bb - languageName: node - linkType: hard - -"enzyme-shallow-equal@npm:^1.0.1, enzyme-shallow-equal@npm:^1.0.5": - version: 1.0.5 - resolution: "enzyme-shallow-equal@npm:1.0.5" - dependencies: - has: "npm:^1.0.3" - object-is: "npm:^1.1.5" - checksum: 30ace0c5be2d454fb001a50dd30791c18e1f86b3b7238456b464921017f6add73ea6b2a2527f1e96958d8bfe84d0afcba30b0c9e4087ebda2feb42b7800419c4 - languageName: node - linkType: hard - -"enzyme-to-json@npm:^3.6.1": - version: 3.6.2 - resolution: "enzyme-to-json@npm:3.6.2" - dependencies: - "@types/cheerio": "npm:^0.22.22" - lodash: "npm:^4.17.21" - react-is: "npm:^16.12.0" - peerDependencies: - enzyme: ^3.4.0 - checksum: 90fba5bbcfda37f456d483a46d7a077123fb65f74e59bab1e137e30c84f5b3149114efae7f9736f7ea49dd9171299645816bc5f6649b16a19d47c8bd1d6d8065 - languageName: node - linkType: hard - -"enzyme@npm:^3.11.0": - version: 3.11.0 - resolution: "enzyme@npm:3.11.0" - dependencies: - array.prototype.flat: "npm:^1.2.3" - cheerio: "npm:^1.0.0-rc.3" - enzyme-shallow-equal: "npm:^1.0.1" - function.prototype.name: "npm:^1.1.2" - has: "npm:^1.0.3" - html-element-map: "npm:^1.2.0" - is-boolean-object: "npm:^1.0.1" - is-callable: "npm:^1.1.5" - is-number-object: "npm:^1.0.4" - is-regex: "npm:^1.0.5" - is-string: "npm:^1.0.5" - is-subset: "npm:^0.1.1" - lodash.escape: "npm:^4.0.1" - lodash.isequal: "npm:^4.5.0" - object-inspect: "npm:^1.7.0" - object-is: "npm:^1.0.2" - object.assign: "npm:^4.1.0" - object.entries: "npm:^1.1.1" - object.values: "npm:^1.1.1" - raf: "npm:^3.4.1" - rst-selector-parser: "npm:^2.2.3" - string.prototype.trim: "npm:^1.2.1" - checksum: 14081671ed77924026036ed4edb1168cdac826aadd1ab2c77a5b7fdda625589dc5a4062cd0c65ec88add3ea3f7c0ebcbf3178bcf84b43335a175d8c71a016809 + checksum: 4415b9c1ca32cdf92ce126136b9965eeac2efd6ab7e5278c06e8f86d048edad87ef4084710313a6d938ef9bc084ab17e1caee16339d731d230f3e2650f3aaf4d languageName: node linkType: hard @@ -15088,24 +14463,24 @@ __metadata: linkType: hard "es-abstract@npm:^1.22.1": - version: 1.22.2 - resolution: "es-abstract@npm:1.22.2" + version: 1.22.3 + resolution: "es-abstract@npm:1.22.3" dependencies: array-buffer-byte-length: "npm:^1.0.0" arraybuffer.prototype.slice: "npm:^1.0.2" available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" + call-bind: "npm:^1.0.5" es-set-tostringtag: "npm:^2.0.1" es-to-primitive: "npm:^1.2.1" function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.2" get-symbol-description: "npm:^1.0.0" globalthis: "npm:^1.0.3" gopd: "npm:^1.0.1" - has: "npm:^1.0.3" has-property-descriptors: "npm:^1.0.0" has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" internal-slot: "npm:^1.0.5" is-array-buffer: "npm:^3.0.2" is-callable: "npm:^1.2.7" @@ -15115,7 +14490,7 @@ __metadata: is-string: "npm:^1.0.7" is-typed-array: "npm:^1.1.12" is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.12.3" + object-inspect: "npm:^1.13.1" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.4" regexp.prototype.flags: "npm:^1.5.1" @@ -15129,15 +14504,8 @@ __metadata: typed-array-byte-offset: "npm:^1.0.0" typed-array-length: "npm:^1.0.4" unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.11" - checksum: a491c640a01b7c18f3cc626a3d08b5c67f8d3dac70ff8b4268cda6fa0ebed80bb028ff3ee731137512e054d39e98d02575144da904fe28045019fc59e503f1f8 - languageName: node - linkType: hard - -"es-array-method-boxes-properly@npm:^1.0.0": - version: 1.0.0 - resolution: "es-array-method-boxes-properly@npm:1.0.0" - checksum: 4b7617d3fbd460d6f051f684ceca6cf7e88e6724671d9480388d3ecdd72119ddaa46ca31f2c69c5426a82e4b3091c1e81867c71dcdc453565cd90005ff2c382d + which-typed-array: "npm:^1.1.13" + checksum: da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 languageName: node linkType: hard @@ -15158,7 +14526,7 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.12": +"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": version: 1.0.15 resolution: "es-iterator-helpers@npm:1.0.15" dependencies: @@ -15187,14 +14555,7 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": - version: 1.3.1 - resolution: "es-module-lexer@npm:1.3.1" - checksum: 4c40e30a07c62bb6b265d4db27fb5157aec33edc9f75be06449da65e92870264fa087b6d00066a6823ad2e9d135d0f663c16b87c96b5bd30caf2878afc39f7bf - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.4.1": +"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.4.1": version: 1.4.1 resolution: "es-module-lexer@npm:1.4.1" checksum: b7260a138668554d3f0ddcc728cb4b60c2fa463f15545cf155ecbdd5450a1348952d58298a7f48642e900ee579f21d7f5304b6b3c61b3d9fc2d4b2109b5a9dff @@ -15202,22 +14563,22 @@ __metadata: linkType: hard "es-set-tostringtag@npm:^2.0.1": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" dependencies: - get-intrinsic: "npm:^1.1.3" - has: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.2" has-tostringtag: "npm:^1.0.0" - checksum: 9af096365e3861bb29755cc5f76f15f66a7eab0e83befca396129090c1d9737e54090278b8e5357e97b5f0a5b0459fca07c40c6740884c2659cbf90ef8e508cc + hasown: "npm:^2.0.0" + checksum: 176d6bd1be31dd0145dcceee62bb78d4a5db7f81db437615a18308a6f62bcffe45c15081278413455e8cf0aad4ea99079de66f8de389605942dfdacbad74c2d5 languageName: node linkType: hard "es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" dependencies: - has: "npm:^1.0.3" - checksum: d54a66239fbd19535b3e50333913260394f14d2d7adb136a95396a13ca584bab400cf9cb2ffd9232f3fe2f0362540bd3a708240c493e46e13fe0b90cfcfedc3d + hasown: "npm:^2.0.0" + checksum: f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 languageName: node linkType: hard @@ -15281,11 +14642,11 @@ __metadata: linkType: hard "esbuild-wasm@npm:>=0.13.8": - version: 0.19.4 - resolution: "esbuild-wasm@npm:0.19.4" + version: 0.19.8 + resolution: "esbuild-wasm@npm:0.19.8" bin: esbuild: bin/esbuild - checksum: c2d995a280dbff4d50193dd666d3603afc33f2123c3ce8fc89dbe5915dcf0252e5f4a75429e8e5e5ba8a6df2ff397f08ba314c59868511785164f2380a3ecd18 + checksum: 453831a62c64f090f444cfb205952592478974dad7f7596084c7c13d41993500c84002c9bdd42db4b460430f762186ff00f5ca2d39d48cf81391258c438cc585 languageName: node linkType: hard @@ -15479,7 +14840,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.7": +"eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: @@ -15542,29 +14903,29 @@ __metadata: linkType: hard "eslint-plugin-import@npm:^2.23.4, eslint-plugin-import@npm:^2.26.0": - version: 2.28.1 - resolution: "eslint-plugin-import@npm:2.28.1" + version: 2.29.0 + resolution: "eslint-plugin-import@npm:2.29.0" dependencies: - array-includes: "npm:^3.1.6" - array.prototype.findlastindex: "npm:^1.2.2" - array.prototype.flat: "npm:^1.3.1" - array.prototype.flatmap: "npm:^1.3.1" + array-includes: "npm:^3.1.7" + array.prototype.findlastindex: "npm:^1.2.3" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.7" + eslint-import-resolver-node: "npm:^0.3.9" eslint-module-utils: "npm:^2.8.0" - has: "npm:^1.0.3" - is-core-module: "npm:^2.13.0" + hasown: "npm:^2.0.0" + is-core-module: "npm:^2.13.1" is-glob: "npm:^4.0.3" minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.6" - object.groupby: "npm:^1.0.0" - object.values: "npm:^1.1.6" + object.fromentries: "npm:^2.0.7" + object.groupby: "npm:^1.0.1" + object.values: "npm:^1.1.7" semver: "npm:^6.3.1" tsconfig-paths: "npm:^3.14.2" peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 5a29554d56f26d2bfb4d4f20b99aad6664c64812ef9655d5b3f089bbf70f340a34dabbe0b8ffa38bd9f1eabf828200acc5a56634842ddb83dd1e4ba01ad6d38d + checksum: 761a4e1fbc2cd318e62350bed4c448f8b11ed83091d6bb7776f096556363a09debd9922b39fd2714c895edc9aaea82e08e684eb632283f880c58a91e4bae6733 languageName: node linkType: hard @@ -15609,28 +14970,28 @@ __metadata: linkType: hard "eslint-plugin-jsx-a11y@npm:^6.4.1": - version: 6.7.1 - resolution: "eslint-plugin-jsx-a11y@npm:6.7.1" + version: 6.8.0 + resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" dependencies: - "@babel/runtime": "npm:^7.20.7" - aria-query: "npm:^5.1.3" - array-includes: "npm:^3.1.6" - array.prototype.flatmap: "npm:^1.3.1" - ast-types-flow: "npm:^0.0.7" - axe-core: "npm:^4.6.2" - axobject-query: "npm:^3.1.1" + "@babel/runtime": "npm:^7.23.2" + aria-query: "npm:^5.3.0" + array-includes: "npm:^3.1.7" + array.prototype.flatmap: "npm:^1.3.2" + ast-types-flow: "npm:^0.0.8" + axe-core: "npm:=4.7.0" + axobject-query: "npm:^3.2.1" damerau-levenshtein: "npm:^1.0.8" emoji-regex: "npm:^9.2.2" - has: "npm:^1.0.3" - jsx-ast-utils: "npm:^3.3.3" - language-tags: "npm:=1.0.5" + es-iterator-helpers: "npm:^1.0.15" + hasown: "npm:^2.0.0" + jsx-ast-utils: "npm:^3.3.5" + language-tags: "npm:^1.0.9" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.6" - object.fromentries: "npm:^2.0.6" - semver: "npm:^6.3.0" + object.entries: "npm:^1.1.7" + object.fromentries: "npm:^2.0.7" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 41ad3d0c8036b36cd475685c1ad639157f403b16e8ac23c07f1dbe0226ccf8458f2805cbd5cc8e56856a5d8a356f3276e3139274d819476ccad80c41b9245502 + checksum: 199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 languageName: node linkType: hard @@ -15697,9 +15058,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:^0.6.6": - version: 0.6.14 - resolution: "eslint-plugin-storybook@npm:0.6.14" +"eslint-plugin-storybook@npm:^0.6.15": + version: 0.6.15 + resolution: "eslint-plugin-storybook@npm:0.6.15" dependencies: "@storybook/csf": "npm:^0.0.1" "@typescript-eslint/utils": "npm:^5.45.0" @@ -15707,7 +15068,7 @@ __metadata: ts-dedent: "npm:^2.2.0" peerDependencies: eslint: ">=6" - checksum: fa198d9f0328ce0b40af479485d08fe74fc409a5ed4769b9531785e9f8e57553034a63f5bfb9cfa1c901e74c0996566c4bbe312d604e8d3e452f1d2c9d0306b2 + checksum: c61f5f2af72b614c30e8b36644672cfa25ca28e963e5e6cfab438f0cb287a6270f875a2dd8cd600a04c9864b9c549e269d95ea8da88c412e2b868fcd6a3605a4 languageName: node linkType: hard @@ -15746,16 +15107,17 @@ __metadata: linkType: hard "eslint@npm:^8.28.0": - version: 8.50.0 - resolution: "eslint@npm:8.50.0" + version: 8.54.0 + resolution: "eslint@npm:8.54.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.2" - "@eslint/js": "npm:8.50.0" - "@humanwhocodes/config-array": "npm:^0.11.11" + "@eslint/eslintrc": "npm:^2.1.3" + "@eslint/js": "npm:8.54.0" + "@humanwhocodes/config-array": "npm:^0.11.13" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" @@ -15788,7 +15150,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 91629528cb240bc61b25480574d35cd54ed444cb61a70fa76f7d5ab26af2b637b94bf8fba94403c9052c1baa944a169b6ab9cc8070496e925f7eeef730ff9038 + checksum: 4f205f832bdbd0218cde374b067791f4f76d7abe8de86b2dc849c273899051126d912ebf71531ee49b8eeaa22cad77febdc8f2876698dc2a76e84a8cb976af22 languageName: node linkType: hard @@ -16088,7 +15450,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.7.0": +"expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -16200,46 +15562,6 @@ __metadata: languageName: node linkType: hard -"extract-from-css@npm:^0.4.4": - version: 0.4.4 - resolution: "extract-from-css@npm:0.4.4" - dependencies: - css: "npm:^2.1.0" - checksum: 8ee304fb2efbff67e41097b1b44fe8fd3bea0abb23d9e29381cc92506c2ac5ca1d2390887676e3e26636af894743b4c367899d756115df5b510804ae592a37cf - languageName: node - linkType: hard - -"extract-zip@npm:^1.6.6": - version: 1.7.0 - resolution: "extract-zip@npm:1.7.0" - dependencies: - concat-stream: "npm:^1.6.2" - debug: "npm:^2.6.9" - mkdirp: "npm:^0.5.4" - yauzl: "npm:^2.10.0" - bin: - extract-zip: cli.js - checksum: 333f1349ee678d47268315f264dbfcd7003747d25640441e186e87c66efd7129f171f1bcfe8ff1151a24da19d5f8602daff002ee24145dc65516bc9a8e40ee08 - languageName: node - linkType: hard - -"extract-zip@npm:^2.0.0": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": "npm:^2.9.1" - debug: "npm:^4.1.1" - get-stream: "npm:^5.1.0" - yauzl: "npm:^2.10.0" - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -16261,7 +15583,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.3.1, fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": +"fast-glob@npm:3.3.1": version: 3.3.1 resolution: "fast-glob@npm:3.3.1" dependencies: @@ -16274,6 +15596,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + "fast-json-parse@npm:^1.0.3": version: 1.0.3 resolution: "fast-json-parse@npm:1.0.3" @@ -16369,15 +15704,6 @@ __metadata: languageName: node linkType: hard -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: "npm:~1.2.0" - checksum: 304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e - languageName: node - linkType: hard - "fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": version: 3.2.0 resolution: "fetch-blob@npm:3.2.0" @@ -16496,7 +15822,7 @@ __metadata: languageName: node linkType: hard -"find-babel-config@npm:1.2.0, find-babel-config@npm:^1.1.0": +"find-babel-config@npm:^1.1.0": version: 1.2.0 resolution: "find-babel-config@npm:1.2.0" dependencies: @@ -16633,13 +15959,13 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.1.0 - resolution: "flat-cache@npm:3.1.0" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: "npm:^3.2.7" + flatted: "npm:^3.2.9" keyv: "npm:^4.5.3" rimraf: "npm:^3.0.2" - checksum: fcbf70a2a7d8664ef8f94e25d8b4a05d0594aee8ba0b53b5b7f6287877e8e5080ae893fc4a71fb3d803c7659aeaf801d49f12183b954e21ecd98a1d74012167e + checksum: b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 languageName: node linkType: hard @@ -16652,7 +15978,7 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.7": +"flatted@npm:^3.2.9": version: 3.2.9 resolution: "flatted@npm:3.2.9" checksum: 5c91c5a0a21bbc0b07b272231e5b4efe6b822bcb4ad317caf6bb06984be4042a9e9045026307da0fdb4583f1f545e317a67ef1231a59e71f7fced3cc429cfc53 @@ -16660,9 +15986,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.217.2 - resolution: "flow-parser@npm:0.217.2" - checksum: d61127283db052fddf8275b070eea76dda5d2926aea3d8659250e168d69478f4ebdbc2bede83aa05c29f464c420ce1d701691278d3041af0492bfc16193277b5 + version: 0.222.0 + resolution: "flow-parser@npm:0.222.0" + checksum: 5576d961ba4f331168c97291a58f6afbf335dd134f0d8e34758a6f2f8276afcf504f010466b81a3420fe8c6291d9d768cd42c6bed511f2dae18d485b30dbae7e languageName: node linkType: hard @@ -16682,7 +16008,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.0": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.0": version: 1.15.3 resolution: "follow-redirects@npm:1.15.3" peerDependenciesMeta: @@ -16815,9 +16141,9 @@ __metadata: linkType: hard "fraction.js@npm:^4.2.0": - version: 4.3.6 - resolution: "fraction.js@npm:4.3.6" - checksum: d224bf62e350c4dbe66c6ac5ad9c4ec6d3c8e64c13323686dbebe7c8cc118491c297dca4961d3c93f847670794cb05e6d8b706f0e870846ab66a9c4491d0e914 + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 languageName: node linkType: hard @@ -17027,14 +16353,14 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: 60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e +"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.2, function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": +"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" dependencies: @@ -17139,36 +16465,29 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.0, get-func-name@npm:^2.0.2": +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": version: 2.0.2 resolution: "get-func-name@npm:2.0.2" checksum: 89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: "npm:^1.1.1" - has: "npm:^1.0.3" + function-bind: "npm:^1.1.2" has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" - checksum: 49eab47f9de8f1a4f9b458b8b74ee5199fb2614414a91973eb175e07db56b52b6df49b255cc7ff704cb0786490fb93bfe8f2ad138b590a8de09b47116a366bc9 - languageName: node - linkType: hard - -"get-nonce@npm:^1.0.0": - version: 1.0.1 - resolution: "get-nonce@npm:1.0.1" - checksum: 2d7df55279060bf0568549e1ffc9b84bc32a32b7541675ca092dce56317cdd1a59a98dcc4072c9f6a980779440139a3221d7486f52c488e69dc0fd27b1efb162 + hasown: "npm:^2.0.0" + checksum: 4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b languageName: node linkType: hard "get-npm-tarball-url@npm:^2.0.3": - version: 2.0.3 - resolution: "get-npm-tarball-url@npm:2.0.3" - checksum: fdf7a830d2602dd3d86285f412c9b2984ffe6ce854e1854e9548ea2b2f09f663b83791a31703552f8c72266d67c72e94c70f8d50a886fe5179d2f07a383660d8 + version: 2.1.0 + resolution: "get-npm-tarball-url@npm:2.1.0" + checksum: af779fa5b9c89a3deaf9640630a23368f5ba6a028a1179872aaf581a59485fb2c2c6bd9b94670de228cfc5f23600c89a01e594879085f7fb4dddf820a63105b8 languageName: node linkType: hard @@ -17186,13 +16505,6 @@ __metadata: languageName: node linkType: hard -"get-stdin@npm:^5.0.1": - version: 5.0.1 - resolution: "get-stdin@npm:5.0.1" - checksum: 309f933f08a4d6783681674451027802299124e596324cd628c5e5138bbc5de843bbaa345a8ce0fc72304869f9de3b50086407aca551e292b13f7cb02351479e - languageName: node - linkType: hard - "get-stdin@npm:^6.0.0": version: 6.0.0 resolution: "get-stdin@npm:6.0.0" @@ -17252,19 +16564,19 @@ __metadata: linkType: hard "giget@npm:^1.0.0": - version: 1.1.2 - resolution: "giget@npm:1.1.2" + version: 1.1.3 + resolution: "giget@npm:1.1.3" dependencies: - colorette: "npm:^2.0.19" + colorette: "npm:^2.0.20" defu: "npm:^6.1.2" - https-proxy-agent: "npm:^5.0.1" + https-proxy-agent: "npm:^7.0.2" mri: "npm:^1.2.0" - node-fetch-native: "npm:^1.0.2" - pathe: "npm:^1.1.0" - tar: "npm:^6.1.13" + node-fetch-native: "npm:^1.4.0" + pathe: "npm:^1.1.1" + tar: "npm:^6.2.0" bin: giget: dist/cli.mjs - checksum: fc76d1042df3027c468f74320f7333ce3f99a84b7cd701683cffc386a35c53699a5c32b816b635f3cdf12956c3e85df4592ffbb31f01b8da6a8d943521c9e2e4 + checksum: 7f3d3628f4c488ab543e2edcd93b6899b2486a0afc2caab748ad65714d631f5cdfc9cf00404ed21b390c070cf5214037dffb593cd667c54b97adc6a1c657cdf9 languageName: node linkType: hard @@ -17362,7 +16674,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.0.0, glob@npm:^10.2.2": +"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.3.10 resolution: "glob@npm:10.3.10" dependencies: @@ -17412,11 +16724,11 @@ __metadata: linkType: hard "globals@npm:^13.19.0": - version: 13.22.0 - resolution: "globals@npm:13.22.0" + version: 13.23.0 + resolution: "globals@npm:13.23.0" dependencies: type-fest: "npm:^0.20.2" - checksum: e7fda8fe048a3b4fdfb95602b7dcd87d719f4b3797a6ba7f43e50fe148cfe20edfd3abeb16cc301caf679ca0f3e059b561e2d5060f2133f20f52c85bb16ac394 + checksum: fc05e184b3be59bffa2580f28551a12a758c3a18df4be91444202982c76f13f52821ad54ffaf7d3f2a4d2498fdf54aeaca8d4540fd9e860a9edb09d34ef4c507 languageName: node linkType: hard @@ -17486,13 +16798,6 @@ __metadata: languageName: node linkType: hard -"glur@npm:^1.1.2": - version: 1.1.2 - resolution: "glur@npm:1.1.2" - checksum: 756fcbc7f1a8576755811e31367feeaffbd13b7f20d788672bccbd65956839065e256621a7576f4ab321352b28a0aea442d64567bca23882526b891767ffbe3e - languageName: node - linkType: hard - "google-auth-library@npm:^7.14.0": version: 7.14.1 resolution: "google-auth-library@npm:7.14.1" @@ -17678,11 +16983,11 @@ __metadata: linkType: hard "has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" dependencies: - get-intrinsic: "npm:^1.1.1" - checksum: d4ca882b6960d6257bd28baa3ddfa21f068d260411004a093b30ca357c740e11e985771c85216a6d1eef4161e862657f48c4758ec8ab515223b3895200ad164b + get-intrinsic: "npm:^1.2.2" + checksum: d62ba94b40150b00d621bc64a6aedb5bf0ee495308b4b7ed6bac856043db3cdfb1db553ae81cec91c9d2bd82057ff0e94145e7fa25d5aa5985ed32e0921927f6 languageName: node linkType: hard @@ -17811,6 +17116,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^2.0.0": version: 2.2.5 resolution: "hast-util-parse-selector@npm:2.2.5" @@ -17950,16 +17264,6 @@ __metadata: languageName: node linkType: hard -"html-element-map@npm:^1.2.0": - version: 1.3.1 - resolution: "html-element-map@npm:1.3.1" - dependencies: - array.prototype.filter: "npm:^1.0.0" - call-bind: "npm:^1.0.2" - checksum: 5ae8b37546601864eb41363a05871a896df36e59714607b1386a114d45f1c6b6cd1633d6fb09e09e5ee0f1c909d6b9c1bbca831333b8eef936312f61b1b5ecb8 - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^2.0.1": version: 2.0.1 resolution: "html-encoding-sniffer@npm:2.0.1" @@ -18093,7 +17397,7 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^8.0.1, htmlparser2@npm:^8.0.2": +"htmlparser2@npm:^8.0.2": version: 8.0.2 resolution: "htmlparser2@npm:8.0.2" dependencies: @@ -18173,6 +17477,16 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 + languageName: node + linkType: hard + "http-proxy-middleware@npm:^2.0.3": version: 2.0.6 resolution: "http-proxy-middleware@npm:2.0.6" @@ -18252,13 +17566,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^4.0.0": - version: 4.0.0 - resolution: "https-proxy-agent@npm:4.0.0" +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" dependencies: - agent-base: "npm:5" + agent-base: "npm:^7.0.2" debug: "npm:4" - checksum: fbba3e037ec04e1850e867064a763b86dd884baae9c5f4ad380504e321068c9e9b5de79cf2f3a28ede7c36036dce905b58d9f51703c5b3884d887114f4887f77 + checksum: 7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 languageName: node linkType: hard @@ -18387,9 +17701,9 @@ __metadata: linkType: hard "ignore@npm:^5.0.0, ignore@npm:^5.0.4, ignore@npm:^5.0.5, ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 languageName: node linkType: hard @@ -18525,13 +17839,13 @@ __metadata: linkType: hard "internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": - version: 1.0.5 - resolution: "internal-slot@npm:1.0.5" + version: 1.0.6 + resolution: "internal-slot@npm:1.0.6" dependencies: - get-intrinsic: "npm:^1.2.0" - has: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.2" + hasown: "npm:^2.0.0" side-channel: "npm:^1.0.4" - checksum: 66d8a66b4b5310c042e8ad00ce895dc55cb25165a3a7da0d7862ca18d69d3b1ba86511b4bf3baf4273d744d3f6e9154574af45189ef11135a444945309e39e4a + checksum: aa37cafc8ffbf513a340de58f40d5017b4949d99722d7e4f0e24b182455bdd258000d4bb1d7b4adcf9f8979b97049b99fe9defa9db8e18a78071d2637ac143fb languageName: node linkType: hard @@ -18565,28 +17879,19 @@ __metadata: languageName: node linkType: hard -"is-absolute-url@npm:^3.0.0": - version: 3.0.3 - resolution: "is-absolute-url@npm:3.0.3" - checksum: 04c415974c32e73a83d3a21a9bea18fc4e2c14fbe6bbd64832cf1e67a75ade2af0e900f552f0b8a447f1305f5ffc9d143ccd8d005dbe715d198c359d342b86f0 - languageName: node - linkType: hard - -"is-accessor-descriptor@npm:^0.1.6": - version: 0.1.6 - resolution: "is-accessor-descriptor@npm:0.1.6" - dependencies: - kind-of: "npm:^3.0.2" - checksum: f2c314b314ec6e8a6e559351bff3c7ee9aed7a5e9c6f61dd8cb9e1382c8bfe33dca3f0e0af13daf9ded9e6e66390ff23b4acfb615d7a249009a51506a7b0f151 +"is-absolute-url@npm:^3.0.0": + version: 3.0.3 + resolution: "is-absolute-url@npm:3.0.3" + checksum: 04c415974c32e73a83d3a21a9bea18fc4e2c14fbe6bbd64832cf1e67a75ade2af0e900f552f0b8a447f1305f5ffc9d143ccd8d005dbe715d198c359d342b86f0 languageName: node linkType: hard -"is-accessor-descriptor@npm:^1.0.0": - version: 1.0.0 - resolution: "is-accessor-descriptor@npm:1.0.0" +"is-accessor-descriptor@npm:^1.0.1": + version: 1.0.1 + resolution: "is-accessor-descriptor@npm:1.0.1" dependencies: - kind-of: "npm:^6.0.0" - checksum: d68edafd8ef133e9003837f3c80f4e5b82b12ab5456c772d1796857671ae83e3a426ed225a28a7e35bceabbce68c1f1ffdabf47e6d53f5a4d6c4558776ad3c20 + hasown: "npm:^2.0.0" + checksum: d034034074c5ffeb6c868e091083182279db1a956f49f8d1494cecaa0f8b99d706556ded2a9b20d9aa290549106eef8204d67d8572902e06dcb1add6db6b524d languageName: node linkType: hard @@ -18686,7 +17991,7 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.0.1, is-boolean-object@npm:^1.1.0": +"is-boolean-object@npm:^1.1.0": version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" dependencies: @@ -18710,14 +18015,14 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.1.5, is-callable@npm:^1.2.7": +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": version: 2.13.0 resolution: "is-core-module@npm:2.13.0" dependencies: @@ -18726,21 +18031,21 @@ __metadata: languageName: node linkType: hard -"is-data-descriptor@npm:^0.1.4": - version: 0.1.4 - resolution: "is-data-descriptor@npm:0.1.4" +"is-core-module@npm:^2.13.1": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - kind-of: "npm:^3.0.2" - checksum: 32fda7e966b2c1f093230d5ef2aad1bb86e43e7280da50961e38ec31dbd8a50570a2911fd45277d321074a0762adc98e8462bb62820462594128857225e90d21 + hasown: "npm:^2.0.0" + checksum: 2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 languageName: node linkType: hard -"is-data-descriptor@npm:^1.0.0": - version: 1.0.0 - resolution: "is-data-descriptor@npm:1.0.0" +"is-data-descriptor@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-descriptor@npm:1.0.1" dependencies: - kind-of: "npm:^6.0.0" - checksum: bed31385d7d1a0dbb2ab3077faf2188acf42609192dca4e320ed7b3dc14a9d70c00658956cdaa2c0402be136c6b56e183973ad81b730fd90ab427fb6fd3608be + hasown: "npm:^2.0.0" + checksum: ad3acc372e3227f87eb8cdba112c343ca2a67f1885aecf64f02f901cb0858a1fc9488ad42135ab102e9d9e71a62b3594740790bb103a9ba5da830a131a89e3e8 languageName: node linkType: hard @@ -18775,24 +18080,22 @@ __metadata: linkType: hard "is-descriptor@npm:^0.1.0": - version: 0.1.6 - resolution: "is-descriptor@npm:0.1.6" + version: 0.1.7 + resolution: "is-descriptor@npm:0.1.7" dependencies: - is-accessor-descriptor: "npm:^0.1.6" - is-data-descriptor: "npm:^0.1.4" - kind-of: "npm:^5.0.0" - checksum: 6b8f5617b764ef8c6be3d54830184357e6cdedd8e0eddf1b97d0658616ac170bfdbc7c1ad00e0aa9f5b767acdb9d6c63d4df936501784b34936bd0f9acf3b665 + is-accessor-descriptor: "npm:^1.0.1" + is-data-descriptor: "npm:^1.0.1" + checksum: f5960b9783f508aec570465288cb673d4b3cc4aae4e6de970c3afd9a8fc1351edcb85d78b2cce2ec5251893a423f73263cab3bb94cf365a8d71b5d510a116392 languageName: node linkType: hard "is-descriptor@npm:^1.0.0, is-descriptor@npm:^1.0.2": - version: 1.0.2 - resolution: "is-descriptor@npm:1.0.2" + version: 1.0.3 + resolution: "is-descriptor@npm:1.0.3" dependencies: - is-accessor-descriptor: "npm:^1.0.0" - is-data-descriptor: "npm:^1.0.0" - kind-of: "npm:^6.0.2" - checksum: a05169c7a87feb88fc155e3ada469090cfabb5a548a3f794358b511cc47a0871b8b95e7345be4925a22ef3df585c3923b31943b3ad6255ce563a9d97f2e221e0 + is-accessor-descriptor: "npm:^1.0.1" + is-data-descriptor: "npm:^1.0.1" + checksum: b4ee667ea787d3a0be4e58536087fd0587de2b0b6672fbfe288f5b8d831ac4b79fd987f31d6c2d4e5543a42c97a87428bc5215ce292a1a47070147793878226f languageName: node linkType: hard @@ -19058,7 +18361,7 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.0.3, is-regex@npm:^1.0.4, is-regex@npm:^1.0.5, is-regex@npm:^1.1.0, is-regex@npm:^1.1.4": +"is-regex@npm:^1.0.3, is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: @@ -19114,13 +18417,6 @@ __metadata: languageName: node linkType: hard -"is-subset@npm:^0.1.1": - version: 0.1.1 - resolution: "is-subset@npm:0.1.1" - checksum: d8125598ab9077a76684e18726fb915f5cea7a7358ed0c6ff723f4484d71a0a9981ee5aae06c44de99cfdef0fefce37438c6257ab129e53c82045ea0c2acdebf - languageName: node - linkType: hard - "is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": version: 1.0.4 resolution: "is-symbol@npm:1.0.4" @@ -19230,6 +18526,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + "isobject@npm:^2.0.0": version: 2.1.0 resolution: "isobject@npm:2.1.0" @@ -19247,9 +18550,9 @@ __metadata: linkType: hard "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: 10ecb00a50cac2f506af8231ce523ffa1ac1310db0435c8ffaabb50c1d72539906583aa13c84f8835dc103998b9989edc3c1de989d2e2a96a91a9ba44e5db6b9 + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b languageName: node linkType: hard @@ -19590,27 +18893,6 @@ __metadata: languageName: node linkType: hard -"jest-image-snapshot@npm:^6.0.0": - version: 6.2.0 - resolution: "jest-image-snapshot@npm:6.2.0" - dependencies: - chalk: "npm:^4.0.0" - get-stdin: "npm:^5.0.1" - glur: "npm:^1.1.2" - lodash: "npm:^4.17.4" - pixelmatch: "npm:^5.1.0" - pngjs: "npm:^3.4.0" - rimraf: "npm:^2.6.2" - ssim.js: "npm:^3.1.1" - peerDependencies: - jest: ">=20 <=29" - peerDependenciesMeta: - jest: - optional: true - checksum: 62e415f86f2bed30fe126520519014beed61a38a678285de44c6544d10eed7381b28958d3406f131a60c05715f42ab7bf7ea4ecfdab4f55946cec6739de23924 - languageName: node - linkType: hard - "jest-junit@npm:^16.0.0": version: 16.0.0 resolution: "jest-junit@npm:16.0.0" @@ -19715,8 +18997,8 @@ __metadata: linkType: hard "jest-preset-angular@npm:^13.0.1": - version: 13.1.2 - resolution: "jest-preset-angular@npm:13.1.2" + version: 13.1.4 + resolution: "jest-preset-angular@npm:13.1.4" dependencies: bs-logger: "npm:^0.2.6" esbuild: "npm:>=0.13.8" @@ -19726,16 +19008,16 @@ __metadata: pretty-format: "npm:^29.0.0" ts-jest: "npm:^29.0.0" peerDependencies: - "@angular-devkit/build-angular": ">=13.0.0 <17.0.0" - "@angular/compiler-cli": ">=13.0.0 <17.0.0" - "@angular/core": ">=13.0.0 <17.0.0" - "@angular/platform-browser-dynamic": ">=13.0.0 <17.0.0" + "@angular-devkit/build-angular": ">=13.0.0 <18.0.0" + "@angular/compiler-cli": ">=13.0.0 <18.0.0" + "@angular/core": ">=13.0.0 <18.0.0" + "@angular/platform-browser-dynamic": ">=13.0.0 <18.0.0" jest: ^29.0.0 typescript: ">=4.4" dependenciesMeta: esbuild: optional: true - checksum: be7efa5cca7c63d8c6df3d835eef4eff730e6f2f783cb1517e9c0060a9fc9d3d57aa2892d0704dab7226ecc80956717c98af8e6d0b8a2415dee07e88c72e34bf + checksum: a609deb98237505dfd9d81b8c41c385acd7a13af76609bb417144c4258cb2be2da7e87a46d74bfea36086fdfaa9a6b21a661452bbd9fb0a5552f514710e350fb languageName: node linkType: hard @@ -19908,21 +19190,6 @@ __metadata: languageName: node linkType: hard -"jest-vue-preprocessor@npm:^1.7.1": - version: 1.7.1 - resolution: "jest-vue-preprocessor@npm:1.7.1" - dependencies: - babel-plugin-transform-runtime: "npm:6.23.0" - find-babel-config: "npm:1.2.0" - vue-property-decorator: "npm:8.3.0" - peerDependencies: - typescript: "*" - vue-template-compiler: 2.6.x - vue-template-es2015-compiler: 1.9.x - checksum: 2e8ae5af00fd41eef5e8d9b6408f7729d6a9d984a7d7d67a6532bc214490a9038297e34592c14b4260fd2262e657e8b5a09dfe2f97c5560509b63aba9e3f79e0 - languageName: node - linkType: hard - "jest-watch-typeahead@npm:^2.2.1": version: 2.2.2 resolution: "jest-watch-typeahead@npm:2.2.2" @@ -19999,11 +19266,11 @@ __metadata: linkType: hard "jiti@npm:^1.18.2": - version: 1.20.0 - resolution: "jiti@npm:1.20.0" + version: 1.21.0 + resolution: "jiti@npm:1.21.0" bin: jiti: bin/jiti.js - checksum: e71999db5e436d38c32ca713c3688b5da2a686f264584d927dcca80a4eaece83af7dd32c047524e74084bb11bdfa148f5f91b7e9a0044b4803feffe3c2c30dbc + checksum: 7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f languageName: node linkType: hard @@ -20014,16 +19281,16 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.7.0": - version: 17.10.2 - resolution: "joi@npm:17.10.2" +"joi@npm:^17.11.0": + version: 17.11.0 + resolution: "joi@npm:17.11.0" dependencies: "@hapi/hoek": "npm:^9.0.0" "@hapi/topo": "npm:^5.0.0" "@sideway/address": "npm:^4.1.3" "@sideway/formula": "npm:^3.0.1" "@sideway/pinpoint": "npm:^2.0.0" - checksum: 5999a68f38a24de0b98850e137bbf4134e6dd8de29faa5893d7836f3e3aeb76ed5b2dd4daf836b87d2681aa9dfb6a5531c586d4d361dca9721d9ad0567be6b48 + checksum: c41c86fe772828b88fbdbcaef2e41235ccbb107c22523a377f9a2fd39829f203213f37a352589f49d9a9b38bf1c645846defede8b81d8c1f3123117c1a600010 languageName: node linkType: hard @@ -20265,9 +19532,9 @@ __metadata: linkType: hard "json-parse-even-better-errors@npm:^3.0.0": - version: 3.0.0 - resolution: "json-parse-even-better-errors@npm:3.0.0" - checksum: 128de17135e7af655ed83fc26dab0fe54faf43b3517fa73dcd997cce6e05a445932664f085ec6dbc219aeb0c592e53ef10d2d6dee4a8e9211ea901b8e6dd0b52 + version: 3.0.1 + resolution: "json-parse-even-better-errors@npm:3.0.1" + checksum: bc40600b14231dff1ff911d269c7ed89fbf3dbedf25cad3f47c10ff9cbb998ce03921372a17f27f3c7cfed76e679bc6c02a7b4cb2604b0ba68cd51ed16899492 languageName: node linkType: hard @@ -20293,11 +19560,14 @@ __metadata: linkType: hard "json-stable-stringify@npm:^1.0.1": - version: 1.0.2 - resolution: "json-stable-stringify@npm:1.0.2" + version: 1.1.0 + resolution: "json-stable-stringify@npm:1.1.0" dependencies: + call-bind: "npm:^1.0.5" + isarray: "npm:^2.0.5" jsonify: "npm:^0.0.1" - checksum: 502d021c3c59c09587faa40d7693d77c00460fd6c68bae95d6e35804909ec8c4aec71b136d3a09df61a7ebf803eb6e820f23ede76b77e74b8b02c76afb2ada8c + object-keys: "npm:^1.1.1" + checksum: 8888ac86dbf55c1d494bdf40705171c30884686911c37383d3aab777754bf5c1d60dc7a4dfd67f32ba37b184da5c99948a382f1c2912895a35453002e253314b languageName: node linkType: hard @@ -20420,7 +19690,7 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.3": +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" dependencies: @@ -20484,11 +19754,11 @@ __metadata: linkType: hard "keyv@npm:^4.0.0, keyv@npm:^4.5.3": - version: 4.5.3 - resolution: "keyv@npm:4.5.3" + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: json-buffer: "npm:3.0.1" - checksum: 7d3fc0469962bdff75ce92402b216a23d146e0caad011424947b32b95ffc4b91df12b1206026e6e945e7f80b3729a3109c0c3984f23038d738d355491179dd79 + checksum: aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e languageName: node linkType: hard @@ -20510,14 +19780,7 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^5.0.0": - version: 5.1.0 - resolution: "kind-of@npm:5.1.0" - checksum: fe85b7a2ed4b4d5a12e16e01d00d5c336e1760842fe0da38283605b9880c984288935e87b13138909e4d23d2d197a1d492f7393c6638d2c0fab8a900c4fb0392 - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": +"kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 @@ -20545,36 +19808,36 @@ __metadata: languageName: node linkType: hard -"kolorist@npm:^1.2.10": +"kolorist@npm:^1.8.0": version: 1.8.0 resolution: "kolorist@npm:1.8.0" checksum: 73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b languageName: node linkType: hard -"language-subtag-registry@npm:~0.3.2": +"language-subtag-registry@npm:^0.3.20": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" checksum: d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 languageName: node linkType: hard -"language-tags@npm:=1.0.5": - version: 1.0.5 - resolution: "language-tags@npm:1.0.5" +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" dependencies: - language-subtag-registry: "npm:~0.3.2" - checksum: 04215e821af9a8f1bc6c99ab5aa0a316c3fe1912ca3337eb28596316064bddd8edd22f2883d866069ebdf01b2002e504a760a336b2c728b6d30514e86744f76c + language-subtag-registry: "npm:^0.3.20" + checksum: 9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff languageName: node linkType: hard "launch-editor@npm:^2.6.0": - version: 2.6.0 - resolution: "launch-editor@npm:2.6.0" + version: 2.6.1 + resolution: "launch-editor@npm:2.6.1" dependencies: picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.7.3" - checksum: 4802b9569d8a1d477f8279a994094b415d89eb39dadbc568193bc366d64ac13827c8860539ee336fa6135a06596a9b8c8265cebac35c3fa36a2214d0eea38890 + shell-quote: "npm:^1.8.1" + checksum: 82d0bd9a44e7a972157719e63dac1b8196db6ec7066c1ec57a495f6c3d6e734f3c4da89549e7b33eb3b0356668ad02a9e7782b6733f5ebd7a61b7c5f635a3ee9 languageName: node linkType: hard @@ -20700,9 +19963,9 @@ __metadata: linkType: hard "lines-and-columns@npm:~2.0.3": - version: 2.0.3 - resolution: "lines-and-columns@npm:2.0.3" - checksum: 09525c10010a925b7efe858f1dd3184eeac34f0a9bc34993075ec490efad71e948147746b18e9540279cc87cd44085b038f986903db3de65ffe96d38a7b91c4c + version: 2.0.4 + resolution: "lines-and-columns@npm:2.0.4" + checksum: 4db28bf065cd7ad897c0700f22d3d0d7c5ed6777e138861c601c496d545340df3fc19e18bd04ff8d95a246a245eb55685b82ca2f8c2ca53a008e9c5316250379 languageName: node linkType: hard @@ -20908,13 +20171,6 @@ __metadata: languageName: node linkType: hard -"lodash.escape@npm:^4.0.1": - version: 4.0.1 - resolution: "lodash.escape@npm:4.0.1" - checksum: 90ade409cec05b6869090476952fdfb84d4d87b1ff4a0e03ebd590f980d9a1248d93ba14579f10d80c6429e4d6af13ba137c28db64cae6dadb71442e54a3ad2b - languageName: node - linkType: hard - "lodash.find@npm:^4.6.0": version: 4.6.0 resolution: "lodash.find@npm:4.6.0" @@ -20922,13 +20178,6 @@ __metadata: languageName: node linkType: hard -"lodash.flattendeep@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.flattendeep@npm:4.4.0" - checksum: 83cb80754b921fb4ed2c222b91a82b2524f3bdc60c3ae91e00688bd4bf1bcc28b8a2cc250e11fdc1b6da3a2de09e57008e13f15a209cafdd4f9163d047f97544 - languageName: node - linkType: hard - "lodash.includes@npm:^4.3.0": version: 4.3.0 resolution: "lodash.includes@npm:4.3.0" @@ -20943,13 +20192,6 @@ __metadata: languageName: node linkType: hard -"lodash.isequal@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.isequal@npm:4.5.0" - checksum: dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f - languageName: node - linkType: hard - "lodash.isinteger@npm:^4.0.4": version: 4.0.4 resolution: "lodash.isinteger@npm:4.0.4" @@ -21034,7 +20276,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": +"lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -21090,11 +20332,11 @@ __metadata: linkType: hard "loupe@npm:^2.3.6": - version: 2.3.6 - resolution: "loupe@npm:2.3.6" + version: 2.3.7 + resolution: "loupe@npm:2.3.7" dependencies: - get-func-name: "npm:^2.0.0" - checksum: a974841ce94ef2a35aac7144e7f9e789e3887f82286cd9ffe7ff00f2ac9d117481989948657465e2b0b102f23136d89ae0a18fd4a32d9015012cd64464453289 + get-func-name: "npm:^2.0.1" + checksum: 71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4 languageName: node linkType: hard @@ -21124,6 +20366,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 778bc8b2626daccd75f24c4b4d10632496e21ba064b126f526c626fbdbc5b28c472013fccd45d7646b9e1ef052444824854aed617b59cd570d01a8b7d651fc1e + languageName: node + linkType: hard + "lru-cache@npm:^4.1.2": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -21216,16 +20465,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0, magic-string@npm:^0.30.3": - version: 0.30.4 - resolution: "magic-string@npm:0.30.4" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.4.15" - checksum: 076c0402334a8f7c69d83175b4ff10c83b50fd2c6d884a758a563ad9bea312db3b5c7b16cf717229c11505a1deb52d6225503b3b638e1879101d65d08f03c467 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.5": +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.3, magic-string@npm:^0.30.4, magic-string@npm:^0.30.5": version: 0.30.5 resolution: "magic-string@npm:0.30.5" dependencies: @@ -21292,6 +20532,25 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + languageName: node + linkType: hard + "makeerror@npm:1.0.12": version: 1.0.12 resolution: "makeerror@npm:1.0.12" @@ -22238,7 +21497,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.25, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -22256,15 +21515,6 @@ __metadata: languageName: node linkType: hard -"mime@npm:^2.0.3": - version: 2.6.0 - resolution: "mime@npm:2.6.0" - bin: - mime: cli.js - checksum: a7f2589900d9c16e3bdf7672d16a6274df903da958c1643c9c45771f0478f3846dcb1097f31eb9178452570271361e2149310931ec705c037210fc69639c8e6c - languageName: node - linkType: hard - "mime@npm:^3.0.0": version: 3.0.0 resolution: "mime@npm:3.0.0" @@ -22361,7 +21611,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" dependencies: @@ -22370,7 +21620,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -22386,6 +21636,15 @@ __metadata: languageName: node linkType: hard +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + "minipass-fetch@npm:^3.0.0": version: 3.0.4 resolution: "minipass-fetch@npm:3.0.4" @@ -22454,7 +21713,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": version: 7.0.4 resolution: "minipass@npm:7.0.4" checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 @@ -22488,7 +21747,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.6": +"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.6": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -22522,13 +21781,6 @@ __metadata: languageName: node linkType: hard -"moo@npm:^0.5.0": - version: 0.5.2 - resolution: "moo@npm:0.5.2" - checksum: a9d9ad8198a51fe35d297f6e9fdd718298ca0b39a412e868a0ebd92286379ab4533cfc1f1f34516177f5129988ab25fe598f78e77c84e3bfe0d4a877b56525a8 - languageName: node - linkType: hard - "mount-point@npm:^3.0.0": version: 3.0.0 resolution: "mount-point@npm:3.0.0" @@ -22611,11 +21863,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 606b355960d0fcbe3d27924c4c52ef7d47d3b57208808ece73279420d91469b01ec1dce10fae512b6d4a8c5a5432b352b228336a8b2202a6ea68e67fa348e2ee + checksum: e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 languageName: node linkType: hard @@ -22668,23 +21920,6 @@ __metadata: languageName: node linkType: hard -"nearley@npm:^2.7.10": - version: 2.20.1 - resolution: "nearley@npm:2.20.1" - dependencies: - commander: "npm:^2.19.0" - moo: "npm:^0.5.0" - railroad-diagrams: "npm:^1.0.0" - randexp: "npm:0.4.6" - bin: - nearley-railroad: bin/nearley-railroad.js - nearley-test: bin/nearley-test.js - nearley-unparse: bin/nearley-unparse.js - nearleyc: bin/nearleyc.js - checksum: d25e1fd40b19c53a0ada6a688670f4a39063fd9553ab62885e81a82927d51572ce47193b946afa3d85efa608ba2c68f433c421f69b854bfb7f599eacb5fae37e - languageName: node - linkType: hard - "needle@npm:^3.1.0": version: 3.2.0 resolution: "needle@npm:3.2.0" @@ -22713,19 +21948,19 @@ __metadata: linkType: hard "next@npm:^14.0.2": - version: 14.0.2 - resolution: "next@npm:14.0.2" - dependencies: - "@next/env": "npm:14.0.2" - "@next/swc-darwin-arm64": "npm:14.0.2" - "@next/swc-darwin-x64": "npm:14.0.2" - "@next/swc-linux-arm64-gnu": "npm:14.0.2" - "@next/swc-linux-arm64-musl": "npm:14.0.2" - "@next/swc-linux-x64-gnu": "npm:14.0.2" - "@next/swc-linux-x64-musl": "npm:14.0.2" - "@next/swc-win32-arm64-msvc": "npm:14.0.2" - "@next/swc-win32-ia32-msvc": "npm:14.0.2" - "@next/swc-win32-x64-msvc": "npm:14.0.2" + version: 14.0.3 + resolution: "next@npm:14.0.3" + dependencies: + "@next/env": "npm:14.0.3" + "@next/swc-darwin-arm64": "npm:14.0.3" + "@next/swc-darwin-x64": "npm:14.0.3" + "@next/swc-linux-arm64-gnu": "npm:14.0.3" + "@next/swc-linux-arm64-musl": "npm:14.0.3" + "@next/swc-linux-x64-gnu": "npm:14.0.3" + "@next/swc-linux-x64-musl": "npm:14.0.3" + "@next/swc-win32-arm64-msvc": "npm:14.0.3" + "@next/swc-win32-ia32-msvc": "npm:14.0.3" + "@next/swc-win32-x64-msvc": "npm:14.0.3" "@swc/helpers": "npm:0.5.2" busboy: "npm:1.6.0" caniuse-lite: "npm:^1.0.30001406" @@ -22763,7 +21998,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 65ae7a09f1643bc3deafdbdae9ce0c02326346c4a60a7c739f8f6b154b2226b8fcc5efb984cdcb4ef100116910d4c1013089135800d30c7a50cf98c9d22e5a26 + checksum: 73aa3d5dd7b65b53ef68fa7723a7a98536482a69ae2d56e7b335194168f00b2851397bbdfe490b53dba2c70dfb8ad0150035fab4c762d6bc331e884487c4ff07 languageName: node linkType: hard @@ -22852,10 +22087,10 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.0.2": - version: 1.4.0 - resolution: "node-fetch-native@npm:1.4.0" - checksum: 2ced63b4b4cef8d05e004c5489614811ae836ae17a07e548af7a29fb22c5ea2512ea24423720f1ac9b47787d701044321d4921e3da4fe8dbcc882a8f67a1d218 +"node-fetch-native@npm:^1.4.0": + version: 1.4.1 + resolution: "node-fetch-native@npm:1.4.1" + checksum: ab298a42ebf3b1b6c6a8cbc53d8ba703895f55171ed743b0828c2a87d461642d8053143864915a69d41cc01013db86406da105fff6c0a05a00d8caf5c279549c languageName: node linkType: hard @@ -22892,17 +22127,17 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.2": - version: 4.6.1 - resolution: "node-gyp-build@npm:4.6.1" + version: 4.7.1 + resolution: "node-gyp-build@npm:4.7.1" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: bd7738c96608c1fa056344623b93d4bbdc63fec05862061e5489284639e3a53daa407b9158c45bfc2e33d0b419851ed5c1f03f4c9ba34726361e2a7b765c0ddc + checksum: b8e4a3f889237cd08edde3775e2b4e1e39a0571580584e33e29979f0c532a254ce3c5ec9435bd526254ad0b3f0b4a7e7fe14e53bd400f6ea9445f3bfd88a6b1e languageName: node linkType: hard -"node-gyp@npm:^9.0.0, node-gyp@npm:^9.3.1, node-gyp@npm:latest": +"node-gyp@npm:^9.0.0, node-gyp@npm:^9.3.1": version: 9.4.0 resolution: "node-gyp@npm:9.4.0" dependencies: @@ -22923,6 +22158,26 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa + languageName: node + linkType: hard + "node-int64@npm:^0.4.0": version: 0.4.0 resolution: "node-int64@npm:0.4.0" @@ -22990,6 +22245,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + languageName: node + linkType: hard + "normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -23045,11 +22311,11 @@ __metadata: linkType: hard "npm-install-checks@npm:^6.0.0": - version: 6.2.0 - resolution: "npm-install-checks@npm:6.2.0" + version: 6.3.0 + resolution: "npm-install-checks@npm:6.3.0" dependencies: semver: "npm:^7.1.1" - checksum: d7814be08413879bb8b3c39ff15786f5865ed3359a56265a686dd7244f3b3ac37669bf740847f9f9063f1d90f2f770d84a815175030fde5f502eab1d9637433b + checksum: b046ef1de9b40f5d3a9831ce198e1770140a1c3f253dae22eb7b06045191ef79f18f1dcc15a945c919b3c161426861a28050abd321bf439190185794783b6452 languageName: node linkType: hard @@ -23306,14 +22572,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.3, object-inspect@npm:^1.7.0, object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: 752bb5f4dc595e214157ea8f442adb77bdb850ace762b078d151d8b6486331ab12364997a89ee6509be1023b15adf2b3774437a7105f8a5043dfda11ed622411 +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d languageName: node linkType: hard -"object-is@npm:^1.0.1, object-is@npm:^1.0.2, object-is@npm:^1.1.2, object-is@npm:^1.1.5": +"object-is@npm:^1.1.5": version: 1.1.5 resolution: "object-is@npm:1.1.5" dependencies: @@ -23346,7 +22612,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": version: 4.1.4 resolution: "object.assign@npm:4.1.4" dependencies: @@ -23358,7 +22624,7 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.1, object.entries@npm:^1.1.2, object.entries@npm:^1.1.6": +"object.entries@npm:^1.1.2, object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": version: 1.1.7 resolution: "object.entries@npm:1.1.7" dependencies: @@ -23369,7 +22635,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.5, object.fromentries@npm:^2.0.6": +"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": version: 2.0.7 resolution: "object.fromentries@npm:2.0.7" dependencies: @@ -23380,7 +22646,7 @@ __metadata: languageName: node linkType: hard -"object.groupby@npm:^1.0.0": +"object.groupby@npm:^1.0.1": version: 1.0.1 resolution: "object.groupby@npm:1.0.1" dependencies: @@ -23411,7 +22677,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.1, object.values@npm:^1.1.5, object.values@npm:^1.1.6": +"object.values@npm:^1.1.6, object.values@npm:^1.1.7": version: 1.1.7 resolution: "object.values@npm:1.1.7" dependencies: @@ -23917,16 +23183,6 @@ __metadata: languageName: node linkType: hard -"parse5-htmlparser2-tree-adapter@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" - dependencies: - domhandler: "npm:^5.0.2" - parse5: "npm:^7.0.0" - checksum: e820cacb8486e6f7ede403327d18480df086d70e32ede2f6654d8c3a8b4b8dc4a4d5c21c03c18a92ba2466c513b93ca63be4a138dd73cd0995f384eb3b9edf11 - languageName: node - linkType: hard - "parse5-sax-parser@npm:^7.0.0": version: 7.0.0 resolution: "parse5-sax-parser@npm:7.0.0" @@ -24095,7 +23351,7 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.0": +"pathe@npm:^1.1.1": version: 1.1.1 resolution: "pathe@npm:1.1.1" checksum: 3ae5a0529c3415d91c3ac9133f52cffea54a0dd46892fe059f4b80faf36fd207957d4594bdc87043b65d0761b1e5728f81f46bafff3b5302da4e2e48889b8c0e @@ -24133,13 +23389,6 @@ __metadata: languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 - languageName: node - linkType: hard - "performance-now@npm:^2.1.0": version: 2.1.0 resolution: "performance-now@npm:2.1.0" @@ -24254,17 +23503,6 @@ __metadata: languageName: node linkType: hard -"pixelmatch@npm:^5.1.0": - version: 5.3.0 - resolution: "pixelmatch@npm:5.3.0" - dependencies: - pngjs: "npm:^6.0.0" - bin: - pixelmatch: bin/pixelmatch - checksum: 30850661db29b57cefbe6cf36e930b7517aea4e0ed129e85fcc8ec04a7e6e7648a822a972f8e01d2d3db268ca3c735555caf6b8099a164d8b64d105986d682d2 - languageName: node - linkType: hard - "pkg-dir@npm:^3.0.0": version: 3.0.0 resolution: "pkg-dir@npm:3.0.0" @@ -24346,20 +23584,6 @@ __metadata: languageName: node linkType: hard -"pngjs@npm:^3.4.0": - version: 3.4.0 - resolution: "pngjs@npm:3.4.0" - checksum: 88ee73e2ad3f736e0b2573722309eb80bd2aa28916f0862379b4fd0f904751b4f61bb6bd1ecd7d4242d331f2b5c28c13309dd4b7d89a9b78306e35122fdc5011 - languageName: node - linkType: hard - -"pngjs@npm:^6.0.0": - version: 6.0.0 - resolution: "pngjs@npm:6.0.0" - checksum: ac23ea329b1881d1a10575aff58116dc27b894ec3f5b84ba15c7f527d21e609fbce7ba16d48f8ccb86c7ce45ceed622472765476ab2875949d4bec55e153f87a - languageName: node - linkType: hard - "pnp-webpack-plugin@npm:^1.7.0": version: 1.7.0 resolution: "pnp-webpack-plugin@npm:1.7.0" @@ -24545,18 +23769,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.27": - version: 8.4.27 - resolution: "postcss@npm:8.4.27" - dependencies: - nanoid: "npm:^3.3.6" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 41a0476e05cb97514ff8d75e4ff9fdcf778f22b2e0d25b7028f219cd408e01d3c4f50459d4a1cd9a430d8ef08202c881374a4fa4ea6009f4a135a07315d606e5 - languageName: node - linkType: hard - -"postcss@npm:8.4.31, postcss@npm:^8.1.10, postcss@npm:^8.2.14, postcss@npm:^8.4.14, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.26, postcss@npm:^8.4.27": +"postcss@npm:8.4.31, postcss@npm:^8.2.14, postcss@npm:^8.4.14, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.26, postcss@npm:^8.4.27, postcss@npm:^8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" dependencies: @@ -24577,21 +23790,10 @@ __metadata: languageName: node linkType: hard -"preact-render-to-string@npm:^5.1.19": - version: 5.2.6 - resolution: "preact-render-to-string@npm:5.2.6" - dependencies: - pretty-format: "npm:^3.8.0" - peerDependencies: - preact: ">=10" - checksum: fb40f952f377900d87d3274e8ede1b59271347f7a3f41ae390aedeb088d162fe15f0a8040272404bd4477551cc2ec83b8a661e2fd3084702498b1543bb08dd11 - languageName: node - linkType: hard - "preact@npm:^10.5.13": - version: 10.18.1 - resolution: "preact@npm:10.18.1" - checksum: b157c46d5dbece48cf0f31b0e24d27c989ea019e77730427b4c7549953da7de015b34f13f93d0034966f033738ec582829da918c28d084bbb31d59f320f56aa0 + version: 10.19.2 + resolution: "preact@npm:10.19.2" + checksum: 1a37e967d8947d1c82ad86cd90968536612c1463effdc5b0230a4517dc928cae8c9052513f0d5ac7bb09480b9431d129197d6c9b6924d32e32245e5ecd27cc8a languageName: node linkType: hard @@ -24714,13 +23916,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^3.8.0": - version: 3.8.0 - resolution: "pretty-format@npm:3.8.0" - checksum: 69f12937bfb7b2a537a7463b9f875a16322401f1e44d7702d643faa0d21991126c24c093217ef6da403b54c15942a834174fa1c016b72e2cb9edaae6bb3729b6 - languageName: node - linkType: hard - "pretty-hrtime@npm:^1.0.3": version: 1.0.3 resolution: "pretty-hrtime@npm:1.0.3" @@ -24789,13 +23984,6 @@ __metadata: languageName: node linkType: hard -"progress@npm:^2.0.1": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: 1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c - languageName: node - linkType: hard - "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -24848,17 +24036,6 @@ __metadata: languageName: node linkType: hard -"prop-types-exact@npm:^1.2.0": - version: 1.2.0 - resolution: "prop-types-exact@npm:1.2.0" - dependencies: - has: "npm:^1.0.3" - object.assign: "npm:^4.1.0" - reflect.ownkeys: "npm:^0.2.0" - checksum: 71e186c5b982f72b8226f052b710ef6b87fff7275fcf5834b4913fa5b6c325c44be111488786fd3c4e422fb4bb4e91f3c7f35445366c9a4585405d3b02872587 - languageName: node - linkType: hard - "prop-types@npm:^15.5.10, prop-types@npm:^15.6.1, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -24889,7 +24066,7 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": +"proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b @@ -25097,45 +24274,9 @@ __metadata: linkType: hard "punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 8e6f7abdd3a6635820049e3731c623bbef3fedbf63bbc696b0d7237fdba4cefa069bc1fa62f2938b0fbae057550df7b5318f4a6bcece27f1907fc75c54160bee - languageName: node - linkType: hard - -"puppeteer-core@npm:^2.1.1": - version: 2.1.1 - resolution: "puppeteer-core@npm:2.1.1" - dependencies: - "@types/mime-types": "npm:^2.1.0" - debug: "npm:^4.1.0" - extract-zip: "npm:^1.6.6" - https-proxy-agent: "npm:^4.0.0" - mime: "npm:^2.0.3" - mime-types: "npm:^2.1.25" - progress: "npm:^2.0.1" - proxy-from-env: "npm:^1.0.0" - rimraf: "npm:^2.6.1" - ws: "npm:^6.1.0" - checksum: 29a73c2327e208e6528bac05f841b3340ee1a8d7bd59e7b235c9d8b3c0bf266804ad1aa901a0e4a1d66ce4202646f242988c3c5c4dfb105e9ad082bf4aae69be - languageName: node - linkType: hard - -"puppeteer@npm:^2.0.0 || ^3.0.0": - version: 3.3.0 - resolution: "puppeteer@npm:3.3.0" - dependencies: - debug: "npm:^4.1.0" - extract-zip: "npm:^2.0.0" - https-proxy-agent: "npm:^4.0.0" - mime: "npm:^2.0.3" - progress: "npm:^2.0.1" - proxy-from-env: "npm:^1.0.0" - rimraf: "npm:^3.0.2" - tar-fs: "npm:^2.0.0" - unbzip2-stream: "npm:^1.3.3" - ws: "npm:^7.2.3" - checksum: 9f8d7f00458425f9ca42580f509f5406ddf27767dbf93080d05157a7882efaf0e32c77e540c8a4d2bd295ab11584a8447d9e6593d6316bf04ce1a16d6fd11b4e + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard @@ -25247,13 +24388,6 @@ __metadata: languageName: node linkType: hard -"railroad-diagrams@npm:^1.0.0": - version: 1.0.0 - resolution: "railroad-diagrams@npm:1.0.0" - checksum: 81bf8f86870a69fb9ed243102db9ad6416d09c4cb83964490d44717690e07dd982f671503236a1f8af28f4cb79d5d7a87613930f10ac08defa845ceb6764e364 - languageName: node - linkType: hard - "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -25261,16 +24395,6 @@ __metadata: languageName: node linkType: hard -"randexp@npm:0.4.6": - version: 0.4.6 - resolution: "randexp@npm:0.4.6" - dependencies: - discontinuous-range: "npm:1.0.0" - ret: "npm:~0.1.10" - checksum: 14ee14b6d7f5ce69609b51cc914fb7a7c82ad337820a141c5f762c5ad1fe868f5191ea6e82359aee019b625ee1359486628fa833909d12c3b5dd9571908c3345 - languageName: node - linkType: hard - "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -25363,38 +24487,36 @@ __metadata: linkType: hard "react-docgen@npm:^7.0.0": - version: 7.0.0 - resolution: "react-docgen@npm:7.0.0" + version: 7.0.1 + resolution: "react-docgen@npm:7.0.1" dependencies: "@babel/core": "npm:^7.18.9" "@babel/traverse": "npm:^7.18.9" "@babel/types": "npm:^7.18.9" "@types/babel__core": "npm:^7.18.0" "@types/babel__traverse": "npm:^7.18.0" - "@types/doctrine": "npm:^0.0.8" + "@types/doctrine": "npm:^0.0.9" "@types/resolve": "npm:^1.20.2" doctrine: "npm:^3.0.0" resolve: "npm:^1.22.1" strip-indent: "npm:^4.0.0" - checksum: 79678d01644e6519450f847c77fa554a7a80ae3a5ff81b1482d1458caa064cf3be88597051375ba7a90921980feb8586378e1560146d64c41d0e569465315575 + checksum: 870c1193211f14497bf7a96137f96840dc058842ca75ff7251d91e88c3c71d7a41d5f1a124cc1b53bfbf1f2b6b58bfccc4dd6e22592814a5155d3894953274be languageName: node linkType: hard -"react-dom@npm:^16.8.0": - version: 16.14.0 - resolution: "react-dom@npm:16.14.0" +"react-dom@npm:^18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" dependencies: loose-envify: "npm:^1.1.0" - object-assign: "npm:^4.1.1" - prop-types: "npm:^15.6.2" - scheduler: "npm:^0.19.1" + scheduler: "npm:^0.23.0" peerDependencies: - react: ^16.14.0 - checksum: ca146e780631672a2d57c8d77775d38f394a6cd67db30c6af7964d0b3574ef7edccb1de8d592e990b98f4f5f8d1c8460b0691f04e7a45799962a51dcbaaa1371 + react: ^18.2.0 + checksum: 66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a languageName: node linkType: hard -"react-draggable@npm:^4.4.3": +"react-draggable@npm:^4.4.5": version: 4.4.6 resolution: "react-draggable@npm:4.4.6" dependencies: @@ -25444,7 +24566,7 @@ __metadata: languageName: node linkType: hard -"react-helmet-async@npm:^1.0.7": +"react-helmet-async@npm:^1.3.0": version: 1.3.0 resolution: "react-helmet-async@npm:1.3.0" dependencies: @@ -25476,7 +24598,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0, react-is@npm:^16.8.6": +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 @@ -25580,49 +24702,14 @@ __metadata: "@popperjs/core": ^2.0.0 react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 - checksum: 23f93540537ca4c035425bb8d5e51b11131fbc921d7ac1d041d0ae557feac8c877f3a012d36b94df8787803f52ed81e6df9257ac9e58719875f7805518d6db3f - languageName: node - linkType: hard - -"react-refresh@npm:^0.14.0": - version: 0.14.0 - resolution: "react-refresh@npm:0.14.0" - checksum: b8ae07ad153357d77830928a7f1fc2df837aabefee907fa273ba04c7643f3b860e986f1d4b7ada9b721c8d79b8c24b5b911a314a1a2398b105f1b13d19ea2b8d - languageName: node - linkType: hard - -"react-remove-scroll-bar@npm:^2.3.3": - version: 2.3.4 - resolution: "react-remove-scroll-bar@npm:2.3.4" - dependencies: - react-style-singleton: "npm:^2.2.1" - tslib: "npm:^2.0.0" - 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 - checksum: 2262750dc1022c56d2c79e8d865c00045881c57bcaca74810ae8adac35cfdf723ff7d6b3b0e95c85eb9a0cff90bb4b1e0af801bd703ce8c0a2e35ab14ff1babb - languageName: node - linkType: hard - -"react-remove-scroll@npm:2.5.5": - version: 2.5.5 - resolution: "react-remove-scroll@npm:2.5.5" - dependencies: - react-remove-scroll-bar: "npm:^2.3.3" - react-style-singleton: "npm:^2.2.1" - tslib: "npm:^2.1.0" - use-callback-ref: "npm:^1.3.0" - use-sidecar: "npm:^1.1.2" - 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 - checksum: 4952657e6a7b9d661d4ad4dfcef81b9c7fa493e35164abff99c35c0b27b3d172ef7ad70c09416dc44dd14ff2e6b38a5ec7da27e27e90a15cbad36b8fd2fd8054 + checksum: 23f93540537ca4c035425bb8d5e51b11131fbc921d7ac1d041d0ae557feac8c877f3a012d36b94df8787803f52ed81e6df9257ac9e58719875f7805518d6db3f + languageName: node + linkType: hard + +"react-refresh@npm:^0.14.0": + version: 0.14.0 + resolution: "react-refresh@npm:0.14.0" + checksum: b8ae07ad153357d77830928a7f1fc2df837aabefee907fa273ba04c7643f3b860e986f1d4b7ada9b721c8d79b8c24b5b911a314a1a2398b105f1b13d19ea2b8d languageName: node linkType: hard @@ -25662,23 +24749,6 @@ __metadata: languageName: node linkType: hard -"react-style-singleton@npm:^2.2.1": - version: 2.2.1 - resolution: "react-style-singleton@npm:2.2.1" - dependencies: - get-nonce: "npm:^1.0.0" - invariant: "npm:^2.2.4" - tslib: "npm:^2.0.0" - 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 - checksum: 6d66f3bdb65e1ec79089f80314da97c9a005087a04ee034255a5de129a4c0d9fd0bf99fa7bf642781ac2dc745ca687aae3de082bd8afdd0d117bc953241e15ad - languageName: node - linkType: hard - "react-syntax-highlighter@npm:^15.4.5, react-syntax-highlighter@npm:^15.5.0": version: 15.5.0 resolution: "react-syntax-highlighter@npm:15.5.0" @@ -25694,20 +24764,6 @@ __metadata: languageName: node linkType: hard -"react-test-renderer@npm:^16, react-test-renderer@npm:^16.0.0-0": - version: 16.14.0 - resolution: "react-test-renderer@npm:16.14.0" - dependencies: - object-assign: "npm:^4.1.1" - prop-types: "npm:^15.6.2" - react-is: "npm:^16.8.6" - scheduler: "npm:^0.19.1" - peerDependencies: - react: ^16.14.0 - checksum: 119e3ce5509c3443393ca750e39dd4ac9ee9ddfaafca58c9067b477447edc2badb75660b9fea7e9ddef012e37bbba427681cf6f8d3fde61b8054655a133bfbf5 - languageName: node - linkType: hard - "react-textarea-autosize@npm:^8.3.0": version: 8.5.3 resolution: "react-textarea-autosize@npm:8.5.3" @@ -25721,14 +24777,27 @@ __metadata: languageName: node linkType: hard -"react@npm:^16.14.0, react@npm:^16.8.0": - version: 16.14.0 - resolution: "react@npm:16.14.0" +"react-transition-group@npm:^4.4.5": + version: 4.4.5 + resolution: "react-transition-group@npm:4.4.5" dependencies: - loose-envify: "npm:^1.1.0" - object-assign: "npm:^4.1.1" + "@babel/runtime": "npm:^7.5.5" + dom-helpers: "npm:^5.0.1" + loose-envify: "npm:^1.4.0" prop-types: "npm:^15.6.2" - checksum: df8faae43e01387013900e8f8fb3c4ce9935b7edbcbaa77e12999c913eb958000a0a8750bf9a0886dae0ad768dd4a4ee983752d5bade8d840adbe0ce890a2438 + peerDependencies: + react: ">=16.6.0" + react-dom: ">=16.6.0" + checksum: 2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 + languageName: node + linkType: hard + +"react@npm:^18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 languageName: node linkType: hard @@ -25788,7 +24857,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -25933,13 +25002,6 @@ __metadata: languageName: node linkType: hard -"reflect.ownkeys@npm:^0.2.0": - version: 0.2.0 - resolution: "reflect.ownkeys@npm:0.2.0" - checksum: 169f20287ad33b76fc8b6932734b3e1469ee59f31d8357858e96718a6f71fa60d7a13f2fc4e9191e47c2a51e4183151290f3a35315ba461190d87b0593725557 - languageName: node - linkType: hard - "refractor@npm:^3.6.0": version: 3.6.0 resolution: "refractor@npm:3.6.0" @@ -25967,13 +25029,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.11.0": - version: 0.11.1 - resolution: "regenerator-runtime@npm:0.11.1" - checksum: 69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.13.11, regenerator-runtime@npm:^0.13.2, regenerator-runtime@npm:^0.13.4, regenerator-runtime@npm:^0.13.9": version: 0.13.11 resolution: "regenerator-runtime@npm:0.13.11" @@ -26014,7 +25069,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": +"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": version: 1.5.1 resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: @@ -26601,16 +25656,29 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.22.8": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.4": - version: 2.0.0-next.4 - resolution: "resolve@npm:2.0.0-next.4" + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" dependencies: - is-core-module: "npm:^2.9.0" + is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 1de92669e7c46cfe125294c66d5405e13288bb87b97e9bdab71693ceebbcc0255c789bde30e2834265257d330d8ff57414d7d88e3097d8f69951f3ce978bf045 + checksum: a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a languageName: node linkType: hard @@ -26640,16 +25708,29 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^2.0.0-next.4#optional!builtin": - version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#optional!builtin::version=2.0.0-next.4&hash=c3c19d" + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" dependencies: - is-core-module: "npm:^2.9.0" + is-core-module: "npm:^2.13.0" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: ed2bb51d616b9cd30fe85cf49f7a2240094d9fa01a221d361918462be81f683d1855b7f192391d2ab5325245b42464ca59690db5bd5dad0a326fc0de5974dd10 + checksum: 78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 languageName: node linkType: hard @@ -26784,16 +25865,6 @@ __metadata: languageName: node linkType: hard -"rst-selector-parser@npm:^2.2.3": - version: 2.2.3 - resolution: "rst-selector-parser@npm:2.2.3" - dependencies: - lodash.flattendeep: "npm:^4.4.0" - nearley: "npm:^2.7.10" - checksum: b631aca2cb451fbde8d78dbc9a9479f20f1f40565cd8eb63773cb6e2a395ed87b392291986b84c2c7da68b70084e3469fbe958261300a10dff41c87fa3bc58aa - languageName: node - linkType: hard - "rsvp@npm:^3.0.14, rsvp@npm:^3.0.18": version: 3.6.2 resolution: "rsvp@npm:3.6.2" @@ -26831,7 +25902,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:7.8.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.0": +"rxjs@npm:7.8.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -26840,7 +25911,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^6.5.2, rxjs@npm:^6.6.3": +"rxjs@npm:^6.5.2": version: 6.6.7 resolution: "rxjs@npm:6.6.7" dependencies: @@ -27027,13 +26098,12 @@ __metadata: languageName: unknown linkType: soft -"scheduler@npm:^0.19.1": - version: 0.19.1 - resolution: "scheduler@npm:0.19.1" +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" dependencies: loose-envify: "npm:^1.1.0" - object-assign: "npm:^4.1.1" - checksum: 9658932a73148a93d791c064b331d9690ddfecc4de25bcd6c9b89f5f1166e3d23d9c31c1595d66565e5ffbb34d47035cb14841aba6444bc266bfcd215cefe9c0 + checksum: b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd languageName: node linkType: hard @@ -27075,11 +26145,12 @@ __metadata: linkType: hard "selfsigned@npm:^2.1.1": - version: 2.1.1 - resolution: "selfsigned@npm:2.1.1" + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" dependencies: + "@types/node-forge": "npm:^1.3.0" node-forge: "npm:^1" - checksum: 4a2509c8a5bd49c3630a799de66b317352b52746bec981133d4f8098365da35d2344f0fbedf14aacf2cd1e88682048e2df11ad9dc59331d3b1c0a5ec3e6e16ad + checksum: 521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 languageName: node linkType: hard @@ -27097,7 +26168,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.6.0, semver@npm:^5.7.0, semver@npm:^5.7.1": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -27201,6 +26272,18 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: "npm:^1.1.1" + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -27322,7 +26405,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3": +"shell-quote@npm:^1.8.1": version: 1.8.1 resolution: "shell-quote@npm:1.8.1" checksum: 8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a @@ -27442,7 +26525,7 @@ __metadata: languageName: node linkType: hard -"slash@npm:^5.0.0": +"slash@npm:^5.0.0, slash@npm:^5.1.0": version: 5.1.0 resolution: "slash@npm:5.1.0" checksum: eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 @@ -27531,7 +26614,18 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.6.2": +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + languageName: node + linkType: hard + +"socks@npm:^2.6.2, socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" dependencies: @@ -27605,7 +26699,7 @@ __metadata: languageName: node linkType: hard -"source-map-resolve@npm:^0.5.0, source-map-resolve@npm:^0.5.2": +"source-map-resolve@npm:^0.5.0": version: 0.5.3 resolution: "source-map-resolve@npm:0.5.3" dependencies: @@ -27676,7 +26770,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.7.4, source-map@npm:^0.7.3": +"source-map@npm:0.7.4, source-map@npm:^0.7.3, source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc @@ -27748,9 +26842,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.15 - resolution: "spdx-license-ids@npm:3.0.15" - checksum: 1d44fa43d2024d4533816ceffac983149f9c76214698033496e13f6224d7fe6e61649a2bb9eb6c88b5f7f71bc19cc5f0aed3dba75b430e27c06e0f71cc251959 + version: 3.0.16 + resolution: "spdx-license-ids@npm:3.0.16" + checksum: 7d88b8f01308948bb3ea69c066448f2776cf3d35a410d19afb836743086ced1566f6824ee8e6d67f8f25aa81fa86d8076a666c60ac4528caecd55e93edb5114e languageName: node linkType: hard @@ -27820,13 +26914,6 @@ __metadata: languageName: node linkType: hard -"ssim.js@npm:^3.1.1": - version: 3.5.0 - resolution: "ssim.js@npm:3.5.0" - checksum: 9e7101da17395d3acbd417aac712d8f156522e79059a27cb38882eedd5a8868e31871c8f58bec3a150f8cf0660883cf22310cbd2fd63b408c1fd0ab02fda9fbc - languageName: node - linkType: hard - "ssri@npm:^10.0.0": version: 10.0.5 resolution: "ssri@npm:10.0.5" @@ -27949,12 +27036,12 @@ __metadata: linkType: hard "streamx@npm:^2.15.0": - version: 2.15.1 - resolution: "streamx@npm:2.15.1" + version: 2.15.5 + resolution: "streamx@npm:2.15.5" dependencies: fast-fifo: "npm:^1.1.0" queue-tick: "npm:^1.0.1" - checksum: e3b0e997726a2a499e1069efea7d720e54fc262011dfcb32e6704f90b5a31bb55b8f48964649d787be03d8718dcf9aa413d24ce48823d92fcbad06a3c337ec61 + checksum: 7998d1fa3324131ed94efc4a4e8b22e0f60267b21d8f8fac8c605eaa1a6d6358adbc38c35b407be0eb8cc09a223c641962afb0db29ecbe92118242118946d93c languageName: node linkType: hard @@ -28049,7 +27136,7 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.1, string.prototype.trim@npm:^1.2.8": +"string.prototype.trim@npm:^1.2.8": version: 1.2.8 resolution: "string.prototype.trim@npm:1.2.8" dependencies: @@ -28375,8 +27462,8 @@ __metadata: linkType: hard "svelte-preprocess@npm:^5.0.4": - version: 5.0.4 - resolution: "svelte-preprocess@npm:5.0.4" + version: 5.1.1 + resolution: "svelte-preprocess@npm:5.1.1" dependencies: "@types/pug": "npm:^2.0.6" detect-indent: "npm:^6.1.0" @@ -28393,7 +27480,7 @@ __metadata: sass: ^1.26.8 stylus: ^0.55.0 sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 - svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 typescript: ">=3.9.5 || ^4.0.0 || ^5.0.0" peerDependenciesMeta: "@babel/core": @@ -28416,13 +27503,13 @@ __metadata: optional: true typescript: optional: true - checksum: 1ed64b96a91327a47992df0b82df708b5cda92e1da211edbedaf411e633a0be5a8425d19f996abc8dcef52dadd26b5474924dd9eeb30a7b409bf60c33b689d6c + checksum: 8de6571ddca032dc7a33c37a6cd7caa72eeabf6acbe81924e26f14e9f5de8bbf2806c86d1ac3cb435923c3953d0d9365dfbe2a8c94cd3b383ecfe50957e1b8f9 languageName: node linkType: hard "svelte@npm:^4.0.0": - version: 4.2.1 - resolution: "svelte@npm:4.2.1" + version: 4.2.7 + resolution: "svelte@npm:4.2.7" dependencies: "@ampproject/remapping": "npm:^2.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.15" @@ -28435,9 +27522,9 @@ __metadata: estree-walker: "npm:^3.0.3" is-reference: "npm:^3.0.1" locate-character: "npm:^3.0.0" - magic-string: "npm:^0.30.0" + magic-string: "npm:^0.30.4" periscopic: "npm:^3.1.0" - checksum: 5262dfceb99809a7ed01addc684351ac297dc2967b49dc99563af646c113c33a1535fe6ea5b9af4c6986880b6803ac0ca4fecb15a65bb18b641929c400d5dead + checksum: 7b03510364eea130c070b15066f66c82db29504c15e6e9678b709117ac47508c173709e75df418506cde3ac5e72571956df365168add41f97b13ae714039cdae languageName: node linkType: hard @@ -28557,7 +27644,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.13, tar@npm:^6.1.2": +"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.0": version: 6.2.0 resolution: "tar@npm:6.2.0" dependencies: @@ -28659,8 +27746,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.16.8": - version: 5.21.0 - resolution: "terser@npm:5.21.0" + version: 5.24.0 + resolution: "terser@npm:5.24.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -28668,7 +27755,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: f14ee816b668e014a2a37f4d00c2d9038374be56f0a141d4eb386b316c5645f49bb038a6b78f75353e9745d622dc66a1d6368aea5b08d46489b57dbf195f761c + checksum: 9a73ae528210242593d8bbc46af8a235fb0a7607707910a7c5cb85a7d2692d0780019dcbf34734b3cb2591111cc41628f1dce1608dccd3201b6843458ebe9e00 languageName: node linkType: hard @@ -28707,7 +27794,7 @@ __metadata: languageName: node linkType: hard -"through@npm:^2.3.4, through@npm:^2.3.6, through@npm:^2.3.8": +"through@npm:^2.3.4, through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc @@ -28843,9 +27930,9 @@ __metadata: linkType: hard "tocbot@npm:^4.20.1": - version: 4.21.1 - resolution: "tocbot@npm:4.21.1" - checksum: 9a3efd1e7555281872102d54bc8c683b030d341bb2d94b5e6b0fd9dea7545648ae20d5fc887c3943e073471276ad330e720b08a622cf0bf758ee668bc860f5b5 + version: 4.23.0 + resolution: "tocbot@npm:4.23.0" + checksum: e112c569913600b98a451fc114ba293c7365e529b6b22c34a4ba244a22a359d79aaafb0c752022b1c9a6e2d04692e436700c0b95d534da9ee31c0f310e96761b languageName: node linkType: hard @@ -29007,17 +28094,18 @@ __metadata: linkType: hard "ts-loader@npm:^9.2.8": - version: 9.4.4 - resolution: "ts-loader@npm:9.4.4" + version: 9.5.1 + resolution: "ts-loader@npm:9.5.1" dependencies: chalk: "npm:^4.1.0" enhanced-resolve: "npm:^5.0.0" micromatch: "npm:^4.0.0" semver: "npm:^7.3.4" + source-map: "npm:^0.7.4" peerDependencies: typescript: "*" webpack: ^5.0.0 - checksum: 11dba0651d7177eba9af38c43c79a28898ffcdfe7e73079fe48716dd93ca6634d3140dbbbc3ac34907be564be2429f0299ebdc7b58ce09482fad54333ccf611c + checksum: 7dc1e3e5d3d032b6ef27836032f02c57077dfbcdf5817cbbc16b7b8609e7ed1d0ec157a03eaac07960161d8ad4a9e030c4d6722fe33540cf6ee75156c7f9c33d languageName: node linkType: hard @@ -29299,23 +28387,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9.3, typescript@npm:~4.9.3": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 5f6cad2e728a8a063521328e612d7876e12f0d8a8390d3b3aaa452a6a65e24e9ac8ea22beb72a924fd96ea0a49ea63bb4e251fb922b12eedfb7f7a26475e5c56 - languageName: node - linkType: hard - -"typescript@npm:^5.0.3, typescript@npm:^5.0.4": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" +"typescript@npm:^5.0.3, typescript@npm:^5.3.2": + version: 5.3.2 + resolution: "typescript@npm:5.3.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 91ae3e6193d0ddb8656d4c418a033f0f75dec5e077ebbc2bd6d76439b93f35683936ee1bdc0e9cf94ec76863aa49f27159b5788219b50e1cd0cd6d110aa34b07 + checksum: d7dbe1fbe19039e36a65468ea64b5d338c976550394ba576b7af9c68ed40c0bc5d12ecce390e4b94b287a09a71bd3229f19c2d5680611f35b7c53a3898791159 languageName: node linkType: hard @@ -29329,23 +28407,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.9.3#optional!builtin, typescript@patch:typescript@npm%3A~4.9.3#optional!builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: e3333f887c6829dfe0ab6c1dbe0dd1e3e2aeb56c66460cb85c5440c566f900c833d370ca34eb47558c0c69e78ced4bfe09b8f4f98b6de7afed9b84b8d1dd06a1 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.0.3#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" +"typescript@patch:typescript@npm%3A^5.0.3#optional!builtin, typescript@patch:typescript@npm%3A^5.3.2#optional!builtin": + version: 5.3.2 + resolution: "typescript@patch:typescript@npm%3A5.3.2#optional!builtin::version=5.3.2&hash=29ae49" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 062c1cee1990e6b9419ce8a55162b8dc917eb87f807e4de0327dbc1c2fa4e5f61bc0dd4e034d38ff541d1ed0479b53bcee8e4de3a4075c51a1724eb6216cb6f5 + checksum: c81b9bd20c6dbe90fa43e876c586021447f2b47baede9fa542b1f56715835c043e23b2eaf19c42c067cc6f5ae512bd9a9be28a67b3a1d9807f8c9cfb1269875e languageName: node linkType: hard @@ -29370,16 +28438,6 @@ __metadata: languageName: node linkType: hard -"unbzip2-stream@npm:^1.3.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: "npm:^5.2.1" - through: "npm:^2.3.8" - checksum: 2ea2048f3c9db3499316ccc1d95ff757017ccb6f46c812d7c42466247e3b863fb178864267482f7f178254214247779daf68e85f50bd7736c3c97ba2d58b910a - languageName: node - linkType: hard - "underscore.string@npm:~3.3.4": version: 3.3.6 resolution: "underscore.string@npm:3.3.6" @@ -29390,6 +28448,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -29698,9 +28763,9 @@ __metadata: linkType: hard "universal-user-agent@npm:^6.0.0": - version: 6.0.0 - resolution: "universal-user-agent@npm:6.0.0" - checksum: ebeb0206963666c13bcf9ebc86d0577c7daed5870c05cd34d4972ee7a43b9ef20679baf2a8c83bf1b71d899bae67243ac4982d84ddaf9ba0355ff76595819961 + version: 6.0.1 + resolution: "universal-user-agent@npm:6.0.1" + checksum: 5c9c46ffe19a975e11e6443640ed4c9e0ce48fcc7203325757a8414ac49940ebb0f4667f2b1fa561489d1eb22cb2d05a0f7c82ec20c5cba42e58e188fb19b187 languageName: node linkType: hard @@ -29719,9 +28784,9 @@ __metadata: linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 07092b9f46df61b823d8ab5e57f0ee5120c178b39609a95e4a15a98c42f6b0b8e834e66fbb47ff92831786193be42f1fd36347169b88ce8639d0f9670af24a71 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a languageName: node linkType: hard @@ -29733,14 +28798,14 @@ __metadata: linkType: hard "unplugin@npm:^1.3.1": - version: 1.5.0 - resolution: "unplugin@npm:1.5.0" + version: 1.5.1 + resolution: "unplugin@npm:1.5.1" dependencies: - acorn: "npm:^8.10.0" + acorn: "npm:^8.11.2" chokidar: "npm:^3.5.3" webpack-sources: "npm:^3.2.3" - webpack-virtual-modules: "npm:^0.5.0" - checksum: 2f79a7bf6b428a6aac80bf21852ed83cafead0ae3ed8866db1dca1cd4489f3b50c95874275e9a9b0f10c2e3c4892bfe0431c70d13635775c4c620a6a3f9eae37 + webpack-virtual-modules: "npm:^0.6.0" + checksum: 08cee7d100de3b8697d33eaa32405d821d0f51600640ce79e26f4258ddedcd9ac4c022f0453d6d978e9f75fd939ba9553440827987b2b03078f7087f4bef7c96 languageName: node linkType: hard @@ -29826,29 +28891,14 @@ __metadata: linkType: hard "urql@npm:^4.0.3": - version: 4.0.5 - resolution: "urql@npm:4.0.5" + version: 4.0.6 + resolution: "urql@npm:4.0.6" dependencies: - "@urql/core": "npm:^4.1.0" + "@urql/core": "npm:^4.2.0" wonka: "npm:^6.3.2" peerDependencies: react: ">= 16.8.0" - checksum: 9560d04b3c2fe72c921bdb21e969039b776e07999704d23bce35f815eb537c9357b6c7322a1b8cd43957550798c30cd15f5130ddd054dfd8a890d17d2be85282 - languageName: node - linkType: hard - -"use-callback-ref@npm:^1.3.0": - version: 1.3.0 - resolution: "use-callback-ref@npm:1.3.0" - dependencies: - tslib: "npm:^2.0.0" - 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 - checksum: 8a0867ffd441f358c66d79567970a745cc78ac2f98840a81c1fa749a525e8716116c645497d886a815e1dcf40ad81a107ebd6a7d15fd9ab5925c44a994a1d89a + checksum: d3d952c5a1f288e6c9c24a0ffb694893133d3c8b0d1237109ce96b460697a6f4536a494b5ec70e690660cacbd9c149461d1811d33482f4ca2126ea96560c4332 languageName: node linkType: hard @@ -29899,22 +28949,6 @@ __metadata: languageName: node linkType: hard -"use-sidecar@npm:^1.1.2": - version: 1.1.2 - resolution: "use-sidecar@npm:1.1.2" - dependencies: - detect-node-es: "npm:^1.1.0" - tslib: "npm:^2.0.0" - peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 89f0018fd9aee1fc17c85ac18c4bf8944d460d453d0d0e04ddbc8eaddf3fa591e9c74a1f8a438a1bff368a7a2417fab380bdb3df899d2194c4375b0982736de0 - languageName: node - linkType: hard - "use@npm:^3.1.0": version: 3.1.1 resolution: "use@npm:3.1.1" @@ -30028,13 +29062,13 @@ __metadata: linkType: hard "v8-to-istanbul@npm:^9.0.0": - version: 9.1.3 - resolution: "v8-to-istanbul@npm:9.1.3" + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.12" "@types/istanbul-lib-coverage": "npm:^2.0.1" convert-source-map: "npm:^2.0.0" - checksum: 7acfc460731b629a0d547b231e9d510aaa826df67f4deeaeeb991b492f78faf3bb1aa4b54fa0f9b06d815bc69eb0a04a6c2180c16ba43a83cc5e5490fa160a96 + checksum: e691ba4dd0dea4a884e52c37dbda30cce6f9eeafe9b26721e449429c6bb0f4b6d1e33fabe7711d0f67f7a34c3bfd56c873f7375bba0b1534e6a2843ce99550e5 languageName: node linkType: hard @@ -30202,8 +29236,8 @@ __metadata: linkType: hard "vite@npm:^4.0.0, vite@npm:^4.0.4": - version: 4.4.10 - resolution: "vite@npm:4.4.10" + version: 4.5.0 + resolution: "vite@npm:4.5.0" dependencies: esbuild: "npm:^0.18.10" fsevents: "npm:~2.3.2" @@ -30237,19 +29271,19 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: d1359f147eb84aad9922460848184f14295e76f335ab03f90a585886ff070e1a7c74996022b3bb07da0a3130c9829565b5556e6eb1d0db12a8aad26f3694d445 + checksum: 7e21e9e4b80656ae5ee61e8c5edb5e8f589139c2b22c43e89d054c65a0194f1c1ef066fbc770204173c7eb244c798265042f988adda5880ad74337a053b28b7f languageName: node linkType: hard "vitefu@npm:^0.2.4": - version: 0.2.4 - resolution: "vitefu@npm:0.2.4" + version: 0.2.5 + resolution: "vitefu@npm:0.2.5" peerDependencies: - vite: ^3.0.0 || ^4.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: vite: optional: true - checksum: 78d5e7071c0c4fdfc010f15a3e5bac2d31090ddd48789446fce5b7d0f01496fc6a041b65d3add904365bb0ac6576bb93635f700971c16ffd27cd7c0bee9eb1ae + checksum: 5781ece3025b6be0eb87ee7d97760a7721b1c6c5ad60ede5f37c86393ece3c8fce4245472f62368eb192448034086e25bdcadf098eefc271277176ab9a430204 languageName: node linkType: hard @@ -30302,31 +29336,22 @@ __metadata: linkType: hard "vscode-uri@npm:^3.0.3": - version: 3.0.7 - resolution: "vscode-uri@npm:3.0.7" - checksum: 67bc15bc9c9bd2d70dae8b27f2a3164281c6ee8f6484e6c5945a44d89871da93d52f2ba339ebc12ab0c10991d4576171b5d85e49a542454329c16faf977e4c59 - languageName: node - linkType: hard - -"vue-class-component@npm:^7.1.0": - version: 7.2.6 - resolution: "vue-class-component@npm:7.2.6" - peerDependencies: - vue: ^2.0.0 - checksum: 2c187815e3569b4836929dc45ace5715398c4037312ef5fc27da9cb12fbbc21cabbdfc5fb678451ad45321ffabacbd184907e33db2539c13963c00883a6645c1 + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: f7f217f526bf109589969fe6e66b71e70b937de1385a1d7bb577ca3ee7c5e820d3856a86e9ff2fa9b7a0bc56a3dd8c3a9a557d3fedd7df414bc618d5e6b567f9 languageName: node linkType: hard "vue-component-type-helpers@npm:latest": - version: 1.8.15 - resolution: "vue-component-type-helpers@npm:1.8.15" - checksum: 3397faf50844e31d92a29a44616088408cf6eb8b6c88b7deb8841c4bc78e8e258fafbb7052b100e52ebea5d1c4e826b7247b2c48f6f3c330addd53132db141f9 + version: 1.8.22 + resolution: "vue-component-type-helpers@npm:1.8.22" + checksum: 31b34ecdc4de3c69fb73802530380db1676497bda4e0ecb37ab098ebfbcad05bebd15b713520033866c0c1ddb6c56ff79d727b0a6777947dfcc434aaca3b11e2 languageName: node linkType: hard "vue-docgen-api@npm:^4.40.0, vue-docgen-api@npm:^4.44.23, vue-docgen-api@npm:^4.46.0": - version: 4.74.2 - resolution: "vue-docgen-api@npm:4.74.2" + version: 4.75.1 + resolution: "vue-docgen-api@npm:4.75.1" dependencies: "@babel/parser": "npm:^7.21.4" "@babel/types": "npm:^7.21.4" @@ -30341,7 +29366,7 @@ __metadata: vue-inbrowser-compiler-independent-utils: "npm:^4.69.0" peerDependencies: vue: ">=2" - checksum: 9985c3910a40090796cd7f9ca9642134a2001e2afe5dcd6527c559f4e4e912abd45f3559d16801224ba5758551c64b7da61a8300b3a54618f1b8f7da319539cd + checksum: 5351000af100c08989bfe8daf6b396ec57247e9f5eb22e06c81cfc6ac694b2a2159c9abaa15409818a0a3e85887b4a3a64f9bca091b8f94e26bfe15a6849146a languageName: node linkType: hard @@ -30376,35 +29401,9 @@ __metadata: languageName: node linkType: hard -"vue-jest@npm:^5.0.0-alpha.8": - version: 5.0.0-alpha.10 - resolution: "vue-jest@npm:5.0.0-alpha.10" - dependencies: - "@babel/plugin-transform-modules-commonjs": "npm:^7.2.0" - chalk: "npm:^2.1.0" - convert-source-map: "npm:^1.6.0" - extract-from-css: "npm:^0.4.4" - source-map: "npm:0.5.6" - tsconfig: "npm:^7.0.0" - peerDependencies: - "@babel/core": 7.x - babel-jest: ">= 24 < 27" - jest: ">= 24 < 27 " - ts-jest: ">= 24 < 27 " - typescript: ">= 3.x" - vue: ^3.0.0-0 - peerDependenciesMeta: - ts-jest: - optional: true - typescript: - optional: true - checksum: dd2dabd4ab4030d7fe567304ba035f61e0abe48501a18b9a3e331e60aac44a03f782746859347ea0cfeb906b8dcf5d5ca58b854c9656ea2feee08e8f00f7c54b - languageName: node - linkType: hard - "vue-loader@npm:^15.7.0": - version: 15.10.2 - resolution: "vue-loader@npm:15.10.2" + version: 15.11.1 + resolution: "vue-loader@npm:15.11.1" dependencies: "@vue/component-compiler-utils": "npm:^3.1.0" hash-sum: "npm:^1.0.2" @@ -30421,7 +29420,7 @@ __metadata: optional: true vue-template-compiler: optional: true - checksum: 1c147ccfd08e047c6a71032c5a11eed6d7e24c7e6ddf5061aa8d234f9cde454b7ba45fd1251c5fd99d1a3f7fb7584f8e605ae4c95ec1c6a6307598c044b05e48 + checksum: 22491414f3743d485cf8d966837314706abf35d330bf055e356d55f16df8d4ab21fb712c7168509f7492d62cdf799aedf8d31df36d89bd5a4479b9f90fa094c1 languageName: node linkType: hard @@ -30438,15 +29437,6 @@ __metadata: languageName: node linkType: hard -"vue-property-decorator@npm:8.3.0": - version: 8.3.0 - resolution: "vue-property-decorator@npm:8.3.0" - dependencies: - vue-class-component: "npm:^7.1.0" - checksum: 8e0c9ece0a5bb2e8b24bfa9f6516731feabe44773bf75bfdf66ce5cbb59c30fc837d4dbe2b2edf991b12d78fc75b57a76346ca658d561172935eb51db244fc3d - languageName: node - linkType: hard - "vue-style-loader@npm:^4.1.0": version: 4.1.3 resolution: "vue-style-loader@npm:4.1.3" @@ -30458,12 +29448,12 @@ __metadata: linkType: hard "vue-template-compiler@npm:^2.6.14, vue-template-compiler@npm:^2.7.14": - version: 2.7.14 - resolution: "vue-template-compiler@npm:2.7.14" + version: 2.7.15 + resolution: "vue-template-compiler@npm:2.7.15" dependencies: de-indent: "npm:^1.0.2" he: "npm:^1.2.0" - checksum: 7f261b40d088c76ce9c66dde29220d0e5df43f974895a0aee97347ac48ed0958c21272dcdf8b163dcc2b9688eca528c1d72d12b3b8b1dcae1dde6a306d7cbb20 + checksum: a826e8a733281d8d9a4b05b0fe039d56ebf9f94ea5bd2ae39641fd98fa313cf4be1415b3cfa4339ffde1f6b158283d05770eae86840c105e8a5887764759b9f2 languageName: node linkType: hard @@ -30475,17 +29465,17 @@ __metadata: linkType: hard "vue-tsc@npm:latest": - version: 1.8.15 - resolution: "vue-tsc@npm:1.8.15" + version: 1.8.22 + resolution: "vue-tsc@npm:1.8.22" dependencies: - "@vue/language-core": "npm:1.8.15" - "@vue/typescript": "npm:1.8.15" - semver: "npm:^7.3.8" + "@volar/typescript": "npm:~1.10.5" + "@vue/language-core": "npm:1.8.22" + semver: "npm:^7.5.4" peerDependencies: typescript: "*" bin: vue-tsc: bin/vue-tsc.js - checksum: 18092627141afcef9515701ea85beae564bc31258358d3b0eb7a3ae5167559ac56d8e218a0490661bae91a4f496d1351f9431074820473206dda9d0c50998216 + checksum: c58ebd9d9c1b10152b94b58ade850c34de75e241491c679f136b4c5a00d87ecc38460178d6721f7a39f86b43fc8abea4c94b6f8514191447eeb2a3a4c2d036a4 languageName: node linkType: hard @@ -30508,25 +29498,30 @@ __metadata: linkType: hard "vue@npm:^2.6.12, vue@npm:^2.7.10": - version: 2.7.14 - resolution: "vue@npm:2.7.14" + version: 2.7.15 + resolution: "vue@npm:2.7.15" dependencies: - "@vue/compiler-sfc": "npm:2.7.14" + "@vue/compiler-sfc": "npm:2.7.15" csstype: "npm:^3.1.0" - checksum: 8eb326718c445eb5900d08e2f5a2d86b493d475d3a79f49695066092afa3176d2aad4db98682b3c5432f6fffb92719a124b7e137264e71d5b9be14d5193222c6 + checksum: 92bc7bcef1a54fe6b98409a7094f7c8b1f4b8fcf52469380f130d0d671d581130b1ef8715f0e95020fc5dbffff7f519a0621206484b3fdee5e6319a76073fb0c languageName: node linkType: hard "vue@npm:^3.2.33, vue@npm:^3.2.47": - version: 3.3.4 - resolution: "vue@npm:3.3.4" + version: 3.3.9 + resolution: "vue@npm:3.3.9" dependencies: - "@vue/compiler-dom": "npm:3.3.4" - "@vue/compiler-sfc": "npm:3.3.4" - "@vue/runtime-dom": "npm:3.3.4" - "@vue/server-renderer": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: cc1a3ae13bd66a84ed6c45af33f8045ec551ac44bdd44ad5b25b08ef34d1737c3d43584d84ac19108f58602b5ba8f2483eee65d51760715589ff118b0c14d6df + "@vue/compiler-dom": "npm:3.3.9" + "@vue/compiler-sfc": "npm:3.3.9" + "@vue/runtime-dom": "npm:3.3.9" + "@vue/server-renderer": "npm:3.3.9" + "@vue/shared": "npm:3.3.9" + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 46a9b363e208e0103162117bf8cd4820bfd844066502adc9106f075c4f67b15599ccabc9cd15971e43514eb446662cebb80cdcaf5f46f3b06b197e3aad410105 languageName: node linkType: hard @@ -30558,17 +29553,17 @@ __metadata: linkType: hard "wait-on@npm:^7.0.1": - version: 7.0.1 - resolution: "wait-on@npm:7.0.1" + version: 7.2.0 + resolution: "wait-on@npm:7.2.0" dependencies: - axios: "npm:^0.27.2" - joi: "npm:^17.7.0" + axios: "npm:^1.6.1" + joi: "npm:^17.11.0" lodash: "npm:^4.17.21" - minimist: "npm:^1.2.7" - rxjs: "npm:^7.8.0" + minimist: "npm:^1.2.8" + rxjs: "npm:^7.8.1" bin: wait-on: bin/wait-on - checksum: 2a9c56d26dac573e6bfd36e85d99f072021c23dc2c0faab900a411460b58e16982b96b018d9168c366040f56196314fa46f3d79ef19e3dc38f55824d5035f2ec + checksum: 1eff2189b3e4b0975889f3e480c75ca2a0d4275072779a6329e7cae8b729620594aa044509ddd89967de6ab2162169501b67b8d9562c16cac517837ffce17337 languageName: node linkType: hard @@ -30841,7 +29836,51 @@ __metadata: languageName: node linkType: hard -"webpack@npm:5, webpack@npm:5.88.2, webpack@npm:^5, webpack@npm:^5.65.0": +"webpack-virtual-modules@npm:^0.6.0": + version: 0.6.1 + resolution: "webpack-virtual-modules@npm:0.6.1" + checksum: 696bdc1acf3806374bdeb4b9b9856b79ee70b31e92f325dfab9b8c8c7e14bb6ddffa9f895a214770c4fb8fea45a21f34ca64310f74e877292a90f4a9966c9c2f + languageName: node + linkType: hard + +"webpack@npm:5, webpack@npm:^5, webpack@npm:^5.65.0": + version: 5.89.0 + resolution: "webpack@npm:5.89.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.0" + "@webassemblyjs/ast": "npm:^1.11.5" + "@webassemblyjs/wasm-edit": "npm:^1.11.5" + "@webassemblyjs/wasm-parser": "npm:^1.11.5" + acorn: "npm:^8.7.1" + acorn-import-assertions: "npm:^1.9.0" + browserslist: "npm:^4.14.5" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.15.0" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.9" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.7" + watchpack: "npm:^2.4.0" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 2562bf48788d651634fb7db6a5378c2fe3fce7f66831af38468da3944bd98756d68efea94a6909593993fb57b2d14cf802cbef2c83c6ef0047f7f606d59bec50 + languageName: node + linkType: hard + +"webpack@npm:5.88.2": version: 5.88.2 resolution: "webpack@npm:5.88.2" dependencies: @@ -31031,6 +30070,19 @@ __metadata: languageName: node linkType: hard +"which-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "which-typed-array@npm:1.1.13" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.4" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + checksum: 9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 + languageName: node + linkType: hard + "which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -31064,6 +30116,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + "wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -31217,16 +30280,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^6.1.0": - version: 6.2.2 - resolution: "ws@npm:6.2.2" - dependencies: - async-limiter: "npm:~1.0.0" - checksum: d628a1e95668a296644b4f51ce5debb43d9f1d89ebb2e32fef205a685b9439378eb824d60ce3a40bbc3bad0e887d84a56b343f2076f48d74f17c4c0800c42967 - languageName: node - linkType: hard - -"ws@npm:^7.2.3, ws@npm:^7.4.6": +"ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -31378,9 +30432,9 @@ __metadata: linkType: hard "yaml@npm:^2.0.0, yaml@npm:^2.3.1": - version: 2.3.2 - resolution: "yaml@npm:2.3.2" - checksum: c2aac464015f037911c5b819475e81e52119e5495e3d43fe7cb82b5a84d59d66a86049dc85d8e90658636c1c04dde177ae196818deaf76c1bda4d34209d5c087 + version: 2.3.4 + resolution: "yaml@npm:2.3.4" + checksum: cf03b68f8fef5e8516b0f0b54edaf2459f1648317fc6210391cf606d247e678b449382f4bd01f77392538429e306c7cba8ff46ff6b37cac4de9a76aff33bd9e1 languageName: node linkType: hard @@ -31485,16 +30539,6 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - fd-slicer: "npm:~1.1.0" - checksum: f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 - languageName: node - linkType: hard - "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" diff --git a/docs/addons/addon-types.md b/docs/addons/addon-types.md index 10be1afd1c9b..c189c090d815 100644 --- a/docs/addons/addon-types.md +++ b/docs/addons/addon-types.md @@ -52,7 +52,7 @@ The `icon` element used in the example loads the icons from the `@storybook/comp ### Tabs -Tab addons allow you to create your own custom tabs in Storybook. For example, the official [@storybook/addon-docs](../writing-docs/introduction.md) uses this pattern. +Tab addons allow you to create your own custom tabs in Storybook. For example, the official [@storybook/addon-docs](../writing-docs/index.md) uses this pattern. ![Storybook tab addon](./storybook-tab.png) diff --git a/docs/addons/addons-api.md b/docs/addons/addons-api.md index 42a3ccdbc24d..e73907d61c87 100644 --- a/docs/addons/addons-api.md +++ b/docs/addons/addons-api.md @@ -243,19 +243,19 @@ This method allows you to override the default Storybook UI configuration (e.g., The following table details how to use the API values: -| Name | Type | Description | Example Value | -| ------------------- | :-----------: | :------------------------------------------------: | :-----------------------------------: | -| **isFullscreen** | Boolean | Show story component as full screen | `false` | -| **showNav** | Boolean | Display panel that shows a list of stories | `true` | -| **showPanel** | Boolean | Display panel that shows addon configurations | `true` | -| **panelPosition** | String/Object | Where to show the addon panel | `bottom` or `right` | -| **enableShortcuts** | Boolean | Enable/disable shortcuts | `true` | -| **showToolbar** | Boolean | Show/hide toolbar | `true` | -| **theme** | Object | Storybook Theme, see next section | `undefined` | -| **selectedPanel** | String | Id to select an addon panel | `storybook/actions/panel` | -| **initialActive** | String | Select the default active tab on Mobile | `sidebar` or `canvas` or `addons` | -| **sidebar** | Object | Sidebar options, see below | `{ showRoots: false }` | -| **toolbar** | Object | Modify the tools in the toolbar using the addon id | `{ fullscreen: { hidden: false } } }` | +| Name | Type | Description | Example Value | +| --------------------- | :-------------: | :-----------------------------------------------------: | :-----------------------------------: | +| **navSize** | Number (pixels) | The size of the sidebar that shows a list of stories | `300` | +| **bottomPanelHeight** | Number (pixels) | The size of the addon panel when in the bottom position | `200` | +| **rightPanelWidth** | Number (pixels) | The size of the addon panel when in the right position | `200` | +| **panelPosition** | String | Where to show the addon panel | `'bottom'` or `'right'` | +| **enableShortcuts** | Boolean | Enable/disable shortcuts | `true` | +| **showToolbar** | Boolean | Show/hide toolbar | `true` | +| **theme** | Object | Storybook Theme, see next section | `undefined` | +| **selectedPanel** | String | Id to select an addon panel | `storybook/actions/panel` | +| **initialActive** | String | Select the default active tab on Mobile | `sidebar` or `canvas` or `addons` | +| **sidebar** | Object | Sidebar options, see below | `{ showRoots: false }` | +| **toolbar** | Object | Modify the tools in the toolbar using the addon id | `{ fullscreen: { hidden: false } } }` | The following options are configurable under the `sidebar` namespace: diff --git a/docs/addons/introduction.md b/docs/addons/index.md similarity index 84% rename from docs/addons/introduction.md rename to docs/addons/index.md index 1550bf8c7567..349090fb5f80 100644 --- a/docs/addons/introduction.md +++ b/docs/addons/index.md @@ -1,8 +1,9 @@ --- title: 'Introduction to addons' +hideRendererSelector: true --- -Addons extend Storybook with features and integrations that are not built into the core. Most Storybook features are implemented as addons. For instance: [documentation](../writing-docs/introduction.md), [accessibility testing](https://github.com/storybookjs/storybook/tree/master/addons/a11y), [interactive controls](../essentials/controls.md), among others. +Addons extend Storybook with features and integrations that are not built into the core. Most Storybook features are implemented as addons. For instance: [documentation](../writing-docs/index.md), [accessibility testing](https://github.com/storybookjs/storybook/tree/master/addons/a11y), [interactive controls](../essentials/controls.md), among others. The [addon API](./addons-api.md) makes it easy for you to configure and customize Storybook in new ways. There are countless addons made by the community that unlocks time-saving workflows. Browse our [addon catalog](https://storybook.js.org/addons) to install an existing addon or as inspiration for your own addon. @@ -30,7 +31,7 @@ Storybook addons allow you to extend what's already possible with Storybook, eve ### UI-based addons -[UI-based addons](./addon-types.md#ui-based-addons) focus on customizing Storybook's user interface to extend your development workflow. Examples of UI-based addons include: [Controls](../essentials/controls.md), [Docs](../writing-docs/introduction.md) and [Accessibility](https://github.com/storybookjs/storybook/tree/master/addons/a11y). +[UI-based addons](./addon-types.md#ui-based-addons) focus on customizing Storybook's user interface to extend your development workflow. Examples of UI-based addons include: [Controls](../essentials/controls.md), [Docs](../writing-docs/index.md) and [Accessibility](https://github.com/storybookjs/storybook/tree/master/addons/a11y). [Learn how to write an addon »](./writing-addons.md) diff --git a/docs/addons/install-addons.md b/docs/addons/install-addons.md index 0990f3022ce2..33859546e2ea 100644 --- a/docs/addons/install-addons.md +++ b/docs/addons/install-addons.md @@ -22,7 +22,7 @@ For example, to include accessibility testing in Storybook, run the following co -Next, update [`.storybook/main.js|ts`](../configure/overview.md#configure-story-rendering) to the following: +Next, update [`.storybook/main.js|ts`](../configure/index.md#configure-story-rendering) to the following: @@ -64,11 +64,11 @@ For example, to use SCSS styling, run the following command to install the addon -Use the Webpack 5 snippet only if your framework already includes support for this version. Otherwise, use the Webpack 4 snippet. +Use the Webpack 5 snippet only if your framework already includes support for this version. Otherwise, use the Webpack 4 snippet. -Next, update [`.storybook/main.js|ts`](../configure/overview.md#configure-story-rendering) to the following: +Next, update [`.storybook/main.js|ts`](../configure/index.md#configure-story-rendering) to the following: diff --git a/docs/addons/writing-addons.md b/docs/addons/writing-addons.md index f817c64b043e..f160bcdb36a6 100644 --- a/docs/addons/writing-addons.md +++ b/docs/addons/writing-addons.md @@ -131,7 +131,7 @@ export const Tool = memo(function MyAddonSelector() { title="Apply outlines to the preview" onClick={toggleMyTool} > - + ); }); diff --git a/docs/addons/writing-presets.md b/docs/addons/writing-presets.md index 57d243ac74b3..658efea74cf9 100644 --- a/docs/addons/writing-presets.md +++ b/docs/addons/writing-presets.md @@ -10,7 +10,7 @@ Preset addons allow developers to compose various configuration options and plug ### Local presets -This type of preset allows you to encapsulate and organize configurations specific to the addon, including [builder](../builders/overview.md) support, [Babel](https://babeljs.io/), or third-party integrations. For example: +This type of preset allows you to encapsulate and organize configurations specific to the addon, including [builder](../builders/index.md) support, [Babel](https://babeljs.io/), or third-party integrations. For example: diff --git a/docs/api/arg-types.md b/docs/api/arg-types.md index 5cf1a9006355..e70678c9877e 100644 --- a/docs/api/arg-types.md +++ b/docs/api/arg-types.md @@ -12,7 +12,7 @@ The most concrete realization of argTypes is the [`ArgTypes` doc block](./doc-bl ## Automatic argType inference -If you are using the Storybook [docs](../writing-docs/introduction.md) addon (installed by default as part of [essentials](../essentials/introduction.md)), then Storybook will infer a set of argTypes for each story based on the `component` specified in the [default export](../writing-stories/introduction#default-export) of the CSF file. +If you are using the Storybook [docs](../writing-docs/index.md) addon (installed by default as part of [essentials](../essentials/index.md)), then Storybook will infer a set of argTypes for each story based on the `component` specified in the [default export](../writing-stories/index.md#default-export) of the CSF file. To do so, Storybook uses various static analysis tools depending on your framework. @@ -30,7 +30,7 @@ The data structure of `argTypes` is designed to match the output of the these to For most Storybook projects, argTypes are [automatically inferred](#automatic-argtype-inference) from your components. Any argTypes specified manually will override the inferred values. -ArgTypes are most often specified at the meta (component) level, in the [default export](../writing-stories/introduction#default-export) of the CSF file: +ArgTypes are most often specified at the meta (component) level, in the [default export](../writing-stories/index.md#default-export) of the CSF file: @@ -59,7 +59,7 @@ They can apply to all stories when specified at the project (global) level, in t -Or they can apply only to a [specific story](../writing-stories/introduction#defining-stories): +Or they can apply only to a [specific story](../writing-stories/index.md#defining-stories): diff --git a/docs/api/csf.md b/docs/api/csf.md index 60c9ba5e4355..9e494e151a7a 100644 --- a/docs/api/csf.md +++ b/docs/api/csf.md @@ -4,7 +4,7 @@ title: 'Component Story Format (CSF)' -Component Story Format (CSF) is the recommended way to [write stories](../writing-stories/introduction.md). It's an [open standard](https://github.com/ComponentDriven/csf) based on ES6 modules that is portable beyond Storybook. +Component Story Format (CSF) is the recommended way to [write stories](../writing-stories/index.md). It's an [open standard](https://github.com/ComponentDriven/csf) based on ES6 modules that is portable beyond Storybook. @@ -36,7 +36,7 @@ The `component` field is required and used by addons for automatic prop table ge -For more examples, see [writing stories](../writing-stories/introduction.md). +For more examples, see [writing stories](../writing-stories/index.md). ## Named story exports @@ -99,7 +99,7 @@ Storybook's `name` configuration element is helpful in specific circumstances. C Starting in SB 6.0, stories accept named inputs called Args. Args are dynamic data that are provided (and possibly updated by) Storybook and its addons. -Consider Storybook’s ["Button" example](../writing-stories/introduction.md#defining-stories) of a text button that logs its click events: +Consider Storybook’s ["Button" example](../writing-stories/index.md#defining-stories) of a text button that logs its click events: @@ -173,7 +173,7 @@ Or even more simply: Not only are these versions shorter and more accessible to write than their no-args counterparts, but they are also more portable since the code doesn't depend on the actions addon specifically. -For more information on setting up [Docs](../writing-docs/introduction.md) and [Actions](../essentials/actions.md), see their respective documentation. +For more information on setting up [Docs](../writing-docs/index.md) and [Actions](../essentials/actions.md), see their respective documentation. ## Play function @@ -468,4 +468,4 @@ Finally, CSF 3 can automatically generate titles. -You can still specify a title like in CSF 2, but if you don't specify one, it can be inferred from the story's path on disk. For more information, see the section on [configuring story loading](../configure/overview#configure-story-loading). +You can still specify a title like in CSF 2, but if you don't specify one, it can be inferred from the story's path on disk. For more information, see the section on [configuring story loading](../configure/index.md#configure-story-loading). diff --git a/docs/api/doc-block-controls.md b/docs/api/doc-block-controls.md index 7079a6a43831..d199c1f3ec99 100644 --- a/docs/api/doc-block-controls.md +++ b/docs/api/doc-block-controls.md @@ -31,7 +31,7 @@ import * as ButtonStories from './Button.stories' -The Controls doc block will only have functioning UI controls if you have also installed and registered [`@storybook/addon-controls`](../essentials/controls.md) (included in [`@storybook/addon-essentials`](../essentials/introduction.md)). +The Controls doc block will only have functioning UI controls if you have also installed and registered [`@storybook/addon-controls`](../essentials/controls.md) (included in [`@storybook/addon-essentials`](../essentials/index.md)). diff --git a/docs/api/index.md b/docs/api/index.md new file mode 100644 index 000000000000..e49768d52a69 --- /dev/null +++ b/docs/api/index.md @@ -0,0 +1,103 @@ +--- +title: 'API references' +hideRendererSelector: true +--- + + + +An overview of all available API references for Storybook. + +## Configuration + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescription
    main.js|ts + Storybook's primary configuration file, which specifies your Storybook project's behavior, + including the location of your stories, the addons you use, feature flags and other + project-specific settings. +
    preview.js|jsx|ts|tsx + This configuration file controls the way stories are rendered. You can also use it to run + code that applies to all stories. +
    manager.js|ts + This configuration file controls the behavior of Storybook's UI, the manager. +
    CLI + Storybook is a CLI tool. You can start Storybook in development mode or build a static + version of your Storybook. +
    + +## Stories + + + + + + + + + + + + + + + + + + +
    NameDescription
    CSF + Component Story Format (CSF) is the API for writing stories. It's an + open standard based on ES6 modules that + is portable beyond Storybook. +
    ArgTypes + ArgTypes specify the behavior of args. By specifying + the type of an arg, you constrain the values that it can accept and provide information + about args that are not explicitly set. +
    + +## Docs + + + + + + + + + + + + + + +
    NameDescription
    Doc blocks + Storybook offers several doc blocks to help document your components and other aspects of + your project. +
    diff --git a/docs/api/main-config-framework.md b/docs/api/main-config-framework.md index 4e4e563ee3ee..ce256574b75c 100644 --- a/docs/api/main-config-framework.md +++ b/docs/api/main-config-framework.md @@ -41,9 +41,7 @@ Configures Storybook's builder, [Vite](../builders/vite.md) or [Webpack](../buil #### `options.builder.useSWC` -(⚠️ **Experimental**) - -For frameworks made with the [Webpack](../builders/webpack.md) builder, this option allows you to use the [SWC](https://swc.rs/) compiler instead of [Babel](../configure/babel.md). +For frameworks made with [Webpack](../builders/webpack.md) builder, except Angular. Enabling this option allows you to use the [SWC](https://swc.rs/) compiler instead of [Babel](../configure/compilers.md#babel). When Storybook loads, it will update Webpack's configuration including the required loaders (e.g., [`TerserPlugin`](https://webpack.js.org/plugins/terser-webpack-plugin/), [`babel-loader`](https://webpack.js.org/loaders/babel-loader/)) with SWC equivalents (e.g., [`swc-loader`](https://swc.rs/docs/usage/swc-loader)) for bundling and minification. diff --git a/docs/api/main-config-preview-annotations.md b/docs/api/main-config-preview-annotations.md index 8e69ae265645..d5a4f91298d9 100644 --- a/docs/api/main-config-preview-annotations.md +++ b/docs/api/main-config-preview-annotations.md @@ -10,7 +10,7 @@ Add additional scripts to run in the story preview. -Mostly used by [frameworks](../contribute/framework.md#previewjs-example). Storybook users and [addon authors](../addons/writing-presets.md) should add scripts to [`preview.js`](../configure/overview.md#configure-story-rendering) instead. +Mostly used by [frameworks](../contribute/framework.md#previewjs-example). Storybook users and [addon authors](../addons/writing-presets.md) should add scripts to [`preview.js`](../configure/index.md#configure-story-rendering) instead. diff --git a/docs/api/main-config-swc.md b/docs/api/main-config-swc.md new file mode 100644 index 000000000000..ffd91ddbc7fb --- /dev/null +++ b/docs/api/main-config-swc.md @@ -0,0 +1,30 @@ +--- +title: 'swc' +--- + +Parent: [main.js|ts configuration](./main-config.md) + +Type: `(config: swc.Options, options: Options) => swc.Options | Promise` + +Customize Storybook's [SWC](https://swc.rs/) setup. + + + + + + + +## `SWC.Options` + +See SWC's [documentation](https://swc.rs/) for more information. + +## Options + +Type: `{ configType?: 'DEVELOPMENT' | 'PRODUCTION' }` + +There are other options that are difficult to document here. Please introspect the type definition for more information. diff --git a/docs/api/main-config.md b/docs/api/main-config.md index e0988eec381f..51fc0888aff4 100644 --- a/docs/api/main-config.md +++ b/docs/api/main-config.md @@ -43,6 +43,7 @@ An object to configure Storybook containing the following properties: - [`previewHead`](./main-config-preview-head.md) - [`refs`](./main-config-refs.md) - [`staticDirs`](./main-config-static-dirs.md) +- [`swc`](./main-config-swc.md) - [`typescript`](./main-config-typescript.md) - [`viteFinal`](./main-config-vite-final.md) - [`webpackFinal`](./main-config-webpack-final.md) diff --git a/docs/api/new-frameworks.md b/docs/api/new-frameworks.md index 7321cb3b2b19..1e3f87fe5e88 100644 --- a/docs/api/new-frameworks.md +++ b/docs/api/new-frameworks.md @@ -150,7 +150,7 @@ The framework's render function is the entity responsible for converting the ren ### Package structure -On the client side, the key file is [`src/client/preview.js`](../configure/overview.md#configure-story-rendering): +On the client side, the key file is [`src/client/preview.js`](../configure/index.md#configure-story-rendering): diff --git a/docs/builders/builder-api.md b/docs/builders/builder-api.md index 056a96144a78..5d21370b5100 100644 --- a/docs/builders/builder-api.md +++ b/docs/builders/builder-api.md @@ -55,7 +55,7 @@ In production, the `build` API call is responsible for generating a static Story ## Implementation -Under the hood, a builder is responsible for serving/building the preview `iframe`, which has its own set of requirements. To fully support Storybook, including the [Essential addons](../writing-stories/introduction.md) that ship with Storybook, it must consider the following. +Under the hood, a builder is responsible for serving/building the preview `iframe`, which has its own set of requirements. To fully support Storybook, including the [Essential addons](../writing-stories/index.md) that ship with Storybook, it must consider the following. ### Import stories @@ -77,7 +77,7 @@ By default, Storybook's configuration is handled in a dedicated file (`storybook ### Handle preview.js exports -The [`preview.js`](../configure/overview.md#configure-story-rendering) configuration file allows users to control how the story renders in the UI. This is provided via the [decorators](../writing-stories/decorators.md) named export. When Storybook starts, it converts these named exports into internal API calls via virtual module entry, for example, `addDecorator()`. The builder must also provide a similar implementation. For example: +The [`preview.js`](../configure/index.md#configure-story-rendering) configuration file allows users to control how the story renders in the UI. This is provided via the [decorators](../writing-stories/decorators.md) named export. When Storybook starts, it converts these named exports into internal API calls via virtual module entry, for example, `addDecorator()`. The builder must also provide a similar implementation. For example: @@ -91,7 +91,7 @@ The [`preview.js`](../configure/overview.md#configure-story-rendering) configura ### MDX support -[Storybook's Docs](../writing-docs/introduction.md) includes the ability to author stories/documentation in MDX using a Webpack loader. The builder must also know how to interpret MDX and invoke Storybook's special extensions. For example: +[Storybook's Docs](../writing-docs/index.md) includes the ability to author stories/documentation in MDX using a Webpack loader. The builder must also know how to interpret MDX and invoke Storybook's special extensions. For example: diff --git a/docs/builders/overview.md b/docs/builders/index.md similarity index 97% rename from docs/builders/overview.md rename to docs/builders/index.md index f0dbee77eeea..ed1309da02cb 100644 --- a/docs/builders/overview.md +++ b/docs/builders/index.md @@ -1,5 +1,6 @@ --- title: 'Builders' +hideRendererSelector: true --- Storybook, at its core, is powered by builders such as Webpack and Vite. These builders spin up a development environment, compile your code—Javascript, CSS, and MDX—into an executable bundle and update the browser in real-time. diff --git a/docs/builders/webpack.md b/docs/builders/webpack.md index 74964ff1c368..703459da2e4f 100644 --- a/docs/builders/webpack.md +++ b/docs/builders/webpack.md @@ -27,7 +27,7 @@ By default, Storybook provides zero-config support for Webpack and automatically ### Override the default configuration -Storybook's Webpack configuration is based on [Webpack 5](https://webpack.js.org/), allowing it to be extended to fit your project's needs. If you need to add a loader or a plugin, you can provide the `webpackFinal` configuration element in your [`.storybook/main.js|ts`](../configure/overview.md#configure-your-storybook-project) file. The configuration element should export a function that receives the baseline configuration as the first argument and Storybook's options object as the second argument. For example: +Storybook's Webpack configuration is based on [Webpack 5](https://webpack.js.org/), allowing it to be extended to fit your project's needs. If you need to add a loader or a plugin, you can provide the `webpackFinal` configuration element in your [`.storybook/main.js|ts`](../configure/index.md#configure-your-storybook-project) file. The configuration element should export a function that receives the baseline configuration as the first argument and Storybook's options object as the second argument. For example: diff --git a/docs/configure/babel.md b/docs/configure/babel.md deleted file mode 100644 index 94bd83590288..000000000000 --- a/docs/configure/babel.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: 'Babel' ---- - -As of version 7.0, Storybook now re-uses your project’s Babel configuration to apply the same Babel plugins and presets in your Storybook stories as you do in your app. This makes it simpler, less buggy, easier to troubleshoot, and more consistent with other tools in the JS ecosystem. - - - -If you're not using Storybook 7, please reference the [previous documentation](../../../release-6-5/docs/configure/babel.md) for guidance on configuring your Babel setup. - - - -## CRA (Create React App) - -[CRA](https://create-react-app.dev/) apps using `@storybook/react-webpack5` with the `@storybook/preset-create-react-app` package use CRA's Babel handling to behave as close as possible to your actual application. None of the other documentation on this page applies. - -## Configuring - -In Storybook 7, you are responsible for configuring Babel using your `.babelrc` file, and Storybook does not provide any default. Storybook's frameworks and addons may provide minor programmatic modifications to the Babel configuration. - -## Migrating from V6 - -For detailed instructions on migrating from `V6` mode, please see [MIGRATION.md](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#babel-mode-v7-exclusively). - -## Generate a babelrc - -If your app does not include a babelrc file, and you need one, you can create it by running the following command in your project directory: - -```sh -npx storybook@latest babelrc -``` - -Once the command completes, you should have a `.babelrc.json` file created in the root directory of your project, similar to the following example: - -
    -Example Babel configuration - -```json -{ - "sourceType": "unambiguous", - "presets": [ - [ - "@babel/preset-env", - { - "shippedProposals": true, - "loose": true - } - ], - "@babel/preset-typescript" - ], - "plugins": [ - "@babel/plugin-transform-shorthand-properties", - "@babel/plugin-transform-block-scoping", - [ - "@babel/plugin-proposal-decorators", - { - "legacy": true - } - ], - [ - "@babel/plugin-proposal-class-properties", - { - "loose": true - } - ], - [ - "@babel/plugin-proposal-private-methods", - { - "loose": true - } - ], - "@babel/plugin-proposal-export-default-from", - "@babel/plugin-syntax-dynamic-import", - [ - "@babel/plugin-proposal-object-rest-spread", - { - "loose": true, - "useBuiltIns": true - } - ], - "@babel/plugin-transform-classes", - "@babel/plugin-transform-arrow-functions", - "@babel/plugin-transform-parameters", - "@babel/plugin-transform-destructuring", - "@babel/plugin-transform-spread", - "@babel/plugin-transform-for-of", - "babel-plugin-macros", - "@babel/plugin-proposal-optional-chaining", - "@babel/plugin-proposal-nullish-coalescing-operator", - [ - "babel-plugin-polyfill-corejs3", - { - "method": "usage-global", - "absoluteImports": "core-js", - "version": "3.18.3" - } - ] - ] -} -``` - -
    - -Depending on your environment, you may need to install additional package dependencies. - -### Babelrc vs. Babel config - -Babel has two different configuration modes: babelrc and Babel config. As explained in more detail [in Babel's docs](https://babeljs.io/docs/en/config-files): - -- **babelrc** configures Babel for files in the same folder (or descendant folders) of the location of the babelrc -- **Babel config** configures Babel globally - -Babel recommends to use babelrc, and it's what Storybook generates when you run `npx storybook babelrc`. If your stories are located in the current project directory (e.g., `stories: ['../src/**/*.stories.js']`) this approach will work well. -However, when your Storybook refers to files outside of the current project directory (e.g., `stories: ['../../some-other-directory/**/*.stories.js']`), the babelrc will not apply to those files. However, a Babel config will, and is the recommended approach in that situation. - -## Troubleshooting - -### Babel configuration not working - -To troubleshoot your Babel configuration, set the `BABEL_SHOW_CONFIG_FOR` environment variable. For example, to see how Storybook is transpiling your `.storybook/preview.js` file, add the following environment variable: - -```sh -BABEL_SHOW_CONFIG_FOR=.storybook/preview.js yarn storybook -``` - -When the command finishes running, it will display the available Babel configuration for the `.storybook/preview.js` file. You can use this information to debug issues with transpilation. - - - -Due to what appears to be a Babel bug, setting this flag causes Babel transpilation to fail on the file provided. Thus you cannot actually **run** Storybook using this command. However, it will print out the configuration information as advertised, and therefore you can use this to debug your Storybook. You'll need to remove the flag to actually run your Storybook. - - - -For more info, please refer to the [Babel documentation](https://babeljs.io/docs/en/configuration#print-effective-configs). - -### SWC alternative - -(⚠️ **Experimental**) - -If you're working with a Webpack-based project, you can opt into replacing Babel with the [SWC](https://swc.rs/) compiler, which can be faster for some projects. To do so, update your [Storybook configuration file](../api/main-config.md) (e.g., `.storybook/main.js|ts`) to enable the experimental `useSWC` option: - - - - - - - -See the [`useSWC` API reference](../api/main-config-framework.md#optionsbuilderuseswc) for more information. diff --git a/docs/configure/compilers.md b/docs/configure/compilers.md new file mode 100644 index 000000000000..fc18eac310aa --- /dev/null +++ b/docs/configure/compilers.md @@ -0,0 +1,169 @@ +--- +title: 'Compiler support' +--- + +Javascript compilers are essential in optimizing and transforming code, enhancing performance, and ensuring compatibility across different environments. Storybook provides support for the leading compilers, ensuring lightning-fast build time and execution with [SWC](https://swc.rs/) or leveraging [Babel](https://babeljs.io/) with its extensive ecosystem of plugins and presets to allow you to use the latest features of the ecosystem with minimal configuration required for your Webpack-based project. + +## SWC + +SWC is a fast, highly extensible tool for compiling and bundling modern JavaScript applications. Powered by [Rust](https://www.rust-lang.org/), it improves performance and reduces build times. Storybook includes a built-in integration with SWC, allowing zero-configuration setup and built-in types for APIs. If you've initialized Storybook in a Webpack-based project with any of the supported [frameworks](./frameworks.md), except Angular, it will automatically use SWC as its default, providing you with faster loading time. However, if you're upgrading from a previous version of Storybook, you may need to opt-in to use SWC by adjusting your Storybook configuration file (i.e., `.storybook/main.js|ts`) as follows: + + + + + + + + + +Support for the SWC builder is currently experimental for Next.js projects, and it's not enabled by default. It requires you to opt in to use it. + + + +## Babel + +Babel is a widely adopted JavaScript compiler providing a modular architecture and extensive plugin system to support a wide range of use cases, enabling access to the cutting-edge features of the tooling ecosystem. Storybook provides a seamless integration with Babel, allowing you to share a standard setup between your project and Storybook without any additional configuration. + + + +If you're not using Storybook 7, please reference the [previous documentation](../../../release-6-5/docs/configure/babel.md) for guidance on configuring your Babel setup. + + + +### Configure + +By default, Babel provides an opinionated [configuration](https://babeljs.io/docs/config-files) that works for most projects, relying on two distinct methods for configuring projects with the tool: + +- **Project-wide configuration**: Babel will look for a `babel.config.js` or equivalent file in the root of your project and use it to configure your project's Babel setup. +- **File-relative configuration**: Babel will look for a `.babelrc.json` or equivalent file, introspecting the project structure until it finds a configuration file. This will allow you to configure Babel individually for multiple aspects of your project. + +Storybook relies on an agnostic approach to configuring Babel, enabling you to provide the necessary configuration for your project, and it will use it. Based on the supported frameworks, builders, and addons, it may include minor adjustments to ensure compatibility with Storybook's features. If you need to provide a custom configuration, you can generate a `.babelrc.json` file by running the following command: + + + + + + + +When the command runs, it will prompt you to install additional packages and generate a `.babelrc.json` file in the current working directory of your project and apply it, assuming that you're using the default configuration and co-locating your Storybook stories in the current working directory of your project. + +
    +Example Babel configuration + +```json +{ + "sourceType": "unambiguous", + "presets": [ + [ + "@babel/preset-env", + { + "shippedProposals": true, + "loose": true + } + ], + "@babel/preset-typescript" + ], + "plugins": [ + "@babel/plugin-transform-shorthand-properties", + "@babel/plugin-transform-block-scoping", + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ], + [ + "@babel/plugin-proposal-class-properties", + { + "loose": true + } + ], + [ + "@babel/plugin-proposal-private-methods", + { + "loose": true + } + ], + "@babel/plugin-proposal-export-default-from", + "@babel/plugin-syntax-dynamic-import", + [ + "@babel/plugin-proposal-object-rest-spread", + { + "loose": true, + "useBuiltIns": true + } + ], + "@babel/plugin-transform-classes", + "@babel/plugin-transform-arrow-functions", + "@babel/plugin-transform-parameters", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-spread", + "@babel/plugin-transform-for-of", + "babel-plugin-macros", + "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-proposal-nullish-coalescing-operator", + [ + "babel-plugin-polyfill-corejs3", + { + "method": "usage-global", + "absoluteImports": "core-js", + "version": "3.18.3" + } + ] + ] +} +``` + +
    + + + +For custom project configurations such as monorepos, where you have multiple Storybook configurations, creating a `.babelrc.json` file in your project's current working directory may not be sufficient. In those cases, you can create a `babel.config.js` file to override Babel's configuration, and Storybook will automatically detect and use it. See the Babel [documentation](https://babeljs.io/docs/config-files) for more information. + + + +### Working with Create React App + +If you're working with a project that was initialized with [Create React App](https://create-react-app.dev/), Storybook will automatically detect and use the Babel configuration provided by the tool enabled via the `@storybook/preset-create-react-app` preset, allowing to use Storybook without any additional configuration. + +## Troubleshooting + + + +### The SWC compiler doesn't work with React + +If you have enabled the SWC builder option in a React-based project and you are not explicitly importing React in your `jsx|tsx` files, it can cause Storybook to fail to load. SWC does not automatically import the `jsx-runtime` module when using the SWC builder. To resolve this issue, you need to adjust your Storybook configuration file (i.e., `.storybook/main.js|ts`) and configure the `swc` option as follows: + + + + + + + + + +### Babel configuration not working + +Out of the box, Storybook can detect and apply any Babel configuration you provided in your project. However, if you're running into a situation where your configuration is not being used, you configure the [`BABEL_SHOW_CONFIG_FOR`](https://babeljs.io/docs/configuration#print-effective-configs) environment variable and set it to the file you want to inspect. For example: + +```sh +BABEL_SHOW_CONFIG_FOR=.storybook/preview.js yarn storybook +``` + +When the command runs, it will output the Babel configuration applied to the file you specified despite showing a transpilation error in the console and preventing Storybook from loading. This is a known issue with Babel unrelated to Storybook, which you address by turning off the environment variable after inspecting the configuration and restarting Storybook. diff --git a/docs/configure/environment-variables.md b/docs/configure/environment-variables.md index d4ba9252c58c..e2948c3027b6 100644 --- a/docs/configure/environment-variables.md +++ b/docs/configure/environment-variables.md @@ -111,7 +111,7 @@ Then they'll be hardcoded to the static version of your Storybook. ### Using Storybook configuration -Additionally, you can extend your Storybook configuration file (i.e., [`.storybook/main.js|.ts`](../configure/overview.md#configure-story-rendering)) and provide a configuration field that you can use to define specific variables (e.g., API URLs). For example: +Additionally, you can extend your Storybook configuration file (i.e., [`.storybook/main.js|.ts`](../configure/index.md#configure-story-rendering)) and provide a configuration field that you can use to define specific variables (e.g., API URLs). For example: diff --git a/docs/configure/features-and-behavior.md b/docs/configure/features-and-behavior.md index 0e267371f874..a81aa6a55c74 100644 --- a/docs/configure/features-and-behavior.md +++ b/docs/configure/features-and-behavior.md @@ -16,19 +16,19 @@ To control the layout of Storybook’s UI you can use `addons.setConfig` in your The following table details how to use the API values: -| Name | Type | Description | Example Value | -| ------------------- | :-----------: | :------------------------------------------------: | :-----------------------------------: | -| **isFullscreen** | Boolean | Show story component as full screen | `false` | -| **showNav** | Boolean | Display panel that shows a list of stories | `true` | -| **showPanel** | Boolean | Display panel that shows addon configurations | `true` | -| **panelPosition** | String/Object | Where to show the addon panel | `bottom` or `right` | -| **enableShortcuts** | Boolean | Enable/disable shortcuts | `true` | -| **showToolbar** | Boolean | Show/hide tool bar | `true` | -| **theme** | Object | Storybook Theme, see next section | `undefined` | -| **selectedPanel** | String | Id to select an addon panel | `storybook/actions/panel` | -| **initialActive** | String | Select the default active tab on Mobile | `sidebar` or `canvas` or `addons` | -| **sidebar** | Object | Sidebar options, see below | `{ showRoots: false }` | -| **toolbar** | Object | Modify the tools in the toolbar using the addon id | `{ fullscreen: { hidden: false } } }` | +| Name | Type | Description | Example Value | +| --------------------- | :-------------: | :-----------------------------------------------------: | :-------------------------------------: | +| **navSize** | Number (pixels) | The size of the sidebar that shows a list of stories | `300` | +| **bottomPanelHeight** | Number (pixels) | The size of the addon panel when in the bottom position | `200` | +| **rightPanelWidth** | Number (pixels) | The size of the addon panel when in the right position | `200` | +| **panelPosition** | String | Where to show the addon panel | `'bottom'` or `'right'` | +| **enableShortcuts** | Boolean | Enable/disable shortcuts | `true` | +| **showToolbar** | Boolean | Show/hide tool bar | `true` | +| **theme** | Object | Storybook Theme, see next section | `undefined` | +| **selectedPanel** | String | Id to select an addon panel | `'storybook/actions/panel'` | +| **initialActive** | String | Select the default active tab on Mobile | `'sidebar'` or `'canvas'` or `'addons'` | +| **sidebar** | Object | Sidebar options, see below | `{ showRoots: false }` | +| **toolbar** | Object | Modify the tools in the toolbar using the addon id | `{ fullscreen: { hidden: false } } }` | The following options are configurable under the `sidebar` namespace: @@ -48,12 +48,12 @@ The following options are configurable under the `toolbar` namespace: You can use URL parameters to configure some of the available features: -| Config option | Query param | Supported values | -| ------------------- | :----------: | :------------------------: | -| **enableShortcuts** | `shortcuts` | `false` | -| **isFullscreen** | `full` | `true` | -| **showNav** | `nav` | `false` | -| **showPanel** | `panel` | `false`, `right`, `bottom` | -| **selectedPanel** | `addonPanel` | Any panel ID | -| **showTabs** | `tabs` | `true` | -| --- | `instrument` | `false`, `true` | +| Config option | Query param | Supported values | +| ------------------- | :----------: | :----------------------------: | +| **enableShortcuts** | `shortcuts` | `false` | +| --- (fullscreen) | `full` | `true`, `false` | +| --- (show sidebar) | `nav` | `true`, `false` | +| --- (show panel) | `panel` | `false`, `'right'`, `'bottom'` | +| **selectedPanel** | `addonPanel` | Any panel ID | +| **showTabs** | `tabs` | `true` | +| --- | `instrument` | `false`, `true` | diff --git a/docs/configure/frameworks.md b/docs/configure/frameworks.md index fc9010251423..3602138dab30 100644 --- a/docs/configure/frameworks.md +++ b/docs/configure/frameworks.md @@ -52,11 +52,11 @@ Every modern web application has unique requirements and relies on various tools ### NextJS 13 doesn't work with Storybook -The latest release of [NextJS](https://nextjs.org/) introduced breaking changes (e.g., [TurboPack](https://turbo.build/pack), [Server Component](https://nextjs.org/docs/advanced-features/react-18/server-components), [SWC](https://nextjs.org/docs/advanced-features/compiler#why-swc)) that are not yet fully supported by Storybook. The Storybook team is working on adding support for these features. In the meantime, you can still use Storybook alongside your NextJS 13 project if you're not relying on them. +With the release of Next.js [version 13](https://nextjs.org/blog/next-13), it introduced breaking changes (e.g., [TurboPack](https://turbo.build/pack), [Server Components](https://nextjs.org/docs/advanced-features/react-18/server-components)) that are not yet fully supported by Storybook. The Storybook team is working on adding support for these features. In the meantime, you can still use Storybook alongside your Next.js 13 project if you're not relying on them. ### My framework doesn't work with Storybook -Out of the box, most frameworks work seamlessly with Storybook. However, some frameworks (e.g., [CRACO](https://craco.js.org/)) provide their own configuration that Storybook isn't prepared to handle without additional steps, either [via addon](../addons/writing-presets.md) or integration. To learn more, read our [addons guide](../addons/introduction.md). +Out of the box, most frameworks work seamlessly with Storybook. However, some frameworks (e.g., [CRACO](https://craco.js.org/)) provide their own configuration that Storybook isn't prepared to handle without additional steps, either [via addon](../addons/writing-presets.md) or integration. To learn more, read our [addons guide](../addons/index.md). ### How do I build a Storybook framework? diff --git a/docs/configure/overview.md b/docs/configure/index.md similarity index 100% rename from docs/configure/overview.md rename to docs/configure/index.md diff --git a/docs/configure/sidebar-and-urls.md b/docs/configure/sidebar-and-urls.md index ab5f3afe509e..4e03f93be782 100644 --- a/docs/configure/sidebar-and-urls.md +++ b/docs/configure/sidebar-and-urls.md @@ -145,7 +145,7 @@ If you need to preserve the naming scheme, you can add the `title` element to th ### Auto-title prefixes -Additionally, if you customize your Storybook to load your stories based on a [configuration object](./overview.md#with-a-configuration-object), including a `titlePrefix`, Storybook automatically prefixes all titles to matching stories. For example, assuming you have the following configuration: +Additionally, if you customize your Storybook to load your stories based on a [configuration object](./index.md#with-a-configuration-object), including a `titlePrefix`, Storybook automatically prefixes all titles to matching stories. For example, assuming you have the following configuration: diff --git a/docs/configure/story-layout.md b/docs/configure/story-layout.md index 5adad91aebea..07236f9cbab4 100644 --- a/docs/configure/story-layout.md +++ b/docs/configure/story-layout.md @@ -6,7 +6,7 @@ The `layout` [parameter](../writing-stories/parameters.md) allows you to configu ## Global layout -You can add the parameter to your [`./storybook/preview.js`](./overview.md#configure-story-rendering), like so: +You can add the parameter to your [`./storybook/preview.js`](./index.md#configure-story-rendering), like so: diff --git a/docs/configure/story-rendering.md b/docs/configure/story-rendering.md index ae98bac3d9f3..fff549e8ef4c 100644 --- a/docs/configure/story-rendering.md +++ b/docs/configure/story-rendering.md @@ -6,7 +6,7 @@ In Storybook, your stories render in a particular “preview” iframe (Canvas t ## Adding to <head> -If you need to add extra elements to the `head` of the preview iframe, for instance, to load static stylesheets, font files, or similar, you can create a file called [`.storybook/preview-head.html`](./overview.md#configure-story-rendering) and add tags like this: +If you need to add extra elements to the `head` of the preview iframe, for instance, to load static stylesheets, font files, or similar, you can create a file called [`.storybook/preview-head.html`](./index.md#configure-story-rendering) and add tags like this: diff --git a/docs/configure/storybook-addons.md b/docs/configure/storybook-addons.md index 48315969243c..697e0884889a 100644 --- a/docs/configure/storybook-addons.md +++ b/docs/configure/storybook-addons.md @@ -4,7 +4,7 @@ title: 'Storybook Addons' A key strength of Storybook is its extensibility. Use addons to extend and customize Storybook to fit your team’s development workflow. -Addons are integral to the way Storybook works. Many of Storybook's core features are implemented as addons! These addons are installed out of the box with [essentials](../essentials/introduction.md). +Addons are integral to the way Storybook works. Many of Storybook's core features are implemented as addons! These addons are installed out of the box with [essentials](../essentials/index.md). ## Addon features diff --git a/docs/configure/styling-and-css.md b/docs/configure/styling-and-css.md index 2f847b80935d..f2e70a9b6729 100644 --- a/docs/configure/styling-and-css.md +++ b/docs/configure/styling-and-css.md @@ -10,7 +10,7 @@ If you're using Vite to build your Storybook, you're covered! Storybook will use ## Importing CSS files -Storybook is pre-configured to recognize imports for CSS files. To add global CSS for all your stories, import it in [`.storybook/preview.js`](./overview.md#configure-story-rendering). +Storybook is pre-configured to recognize imports for CSS files. To add global CSS for all your stories, import it in [`.storybook/preview.js`](./index.md#configure-story-rendering). diff --git a/docs/configure/telemetry.md b/docs/configure/telemetry.md index 1d1af24046c1..f239c86a7247 100644 --- a/docs/configure/telemetry.md +++ b/docs/configure/telemetry.md @@ -34,8 +34,8 @@ Specifically, we track the following information in our telemetry events: - Supported view layers (e.g., React, Vue, Angular, Svelte). - Builder (e.g., Webpack5, Vite). - Meta framework (e.g., [Next](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.com/), [CRA](https://create-react-app.dev/)). - - [Addons](https://storybook.js.org/integrations) (e.g., [Essentials](../essentials/introduction.md), [Accessibility](https://storybook.js.org/addons/@storybook/addon-a11y/)). - - [Feature flags](./overview.md#feature-flags) (e.g., `buildStoriesJson`). + - [Addons](https://storybook.js.org/integrations) (e.g., [Essentials](../essentials/index.md), [Accessibility](https://storybook.js.org/addons/@storybook/addon-a11y/)). + - [Feature flags](./index.md#feature-flags) (e.g., `buildStoriesJson`). - Package manager information (e.g., `npm`, `yarn`). - Monorepo information (e.g., [NX](https://nx.dev/), [Turborepo](https://turborepo.org/)). - In-app events (e.g., [Storybook guided tour](https://github.com/storybookjs/addon-onboarding)). diff --git a/docs/configure/theming.md b/docs/configure/theming.md index 73cc315f5fc6..5ac07a9b5a61 100644 --- a/docs/configure/theming.md +++ b/docs/configure/theming.md @@ -42,7 +42,7 @@ When setting a theme, set a complete theme object. The theme is replaced, not co ## Theming docs -[Storybook Docs](../writing-docs/introduction.md) uses the same theme system as Storybook’s UI but is themed independently from the main UI. +[Storybook Docs](../writing-docs/index.md) uses the same theme system as Storybook’s UI but is themed independently from the main UI. Supposing you have a Storybook theme defined for the main UI in [`.storybook/manager.js`](./features-and-behavior.md): @@ -56,7 +56,7 @@ Supposing you have a Storybook theme defined for the main UI in [`.storybook/man -Here's how you'd specify the same theme for docs in [`.storybook/preview.js`](./overview.md#configure-story-rendering): +Here's how you'd specify the same theme for docs in [`.storybook/preview.js`](./index.md#configure-story-rendering): @@ -164,7 +164,7 @@ The same way as you can adjust your [preview’s head tag](../configure/story-re If you're using MDX for docs, there's one more level of "themability". MDX allows you to completely override the rendered components from Markdown using a `components` parameter. It's an advanced usage that we don't officially support in Storybook, but it's a powerful construct if you need it. -Here's how you might insert a custom code renderer for `code` blocks on the page, in [`.storybook/preview.js`](./overview.md#configure-story-rendering): +Here's how you might insert a custom code renderer for `code` blocks on the page, in [`.storybook/preview.js`](./index.md#configure-story-rendering): diff --git a/docs/configure/webpack.md b/docs/configure/webpack.md index 61073d7b4374..41537c576f70 100644 --- a/docs/configure/webpack.md +++ b/docs/configure/webpack.md @@ -4,7 +4,7 @@ title: 'Webpack' Storybook displays your components in a custom web application built using [Webpack](https://webpack.js.org/). Webpack is a complex tool, but our default configuration is intended to cover most use cases. [Addons](https://storybook.js.org/addons/) are also available that extend the configuration for other everyday use cases. -You can customize Storybook's webpack setup by providing a `webpackFinal` field in [`.storybook/main.js`](./overview.md#configure-your-storybook-project) file. +You can customize Storybook's webpack setup by providing a `webpackFinal` field in [`.storybook/main.js`](./index.md#configure-your-storybook-project) file. The value should be an async function that receives a webpack config and eventually returns a webpack config. @@ -65,7 +65,7 @@ Starting with Storybook 6.4, [bundle splitting](https://v4.webpack.js.org/guides -When you start your Storybook, you'll see an improvement in loading times. Read more about it in the [announcement post](https://storybook.js.org/blog/storybook-on-demand-architecture/) and the [configuration documentation](./overview.md#on-demand-story-loading). +When you start your Storybook, you'll see an improvement in loading times. Read more about it in the [announcement post](https://storybook.js.org/blog/storybook-on-demand-architecture/) and the [configuration documentation](./index.md#on-demand-story-loading). ### Webpack 5 @@ -117,7 +117,7 @@ This feature will mean build output is cached between runs of Storybook, speedin ### Extending Storybook’s webpack config -To extend the above configuration, use the `webpackFinal` field of [`.storybook/main.js`](./overview.md#configure-story-rendering). +To extend the above configuration, use the `webpackFinal` field of [`.storybook/main.js`](./index.md#configure-story-rendering). The value should export a `function`, which will receive the default config as its first argument. The second argument is an options object from Storybook, and this will have information about where config came from, whether we're in production or development mode, etc. @@ -159,7 +159,7 @@ If you're using a non-standard Storybook config directory, you should put `main. ### Using your existing config -Suppose you have an existing webpack config for your project and want to reuse this app's configuration. In that case, you can import your main webpack config into Storybook's [`.storybook/main.js`](./overview.md#configure-story-rendering) and merge both: +Suppose you have an existing webpack config for your project and want to reuse this app's configuration. In that case, you can import your main webpack config into Storybook's [`.storybook/main.js`](./index.md#configure-story-rendering) and merge both: The following code snippet shows how you can replace the loaders from Storybook with the ones from your app's `webpack.config.js`: diff --git a/docs/contribute/code.md b/docs/contribute/code.md index 1ce7726caf3e..b30f3fe72aa9 100644 --- a/docs/contribute/code.md +++ b/docs/contribute/code.md @@ -106,7 +106,7 @@ When you're done coding, add documentation and tests as appropriate. That simpli Adding a story or set of generic stories to our suite helps you test your work. -Assuming you're working on one of the [Essential addons](../essentials/introduction.md), there's a chance that a complete set of stories already exists. Check the addon's `template/stories` directory that documents how it's supposed to work and add your stories there. +Assuming you're working on one of the [Essential addons](../essentials/index.md), there's a chance that a complete set of stories already exists. Check the addon's `template/stories` directory that documents how it's supposed to work and add your stories there. If you're modifying something related to a specific renderer (e.g., React, Vue, etc.), it will also have a similar `template/stories` directory in which you'll need to add your stories. diff --git a/docs/contribute/framework.md b/docs/contribute/framework.md index f3125080a4b9..a29ab99abc3b 100644 --- a/docs/contribute/framework.md +++ b/docs/contribute/framework.md @@ -2,7 +2,7 @@ title: 'Contributing a Storybook framework' --- -A Storybook framework is a node package that enables out-of-the-box support for either a metaframework (Next.js, NuxtJS, SvelteKit) or a combination of [builder](../builders/overview) (Webpack, Vite) plus renderer (React, Angular, Vue, web components, etc). +A Storybook framework is a node package that enables out-of-the-box support for either a metaframework (Next.js, NuxtJS, SvelteKit) or a combination of [builder](../builders/index.md) (Webpack, Vite) plus renderer (React, Angular, Vue, web components, etc). For metaframeworks, the Storybook framework also takes care of additional configuration necessary to make Storybook behave similarly to apps generated by the metaframework. For example, `@storybook/nextjs` [recreates or mocks a number of features of Next.js apps](https://github.com/storybookjs/storybook/blob/next/code/frameworks/nextjs/README.md#supported-features) inside Storybook. @@ -130,7 +130,7 @@ The [preset API](../addons/writing-presets) is where you will configure the Stor #### `preview.js` ([example](https://github.com/storybookjs/storybook/blob/next/code/frameworks/nextjs/src/preview.tsx)) -The (optional) [preview API](../configure/overview#configure-story-rendering) is where you configure the rendering of stories, such as global decorators or initializing some runtime config needed for your framework to behave as expected. If your framework requires this file, note that you also need to [configure the `previewAnnotations` in `preset.js`](https://github.com/storybookjs/storybook/blob/next/code/frameworks/nextjs/src/preset.ts#L71-L74). +The (optional) [preview API](../configure/index.md#configure-story-rendering) is where you configure the rendering of stories, such as global decorators or initializing some runtime config needed for your framework to behave as expected. If your framework requires this file, note that you also need to [configure the `previewAnnotations` in `preset.js`](https://github.com/storybookjs/storybook/blob/next/code/frameworks/nextjs/src/preset.ts#L71-L74). #### `types.ts` ([example](https://github.com/storybookjs/storybook/blob/next/code/frameworks/nextjs/src/types.ts)) diff --git a/docs/contribute/how-to-reproduce.md b/docs/contribute/how-to-reproduce.md index 90036ca37e89..95d81b691903 100644 --- a/docs/contribute/how-to-reproduce.md +++ b/docs/contribute/how-to-reproduce.md @@ -54,7 +54,7 @@ Install and configure any Storybook [addons](https://storybook.js.org/addons/) t ## Add stories -Any Storybook reproduction wouldn't be complete without [stories](../writing-stories/introduction.md). To help fix your issue faster, we encourage you to include the minimum amount of stories that will replicate your issue. +Any Storybook reproduction wouldn't be complete without [stories](../writing-stories/index.md). To help fix your issue faster, we encourage you to include the minimum amount of stories that will replicate your issue. ## Host diff --git a/docs/contribute/how-to-contribute.md b/docs/contribute/index.md similarity index 94% rename from docs/contribute/how-to-contribute.md rename to docs/contribute/index.md index 35faaa534d55..a49fbeb2fc1a 100644 --- a/docs/contribute/how-to-contribute.md +++ b/docs/contribute/index.md @@ -1,5 +1,6 @@ --- title: 'How to contribute' +hideRendererSelector: true --- Storybook is a community-oriented open source project that welcomes contributions. Some of our most popular features started with a developer wanting to solve a problem for themselves. @@ -15,7 +16,7 @@ In the interest of fostering an open and welcoming environment, we as contributo - [**Frameworks**](./framework.md) to get started with a new framework - [**Documentation**](./documentation-updates.md) for documentation improvements, typos, and clarifications - [**Examples**](./new-snippets.md) for new snippets and examples -- [**Addons**](./../addons/introduction.md) for new addons +- [**Addons**](./../addons/index.md) for new addons ## Not sure how to get started? diff --git a/docs/essentials/actions.md b/docs/essentials/actions.md index 70a7496f9ee3..090bc4f606b9 100644 --- a/docs/essentials/actions.md +++ b/docs/essentials/actions.md @@ -17,25 +17,23 @@ The actions addon is used to display data received by event handler (callback) a Actions work via supplying special Storybook-generated “action” arguments (referred to as "args" for short) to your stories. There are two ways to get an action arg: -### Action argType annotation +### Via @storybook/test fn spy function -You can use [argTypes](../api/argtypes.md) to tell Storybook that an arg to your story should be an action. Usually, it makes sense to do this at the component level (although you can apply it per individual story): +The recommended way to write actions is to use the `fn` utility from `@storybook/test` to mock and spy args. This is very useful for writing [interaction tests](../writing-tests/interaction-testing.md). You can mock your component's methods by assigning them to the `fn()` function: -When Storybook sees this argType, it will create an arg set to a special “action” callback. If your component calls this arg (based on the user's interaction or through the `play` function), the event will show up in the action panel: +If your component calls an arg (because of either the user's interaction or the `play` function) and that arg is spied on , the event will show up in the action panel: ![Essential Actions addon usage](./addon-actions-screenshot.png) @@ -43,6 +41,8 @@ When Storybook sees this argType, it will create an arg set to a special “acti Another option is to use a global parameter to match all [argTypes](../api/argtypes.md) that match a certain pattern. The following configuration automatically creates actions for each `on` argType (which you can either specify manually or can be [inferred automatically](../api/argtypes.md#automatic-argtype-inference)). +This is quite useful when your component has dozens (or hundreds) of methods and you do not want to manually apply the `fn` utility for each of those methods. However, **this is not the recommended** way of writing actions. That's because automatically inferred args **are not available as spies in your play function**. If you use `argTypesRegex` and your stories have play functions, you will need to also define args with the `fn` utility to test them in your play function. + -If you need more granular control over which `argTypes` are matched, you can adjust your stories and include the `argTypes` parameter. For example: +If you need more granular control over which `argTypes` are matched, you can adjust your stories and include the `argTypesRegex` parameter. For example: @@ -72,7 +72,7 @@ If you need more granular control over which `argTypes` are matched, you can adj -If you're generating argTypes with another addon (like [docs](../writing-docs/introduction.md), which is the common behavior), ensure the actions addon **AFTER** the other addon. You can do this by listing it later in the addons registration code in [`.storybook/main.js`](../configure/overview.md#configure-story-rendering). This is default in [essentials](./introduction.md). +If you're generating argTypes with another addon (like [docs](../writing-docs/index.md), which is the common behavior), ensure the actions addon **AFTER** the other addon. You can do this by listing it later in the addons registration code in [`.storybook/main.js`](../configure/index.md#configure-story-rendering). This is default in [essentials](./index.md). diff --git a/docs/essentials/backgrounds.md b/docs/essentials/backgrounds.md index f6b286ec350b..3c295a12b360 100644 --- a/docs/essentials/backgrounds.md +++ b/docs/essentials/backgrounds.md @@ -15,7 +15,7 @@ The backgrounds toolbar addon allows you to set the background color in which th By default, the backgrounds toolbar includes a light and dark background. -But you're not restricted to these backgrounds, you can configure your own set of colors with the `parameters.backgrounds` [parameter](../writing-stories/parameters.md) in your [`.storybook/preview.js`](../configure/overview.md#configure-story-rendering): +But you're not restricted to these backgrounds, you can configure your own set of colors with the `parameters.backgrounds` [parameter](../writing-stories/parameters.md) in your [`.storybook/preview.js`](../configure/index.md#configure-story-rendering): diff --git a/docs/essentials/controls.md b/docs/essentials/controls.md index fff305286b8b..131a38be6b8c 100644 --- a/docs/essentials/controls.md +++ b/docs/essentials/controls.md @@ -101,9 +101,9 @@ This replaces the input with a radio group for a more intuitive experience. ## Custom control type matchers -For a few types, Controls can automatically be inferred with [regex](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RegExp). If you've used the Storybook CLI to setup your project it should have automatically created the following defaults in `.storybook/preview.js`: +Controls can automatically be inferred from arg's name with [regex](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RegExp), but currently only for the color picker and date picker controls. If you've used the Storybook CLI to setup your project it should have automatically created the following defaults in `.storybook/preview.js`: -| Data type | Default regex | Description | +| Control | Default regex | Description | | :-------: | :--------------------------------------: | :-------------------------------------------------------: | | **color** | /(background|color)$/i | Will display a color picker UI for the args that match it | | **date** | `/Date$/` | Will display a date picker UI for the args that match it | @@ -264,7 +264,7 @@ Controls supports the following configuration [parameters](../writing-stories/pa Since Controls is built on the same engine as Storybook Docs, it can also show property documentation alongside your controls using the expanded parameter (defaults to false). This means you embed a complete [`Controls`](../api/doc-block-controls.md) doc block in the controls panel. The description and default value rendering can be [customized](#fully-custom-args) in the same way as the doc block. -To enable expanded mode globally, add the following to [`.storybook/preview.js`](../configure/overview.md#configure-story-rendering): +To enable expanded mode globally, add the following to [`.storybook/preview.js`](../configure/index.md#configure-story-rendering): diff --git a/docs/essentials/introduction.md b/docs/essentials/index.md similarity index 94% rename from docs/essentials/introduction.md rename to docs/essentials/index.md index 4e89178bad28..4cddae864fee 100644 --- a/docs/essentials/introduction.md +++ b/docs/essentials/index.md @@ -1,5 +1,6 @@ --- title: 'Essential addons' +hideRendererSelector: true --- A major strength of Storybook are [addons](https://storybook.js.org/addons) that extend Storybook’s UI and behavior. Storybook ships by default with a set of “essential” addons that add to the initial user experience. There are many third-party addons as well as “official” addons developed by the Storybook core team. @@ -7,7 +8,7 @@ A major strength of Storybook are [addons](https://storybook.js.org/addons) that - [Actions](./actions.md) - [Backgrounds](./backgrounds.md) - [Controls](./controls.md) -- [Docs](../writing-docs/introduction.md) +- [Docs](../writing-docs/index.md) - [Highlight](./highlight.md) - [Measure & outline](./measure-and-outline.md) - [Toolbars & globals](./toolbars-and-globals.md) @@ -31,7 +32,7 @@ However, if you intend to install the Essentials addon manually into an existing -Update your Storybook configuration (in [`.storybook/main.js|ts`](../configure/overview.md#configure-story-rendering)) to include the Essentials addon. +Update your Storybook configuration (in [`.storybook/main.js|ts`](../configure/index.md#configure-story-rendering)) to include the Essentials addon. @@ -48,7 +49,7 @@ Update your Storybook configuration (in [`.storybook/main.js|ts`](../configure/o Essentials is "zero-config”. It comes with a recommended configuration out of the box. -If you need to reconfigure any of the [individual Essentials addons](https://storybook.js.org/addons/tag/essentials), install them manually by following the installation instructions, and depending on the method of choice, register them in your Storybook configuration file (i.e., [`.storybook/main.js|ts`](../configure/overview.md#configure-story-rendering)) and adjust the configuration to suit your needs. For example: +If you need to reconfigure any of the [individual Essentials addons](https://storybook.js.org/addons/tag/essentials), install them manually by following the installation instructions, and depending on the method of choice, register them in your Storybook configuration file (i.e., [`.storybook/main.js|ts`](../configure/index.md#configure-story-rendering)) and adjust the configuration to suit your needs. For example: @@ -102,7 +103,7 @@ When you start Storybook, your custom configuration will override the default. ### Disabling addons -If you need to disable any of the Essential's addons, you can do it by changing your [`.storybook/main.js`](../configure/overview.md#configure-story-rendering) file. +If you need to disable any of the Essential's addons, you can do it by changing your [`.storybook/main.js`](../configure/index.md#configure-story-rendering) file. For example, if you wanted to disable the [backgrounds addon](./backgrounds.md), you would apply the following change to your Storybook configuration: diff --git a/docs/essentials/interactions.md b/docs/essentials/interactions.md index bbc1207e7cca..9cf81f78eeff 100644 --- a/docs/essentials/interactions.md +++ b/docs/essentials/interactions.md @@ -10,9 +10,9 @@ Stories isolate and capture component states in a structured manner. While devel For example, clicking a button to open/close a dialog box, dragging a list item to reorder it, or filling out a form to check for validation errors. To test those behaviors, you have to interact with the components as a user would. Interactive stories enable you to automate these interactions using a play function. They are small snippets of code that run once the story finishes rendering, emulating the exact steps a user would take to interact with the component. -### Powered by Testing Library and Jest +### Powered by Testing Library and Vitest -The interactions are written using a Storybook-instrumented version of [Testing Library](https://testing-library.com/) and [Jest](https://jestjs.io/). That gives you a familiar developer-friendly syntax to interact with the DOM and make assertions, but with extra telemetry to help with debugging. +The interactions are written using a package called `@storybook/test`. It provides Storybook-instrumented versions of [Testing Library](https://testing-library.com/) and [Vitest](https://vitest.dev). That gives you a familiar developer-friendly syntax to interact with the DOM and make assertions, but with extra telemetry to help with debugging. ## Set up the interactions addon @@ -32,7 +32,7 @@ Run the following command to install the interactions addon and related dependen -Next, update [`.storybook/main.js|ts`](../configure/overview.md#configure-story-rendering) to the following: +Next, update [`.storybook/main.js|ts`](../configure/index.md#configure-story-rendering) to the following: @@ -47,7 +47,7 @@ Next, update [`.storybook/main.js|ts`](../configure/overview.md#configure-story- -Make sure to list `@storybook/addon-interactions` **after** the [`@storybook/addon-essentials`](./introduction.md) addon (or the [`@storybook/addon-actions`](./actions.md) if you've installed it individually). +Make sure to list `@storybook/addon-interactions` **after** the [`@storybook/addon-essentials`](./index.md) addon (or the [`@storybook/addon-actions`](./actions.md) if you've installed it individually). @@ -59,7 +59,7 @@ Now when you run Storybook, the Interactions addon will be enabled. Interactions run as part of the `play` function of your stories. We rely on Testing Library to do the heavy lifting. -Make sure to import the Storybook wrappers for Jest and Testing Library rather than importing Jest and Testing Library directly. +Make sure to import the Storybook wrappers for Vitest and Testing Library via `@storybook/test` rather than importing the original packages directly. diff --git a/docs/essentials/themes.md b/docs/essentials/themes.md index cdb199452ef0..fbe2384b3b01 100644 --- a/docs/essentials/themes.md +++ b/docs/essentials/themes.md @@ -8,7 +8,7 @@ Storybook's [Themes](https://github.com/storybookjs/storybook/tree/next/code/add ## Theme decorators -To make your themes accessible to your stories, `@storybook/addon-themes` exposes three [decorators](https://storybook.js.org/docs/react/writing-stories/decorators) for different methods of theming. +To make your themes accessible to your stories, `@storybook/addon-themes` exposes three [decorators](https://storybook.js.org/docs/writing-stories/decorators) for different methods of theming. ### JSX providers diff --git a/docs/essentials/toolbars-and-globals.md b/docs/essentials/toolbars-and-globals.md index 6f7e2916daa0..ff169ff91aa8 100644 --- a/docs/essentials/toolbars-and-globals.md +++ b/docs/essentials/toolbars-and-globals.md @@ -16,7 +16,7 @@ When the globals change, the story re-renders, and the decorators rerun with the ## Global types and the toolbar annotation -Storybook has a simple, declarative syntax for configuring toolbar menus. In your [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering), you can add your own toolbars by creating `globalTypes` with a `toolbar` annotation: +Storybook has a simple, declarative syntax for configuring toolbar menus. In your [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering), you can add your own toolbars by creating `globalTypes` with a `toolbar` annotation: @@ -31,7 +31,7 @@ Storybook has a simple, declarative syntax for configuring toolbar menus. In you -As globals are _global_ you can _only_ set `globalTypes` in [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering). +As globals are _global_ you can _only_ set `globalTypes` in [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering). @@ -43,7 +43,7 @@ We have a `global` implemented. Let's wire it up! We can consume our new `theme` -For example, suppose you are using [`styled-components`](https://styled-components.com/). You can add a theme provider decorator to your [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering) config: +For example, suppose you are using [`styled-components`](https://styled-components.com/). You can add a theme provider decorator to your [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering) config: @@ -60,7 +60,7 @@ For example, suppose you are using [`styled-components`](https://styled-componen -For example, suppose you are using [`Vuetify`](https://vuetifyjs.com/en/). You can add a theme provider decorator to your [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering) config: +For example, suppose you are using [`Vuetify`](https://vuetifyjs.com/en/). You can add a theme provider decorator to your [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering) config: @@ -77,7 +77,7 @@ For example, suppose you are using [`Vuetify`](https://vuetifyjs.com/en/). You c -For example, suppose you are using [`Angular Material`](https://material.angular.io/). You can add a theme provider decorator to your [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering) config: +For example, suppose you are using [`Angular Material`](https://material.angular.io/). You can add a theme provider decorator to your [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering) config: @@ -93,7 +93,7 @@ For example, suppose you are using [`Angular Material`](https://material.angular -Depending on your framework and theming library, you can extend your [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering) and provide a decorator to load the theme. For example: +Depending on your framework and theming library, you can extend your [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering) and provide a decorator to load the theme. For example: @@ -114,7 +114,7 @@ So far, we've managed to create and consume a global inside Storybook. Now let's take a look at a more complex example. Let's suppose we wanted to implement a new global called **locale** for internationalization, which shows a flag on the right side of the toolbar. -In your [`.storybook/preview.js|ts`](../configure/overview.md#configure-story-rendering), add the following: +In your [`.storybook/preview.js|ts`](../configure/index.md#configure-story-rendering), add the following: diff --git a/docs/essentials/viewport.md b/docs/essentials/viewport.md index d2742b73b81b..dd321d9f30ec 100644 --- a/docs/essentials/viewport.md +++ b/docs/essentials/viewport.md @@ -17,7 +17,7 @@ The Viewport toolbar item allows you to adjust the dimensions of the iframe your Out of the box, the Viewport addon offers you a standard set of viewports that you can use. -If you want to change the default set of viewports, you can set the global `parameters.viewport` [parameter](../writing-stories/parameters.md) in your [`.storybook/preview.js`](../configure/overview.md#configure-story-rendering): +If you want to change the default set of viewports, you can set the global `parameters.viewport` [parameter](../writing-stories/parameters.md) in your [`.storybook/preview.js`](../configure/index.md#configure-story-rendering): @@ -32,12 +32,12 @@ If you want to change the default set of viewports, you can set the global `para The viewport global can take an object with the following keys: -| Field | Type | Description | Default Value | +| Field | Type | Description | Default Value | | ---------------------- | :-----: | :-------------------------------------------------------: | :------------: | -| **defaultViewport** | String | Sets the default viewport | `'responsive'` | -| **defaultOrientation** | String | Sets the default orientation (e.g. portrait or landscape) | `'portrait'` | -| **disable** | Boolean | Disables the viewport | N/A | -| **viewports** | Object | The configuration object for the viewport | `{}` | +| **defaultViewport** | String | Sets the default viewport | `'responsive'` | +| **defaultOrientation** | String | Sets the default orientation (e.g. portrait or landscape) | `'portrait'` | +| **disable** | Boolean | Disables the viewport | N/A | +| **viewports** | Object | The configuration object for the viewport | `{}` | The viewports object needs the following keys: @@ -51,7 +51,7 @@ The viewports object needs the following keys: By default, Storybook uses a [minimal set of viewports](https://github.com/storybookjs/storybook/blob/next/code/addons/viewport/src/defaults.ts#L167) to get you started. But you're not restricted to these. The addon offers a more granular list of devices that you can use. -Change your [`.storybook/preview.js`](../configure/overview.md#configure-story-rendering) to the following: +Change your [`.storybook/preview.js`](../configure/index.md#configure-story-rendering) to the following: @@ -70,7 +70,7 @@ See [here](https://github.com/storybookjs/storybook/blob/master/addons/viewport/ ### Add new devices -If you have either a specific viewport or a list of viewports that you need to use, you can modify your [`.storybook/preview.js`](../configure/overview.md#configure-story-rendering) file and include them: +If you have either a specific viewport or a list of viewports that you need to use, you can modify your [`.storybook/preview.js`](../configure/index.md#configure-story-rendering) file and include them: diff --git a/docs/faq.md b/docs/faq.md index 387986d9cfbc..580501e8ecd3 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -226,7 +226,7 @@ We're working on overcoming this limitation, and soon you'll be able to use them Storybook does not work unless you have at least one local story (or docs page) defined in your project. In this context, local means a `.stories.*` or `.mdx` file that is referenced in your project's `.storybook/main.js` config. -If you're in a [Storybook composition](https://storybook.js.org/docs/react/sharing/storybook-composition) scenario, where you have multiple Storybooks, and want to have an extra Storybook with no stories of its own, that serves as a "glue" for all the other Storybooks in a project for demo/documentation purposes, you can do the following steps: +If you're in a [Storybook composition](https://storybook.js.org/docs/sharing/storybook-composition) scenario, where you have multiple Storybooks, and want to have an extra Storybook with no stories of its own, that serves as a "glue" for all the other Storybooks in a project for demo/documentation purposes, you can do the following steps: Introduce a single `.mdx` docs page (addon-essentials or addon-docs required), that serves as an Introduction page, like so: @@ -276,7 +276,7 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | | What's a story | [See current documentation](./get-started/whats-a-story.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/guides) | | | Browse Stories | [See current documentation](./get-started/browse-stories.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/guides) | | | Setup | [See current documentation](./get-started/setup.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/guides) | -| Write stories | Introduction | [See current documentation](./writing-stories/introduction.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | +| Write stories | Introduction | [See current documentation](./writing-stories/index.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | | | Parameters | [See current documentation](./writing-stories/parameters.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories/index.md#parameters) | Non existing feature or undocumented | | | Decorators | [See current documentation](./writing-stories/decorators.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories/index.md#decorators) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories/index.md#using-decorators) | | | Naming components and hierarchy | [See current documentation](./writing-stories/naming-components-and-hierarchy.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | @@ -301,10 +301,10 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | | Viewport | [See current documentation](./essentials/viewport.md) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/addons/viewport) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/addons/viewport) | | | Backgrounds | [See current documentation](./essentials/backgrounds.md) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/addons/backgrounds) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/addons/backgrounds) | | | Toolbars and globals | [See current documentation](./essentials/toolbars-and-globals.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/toolbar-guide) | Non existing feature or undocumented | -| Configure | Overview | [See current documentation](./configure/overview.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/overview) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | +| Configure | Overview | [See current documentation](./configure/index.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/overview) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | | | Integration/Frameworks | [See current documentation](./configure/frameworks.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | Integration/Framework support for frameworks | [See current documentation](./configure/frameworks-feature-support.md) | Non existing feature or undocumented | Non existing feature or undocumented | -| | Integration/Babel | [See current documentation](./configure/babel.md) | See versioned documentation [here](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/custom-babel-config) | See versioned documentation [here](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/custom-babel-config) | +| | Integration/Compilers | [See current documentation](./configure/compilers.md) | See versioned documentation [here](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/custom-babel-config) | See versioned documentation [here](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/custom-babel-config) | | | Integration/Typescript | [See current documentation](./configure/typescript.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/typescript-config) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/typescript-config) | | | Integration/Styling and CSS | [See current documentation](./configure/styling-and-css.md) | See versioned documentation | See versioned documentation | | | Integration/Images and assets | [See current documentation](./configure/images-and-assets.md) | See versioned documentation | See versioned documentation | @@ -314,11 +314,11 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | | User Interface/Theming | [See current documentation](./configure/theming.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/theming) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/theming) | | | User Interface/Sidebar & URLS | [See current documentation](./configure/sidebar-and-urls.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/options-parameter) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/options-parameter) | | | Environment variables | [See current documentation](./configure/environment-variables.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/env-vars) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/env-vars) | -| Builders | Introduction | [See current documentation](./builders/overview.md) | Non existing feature or undocumented | Non existing feature or undocumented | +| Builders | Introduction | [See current documentation](./builders/index.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | Vite | [See current documentation](./builders/vite.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | Webpack | [See current documentation](./builders/webpack.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/custom-webpack-config/index.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/custom-webpack-config/index.md) | | | Builder API | [See current documentation](./builders/builder-api.md) | Non existing feature or undocumented | Non existing feature or undocumented | -| Addons | Introduction | [See current documentation](./addons/introduction.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/writing-addons) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/writing-addons) | +| Addons | Introduction | [See current documentation](./addons/index.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/writing-addons) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/writing-addons) | | | Install addons | [See current documentation](./addons/install-addons.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/using-addons/) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/using-addons/) | | | Writing Addons | [See current documentation](./addons/writing-addons.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/writing-addons) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/writing-addons) | | | Writing Presets | [See current documentation](./addons/writing-presets.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/presets/writing-presets) | Non existing feature or undocumented | @@ -364,6 +364,7 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | | `main.js` configuration/previewHead | [See current documentation](./api/main-config-preview-head.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | `main.js` configuration/refs | [See current documentation](./api/main-config-refs.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | `main.js` configuration/staticDirs | [See current documentation](./api/main-config-static-dirs.md) | Non existing feature or undocumented | Non existing feature or undocumented | +| | `main.js` configuration/swc | [See current documentation](./api/main-config-swc.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | `main.js` configuration/typescript | [See current documentation](./api/main-config-typescript.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | `main.js` configuration/viteFinal | [See current documentation](./api/main-config-vite-final.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | `main.js` configuration/webpackFinal | [See current documentation](./api/main-config-webpack-final.md) | Non existing feature or undocumented | Non existing feature or undocumented | @@ -506,7 +507,7 @@ import type { ComponentStory, ComponentMeta } from '@storybook/react'; const StoryMeta: ComponentMeta = { /* 👇 The title prop is optional. - * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * See https://storybook.js.org/docs/configure/#configure-story-loading * to learn how to generate automatic titles */ title: 'Button', diff --git a/docs/frameworks.js b/docs/frameworks.js index ed7483a3b273..8ce9fe8e62b2 100644 --- a/docs/frameworks.js +++ b/docs/frameworks.js @@ -18,7 +18,7 @@ module.exports = { { name: 'Docs', unsupported: [], - path: 'writing-docs/introduction', + path: 'writing-docs', }, { name: 'Viewport', @@ -129,11 +129,6 @@ module.exports = { name: 'queryparams', unsupported: [], }, - { - name: 'Storyshots', - unsupported: ['ember'], - path: 'writing-tests/snapshot-testing', - }, { name: 'storysource', unsupported: [], diff --git a/docs/get-started/browse-stories.md b/docs/get-started/browse-stories.md index 391da5320dad..618c444e46ae 100644 --- a/docs/get-started/browse-stories.md +++ b/docs/get-started/browse-stories.md @@ -1,5 +1,6 @@ --- title: 'Browse Stories' +hideRendererSelector: true --- Last chapter, we learned that stories correspond with discrete component states. This chapter demonstrates how to use Storybook as a workshop for building components. @@ -19,7 +20,6 @@ Navigate between stories by clicking on them in the sidebar. Try the sidebar sea Or use keyboard shortcuts. Click on the Storybook's menu to see the list of shortcuts available. - ![Storybook keyboard shortcuts examples](./storybook-keyboard-shortcuts.png) ## Toolbar @@ -40,7 +40,7 @@ Storybook ships with time-saving tools built-in. The toolbar contains tools that /> -The [“Docs”](../writing-docs/introduction.md) page displays auto-generated documentation for components (inferred from the source code). Usage documentation is helpful when sharing reusable components with your team, for example, in an application. +The [“Docs”](../writing-docs/index.md) page displays auto-generated documentation for components (inferred from the source code). Usage documentation is helpful when sharing reusable components with your team, for example, in an application. ![Storybook keyboard shortcuts examples](./mdx-example.png) @@ -63,7 +63,7 @@ Addons are plugins that extend Storybook's core functionality. You can find them /> -Storybook is extensible. Our rich ecosystem of addons helps you test, document, and optimize your stories. You can also create an addon to satisfy your workflow requirements. Read more in the [addons section](../addons/introduction.md). +Storybook is extensible. Our rich ecosystem of addons helps you test, document, and optimize your stories. You can also create an addon to satisfy your workflow requirements. Read more in the [addons section](../addons/index.md). In the next chapter, we'll get your components rendering in Storybook so you can use it to supercharge component development. diff --git a/docs/get-started/conclusion.md b/docs/get-started/conclusion.md index 074d4dd09a48..83880dbc11bb 100644 --- a/docs/get-started/conclusion.md +++ b/docs/get-started/conclusion.md @@ -1,11 +1,12 @@ --- title: 'Conclusion' +hideRendererSelector: true --- Congratulations! You learned the basics. Storybook is the most popular tool for UI component development and documentation. You’ll be able to transfer these skills to thousands of companies that use Storybook to build UIs including GitHub, Airbnb, and Stripe. If you’d like to learn workflows for building app UIs with Storybook, check out our in-depth guides over at the [tutorials](https://storybook.js.org/tutorials/) page. Continue reading for detailed information on how to use Storybook APIs. -- [How to write stories](../writing-stories/introduction.md) -- [How to document components and design systems](../writing-docs/introduction.md) +- [How to write stories](../writing-stories/index.md) +- [How to document components and design systems](../writing-docs/index.md) - [View example Storybooks from leading companies](https://storybook.js.org/showcase) diff --git a/docs/get-started/install.md b/docs/get-started/install.md index beceee7c0401..2d01dfd1a0f2 100644 --- a/docs/get-started/install.md +++ b/docs/get-started/install.md @@ -2,8 +2,6 @@ title: 'Install Storybook' --- - - Use the Storybook CLI to install it in a single command. Run this inside your _existing project’s_ root directory: @@ -18,12 +16,6 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e - - -Check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. - - -
    storybook init is not made for empty projects @@ -49,6 +41,8 @@ The command above will make the following changes to your local environment: - 📝 Add some boilerplate stories to get you started. - 📡 Set up telemetry to help us improve Storybook. Read more about it [here](../configure/telemetry.md). + + ## Run the Setup Wizard diff --git a/docs/get-started/setup.md b/docs/get-started/setup.md index c454a7648edc..5bc7d986e822 100644 --- a/docs/get-started/setup.md +++ b/docs/get-started/setup.md @@ -57,7 +57,7 @@ Don't see the tool that you're looking for? Check out the [styling and css](../c ## Configure Storybook for your stack -Storybook comes with a permissive [default configuration](../configure/overview.md). It attempts to customize itself to fit your setup. But it’s not foolproof. +Storybook comes with a permissive [default configuration](../configure/index.md). It attempts to customize itself to fit your setup. But it’s not foolproof. Your project may have additional requirements before components can be rendered in isolation. This warrants customizing configuration further. There are three broad categories of configuration you might need. @@ -67,7 +67,7 @@ Your project may have additional requirements before components can be rendered If you see errors on the CLI when you run the `yarn storybook` command, you likely need to make changes to Storybook’s build configuration. Here are some things to try: - [Presets](../addons/addon-types.md) bundle common configurations for various technologies into Storybook. In particular, presets exist for Create React App and Ant Design. -- Specify a custom [Babel configuration](../configure/babel.md#custom-babel-config) for Storybook. Storybook automatically tries to use your project’s config if it can. +- Specify a custom [Babel configuration](../configure/compilers.md#babel) for Storybook. Storybook automatically tries to use your project’s config if it can. - Adjust the [Webpack configuration](../builders/webpack.md) that Storybook uses. Try patching in your own configuration if needed.
    @@ -86,7 +86,7 @@ If a particular story has a problem rendering, often it means your component exp A common frontend pattern is for components to assume that they render in a specific “context” with parent components higher up the rendering hierarchy (for instance, theme providers). -Use [decorators](../writing-stories/decorators.md) to “wrap” every story in the necessary context providers. The [`.storybook/preview.js`](../configure/overview.md#configure-story-rendering) file allows you to customize how components render in Canvas, the preview iframe. See how you can wrap every component rendered in Storybook with [Styled Components](https://styled-components.com/) `ThemeProvider`, [Vue's Fontawesome](https://github.com/FortAwesome/vue-fontawesome), or with an Angular theme provider component in the example below. +Use [decorators](../writing-stories/decorators.md) to “wrap” every story in the necessary context providers. The [`.storybook/preview.js`](../configure/index.md#configure-story-rendering) file allows you to customize how components render in Canvas, the preview iframe. See how you can wrap every component rendered in Storybook with [Styled Components](https://styled-components.com/) `ThemeProvider`, [Vue's Fontawesome](https://github.com/FortAwesome/vue-fontawesome), or with an Angular theme provider component in the example below. diff --git a/docs/get-started/whats-a-story.md b/docs/get-started/whats-a-story.md index 5adfded2f947..8efc1b0e785e 100644 --- a/docs/get-started/whats-a-story.md +++ b/docs/get-started/whats-a-story.md @@ -1,5 +1,5 @@ --- -title: "What's a Story" +title: "What's a story?" --- A story captures the rendered state of a UI component. Developers write multiple stories per component that describe all the “interesting” states a component can support. @@ -97,6 +97,6 @@ Stories are also helpful for checking that UI continues to look correct as you m /> -Checking component’s stories as you develop helps prevent accidental regressions. [Tools that integrate with Storybook can automate this](../writing-tests/introduction.md) for you. +Checking component’s stories as you develop helps prevent accidental regressions. [Tools that integrate with Storybook can automate this](../writing-tests/index.md) for you. Now that we’ve seen the basic anatomy of a story let’s see how we use Storybook’s UI to develop stories. diff --git a/docs/get-started/why-storybook.md b/docs/get-started/why-storybook.md index 7322d2d57c2e..c6a35d261daa 100644 --- a/docs/get-started/why-storybook.md +++ b/docs/get-started/why-storybook.md @@ -109,23 +109,23 @@ Most community members choose a [Component-Driven](https://www.componentdriven.o When you write stories for components, you get a bunch of additional benefits for free. -#### 📝 Develop UIs that are more durable +**📝 Develop UIs that are more durable** -Isolate components and pages and track their use cases as [stories](../writing-stories/introduction.md). Verify hard-to-reach edge cases of UI. Use addons to mock everything a component needs—context, API requests, device features, etc. +Isolate components and pages and track their use cases as [stories](../writing-stories/index.md). Verify hard-to-reach edge cases of UI. Use addons to mock everything a component needs—context, API requests, device features, etc. -#### ✅ Test UIs with less effort and no flakes +**✅ Test UIs with less effort and no flakes** Stories are a pragmatic, reproducible way of tracking UI states. Use them to spot-test the UI during development. Storybook offers built-in workflows for automated [Accessibility](../writing-tests/accessibility-testing.md), [Interaction](../writing-tests/interaction-testing.md), and [Visual](../writing-tests/visual-testing.md) testing. Or use stories as test cases by importing them into other JavaScript testing tools. -#### 📚 Document UI for your team to reuse +**📚 Document UI for your team to reuse** -Storybook is the single source of truth for your UI. Stories index all your components and their various states, making it easy for your team to find and reuse existing UI patterns. Storybook also auto-generates [documentation](../writing-docs/introduction.md) from those stories. +Storybook is the single source of truth for your UI. Stories index all your components and their various states, making it easy for your team to find and reuse existing UI patterns. Storybook also auto-generates [documentation](../writing-docs/index.md) from those stories. -#### 📤 Share how the UI actually works +**📤 Share how the UI actually works** Stories show how UIs actually work, not just a picture of how they're supposed to work. That keeps everyone aligned on what's currently in production. [Publish Storybook](../sharing/publish-storybook.md) to get sign-off from teammates. Or [embed](../sharing/embed.md) them in wikis, Markdown, and Figma to streamline collaboration. -#### 🚦Automate UI workflows +**🚦Automate UI workflows** Storybook is compatible with your continuous integration workflow. Add it as a CI step to automate user interface testing, review implementation with teammates, and get signoff from stakeholders. @@ -133,7 +133,7 @@ Storybook is compatible with your continuous integration workflow. Add it as a C Storybook is powered by [Component Story Format](https://github.com/ComponentDriven/csf), an open standard based on JavaScript ES6 modules. This enables stories to interoperate between development, testing, and design tools. Each story is exported as a JavaScript function enabling you to reuse it with other tools. No vendor lock-in. -Reuse stories with [Jest](https://jestjs.io/) and [Testing Library](https://testing-library.com/) to verify interactions. Put them in [Chromatic](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook) for visual testing. Audit story accessibility with [Axe](https://github.com/dequelabs/axe-core). Or test user flows with [Playwright](https://playwright.dev/) and [Cypress](https://www.cypress.io/). Reuse unlocks more workflows at no extra cost. +Reuse stories with [Jest](https://jestjs.io/) or [Vitest](https://vitest.dev/) and [Testing Library](https://testing-library.com/) to verify interactions. Put them in [Chromatic](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook) for visual testing. Audit story accessibility with [Axe](https://github.com/dequelabs/axe-core). Or test user flows with [Playwright](https://playwright.dev/) and [Cypress](https://www.cypress.io/). Reuse unlocks more workflows at no extra cost. --- diff --git a/docs/migration-guide.md b/docs/migration-guide.md index ddd2d8faeab0..6f075c9904f2 100644 --- a/docs/migration-guide.md +++ b/docs/migration-guide.md @@ -69,7 +69,7 @@ In addition to the automated upgrades above, there are manual migrations that mi ### Upgrade MDX1 to MDX2 -Storybook 7 uses MDX2 by default for rendering [docs](./writing-docs/introduction.md). The upgrade from MDX1 to MDX2 is not fully automated, due to the large number of changes between versions. Fortunately, we have some tips to help make it a lot easier. +Storybook 7 uses MDX2 by default for rendering [docs](./writing-docs/index.md). The upgrade from MDX1 to MDX2 is not fully automated, due to the large number of changes between versions. Fortunately, we have some tips to help make it a lot easier. #### Automatically detect MDX2 errors with a CLI tool @@ -183,7 +183,7 @@ npx storybook@latest migrate storiesof-to-csf --glob="src/**/*.stories.tsx" ### .stories.mdx to MDX+CSF -Storybook 7 provides a cleaner [docs](./writing-docs/introduction.md) that defines manual documentation in pure MDX and stories in CSF, rather than the previous `.stories.mdx` hybrid approach, which is now deprecated. You can automatically convert your files using the following codemod (make sure to update the glob to fit your files): +Storybook 7 provides a cleaner [docs](./writing-docs/index.md) that defines manual documentation in pure MDX and stories in CSF, rather than the previous `.stories.mdx` hybrid approach, which is now deprecated. You can automatically convert your files using the following codemod (make sure to update the glob to fit your files): ```sh npx storybook@latest migrate mdx-to-csf --glob "src/**/*.stories.mdx" diff --git a/docs/sharing/design-integrations.md b/docs/sharing/design-integrations.md index ca0842f18b10..d85530557e9c 100644 --- a/docs/sharing/design-integrations.md +++ b/docs/sharing/design-integrations.md @@ -176,5 +176,5 @@ Integrate Adobe XD with Storybook using the [design addon](https://storybook.js. Extend and customize Storybook by building an integration. Integrate with lower-level Storybook APIs or bootstrap an addon to customize Storybook's UI and behavior. -- [Addon documentation](../addons/introduction.md) +- [Addon documentation](../addons/index.md) - [Create an addon tutorial](https://storybook.js.org/tutorials/create-an-addon/) diff --git a/docs/sharing/index.md b/docs/sharing/index.md new file mode 100644 index 000000000000..8e52d0b7a8cb --- /dev/null +++ b/docs/sharing/index.md @@ -0,0 +1,12 @@ +--- +title: 'Sharing' +hideRendererSelector: true +--- + +You have your components ready and tested. That's great! Now you want to make your component library available to your team or community to help them understand how they work. There are multiple ways you can do that. You can publish your Storybook to services like Chromatic, embed some of your stories in your own website, or use third party services like Figma. + +- [Publish](./publish-storybook.md) +- [Embed](./embed.md) +- [Design integrations](./design-integrations.md) +- [Composition](./composition.md) +- [Package Composition](./package-composition.md) diff --git a/docs/sharing/package-composition.md b/docs/sharing/package-composition.md index ba94040b90b0..96833ce02931 100644 --- a/docs/sharing/package-composition.md +++ b/docs/sharing/package-composition.md @@ -20,7 +20,7 @@ Composition happens automatically if the package [supports](#for-authors) it. Wh ### Set up -If you want to configure how the composed Storybook behaves, you can disable the `ref` element in your [`.storybook/main.js`](../configure/overview.md#configure-story-rendering) +If you want to configure how the composed Storybook behaves, you can disable the `ref` element in your [`.storybook/main.js`](../configure/index.md#configure-story-rendering) diff --git a/docs/sharing/storybook-composition.md b/docs/sharing/storybook-composition.md index a9e50a8c54d4..987d453e51df 100644 --- a/docs/sharing/storybook-composition.md +++ b/docs/sharing/storybook-composition.md @@ -17,7 +17,7 @@ You’ll see the composed Storybook’s stories in the sidebar alongside your ow ## Compose published Storybooks -In your [`.storybook/main.js`](../configure/overview.md#configure-story-rendering) file add a `refs` field with information about the reference Storybook. Pass in a URL to a statically built Storybook. +In your [`.storybook/main.js`](../configure/index.md#configure-story-rendering) file add a `refs` field with information about the reference Storybook. Pass in a URL to a statically built Storybook. @@ -95,7 +95,7 @@ If you're using Storybook 6.4, or higher, you can optimize your composition via -If you already enabled automatic code splitting via the [`storyStoreV7`](https://storybook.js.org/docs/react/builders/webpack#code-splitting), you won't need this flag as it will automatically generate the `index.json` file. +If you already enabled automatic code splitting via the [`storyStoreV7`](https://storybook.js.org/docs/builders/webpack#code-splitting), you won't need this flag as it will automatically generate the `index.json` file. diff --git a/docs/snippets/angular/build-storybook-production-mode.with-builder.js.mdx b/docs/snippets/angular/build-storybook-production-mode.with-builder.js.mdx index 36fcc549b41c..326bfdb04741 100644 --- a/docs/snippets/angular/build-storybook-production-mode.with-builder.js.mdx +++ b/docs/snippets/angular/build-storybook-production-mode.with-builder.js.mdx @@ -1,6 +1,6 @@ ```shell # Builds Storybook with Angular's custom builder -# See https://storybook.js.org/docs/angular/get-started/install +# See https://storybook.js.org/docs/get-started/install # to learn how to create the custom builder ng run my-project:build-storybook ``` diff --git a/docs/snippets/angular/button-story-default-export.ts.mdx b/docs/snippets/angular/button-story-default-export.ts.mdx index 1fde5eafe2ee..ba2fb09ff5b7 100644 --- a/docs/snippets/angular/button-story-default-export.ts.mdx +++ b/docs/snippets/angular/button-story-default-export.ts.mdx @@ -7,7 +7,7 @@ import { Button } from './button.component'; const meta: Meta