diff --git a/code/addons/a11y/src/components/VisionSimulator.tsx b/code/addons/a11y/src/components/VisionSimulator.tsx index b43756897364..b66f8eef297d 100644 --- a/code/addons/a11y/src/components/VisionSimulator.tsx +++ b/code/addons/a11y/src/components/VisionSimulator.tsx @@ -1,8 +1,7 @@ import type { ReactNode } from 'react'; import React, { useState } from 'react'; import { Global, styled } from '@storybook/theming'; -import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; import { Filters } from './ColorFilters'; @@ -145,7 +144,7 @@ export const VisionSimulator = () => { onDoubleClick={() => setFilter(null)} > - + diff --git a/code/addons/backgrounds/src/containers/BackgroundSelector.tsx b/code/addons/backgrounds/src/containers/BackgroundSelector.tsx index d44d7f58ab6b..078a2752a5e3 100644 --- a/code/addons/backgrounds/src/containers/BackgroundSelector.tsx +++ b/code/addons/backgrounds/src/containers/BackgroundSelector.tsx @@ -4,8 +4,7 @@ import memoize from 'memoizerific'; import { useParameter, useGlobals } from '@storybook/manager-api'; import { logger } from '@storybook/client-logger'; -import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; import { PARAM_KEY as BACKGROUNDS_PARAM_KEY } from '../constants'; import { ColorIcon } from '../components/ColorIcon'; @@ -141,7 +140,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 b860209ae0ae..80d6477884b4 100644 --- a/code/addons/backgrounds/src/containers/GridSelector.tsx +++ b/code/addons/backgrounds/src/containers/GridSelector.tsx @@ -2,8 +2,7 @@ import type { FC } from 'react'; import React, { memo } from 'react'; import { useGlobals, useParameter } from '@storybook/manager-api'; -import { IconButton } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton } from '@storybook/components'; import { PARAM_KEY as BACKGROUNDS_PARAM_KEY } from '../constants'; @@ -31,7 +30,7 @@ export const GridSelector: FC = memo(function GridSelector() { }) } > - + ); }); diff --git a/code/addons/interactions/src/components/Interaction.tsx b/code/addons/interactions/src/components/Interaction.tsx index c0bf532d9072..bacaea0fe358 100644 --- a/code/addons/interactions/src/components/Interaction.tsx +++ b/code/addons/interactions/src/components/Interaction.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; -import { IconButton, TooltipNote, WithTooltip } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { IconButton, Icons, TooltipNote, WithTooltip } from '@storybook/components'; import { type Call, CallStates, type ControlStates } from '@storybook/instrumenter'; import { styled, typography } from '@storybook/theming'; import { transparentize } from 'polished'; @@ -175,7 +174,7 @@ export const Interaction = ({ tooltip={} > - + )} diff --git a/code/addons/interactions/src/components/Subnav.tsx b/code/addons/interactions/src/components/Subnav.tsx index de78bf2c94b6..3d2e5c41d1a3 100644 --- a/code/addons/interactions/src/components/Subnav.tsx +++ b/code/addons/interactions/src/components/Subnav.tsx @@ -3,13 +3,13 @@ import React from 'react'; import { Button, IconButton, + Icons, Separator, P, TooltipNote, WithTooltip, Bar, } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; import type { Call, ControlStates } from '@storybook/instrumenter'; import { CallStates } from '@storybook/instrumenter'; import { styled } from '@storybook/theming'; @@ -135,7 +135,7 @@ export const Subnav: React.FC = ({ onClick={controls.start} disabled={!controlStates.start} > - + @@ -146,7 +146,7 @@ export const Subnav: React.FC = ({ onClick={controls.back} disabled={!controlStates.back} > - + @@ -157,7 +157,7 @@ export const Subnav: React.FC = ({ onClick={controls.next} disabled={!controlStates.next} > - + @@ -168,13 +168,13 @@ export const Subnav: React.FC = ({ onClick={controls.end} disabled={!controlStates.end} > - + }> - + diff --git a/code/addons/measure/src/Tool.tsx b/code/addons/measure/src/Tool.tsx index bb78447f8527..2e68078aa06b 100644 --- a/code/addons/measure/src/Tool.tsx +++ b/code/addons/measure/src/Tool.tsx @@ -1,7 +1,6 @@ import React, { useCallback, useEffect } from 'react'; import { useGlobals, useStorybookApi } from '@storybook/manager-api'; -import { IconButton } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton } from '@storybook/components'; import { TOOL_ID, ADDON_ID } from './constants'; export const Tool = () => { @@ -34,7 +33,7 @@ export const Tool = () => { title="Enable measure" onClick={toggleMeasure} > - + ); }; diff --git a/code/addons/outline/src/OutlineSelector.tsx b/code/addons/outline/src/OutlineSelector.tsx index 63c826044ef5..93bdf321df07 100644 --- a/code/addons/outline/src/OutlineSelector.tsx +++ b/code/addons/outline/src/OutlineSelector.tsx @@ -1,7 +1,6 @@ import React, { memo, useCallback, useEffect } from 'react'; import { useGlobals, useStorybookApi } from '@storybook/manager-api'; -import { IconButton } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton } from '@storybook/components'; import { ADDON_ID, PARAM_KEY } from './constants'; export const OutlineSelector = memo(function OutlineSelector() { @@ -35,7 +34,7 @@ export const OutlineSelector = memo(function OutlineSelector() { title="Apply outlines to the preview" onClick={toggleOutline} > - + ); }); diff --git a/code/addons/themes/src/theme-switcher.tsx b/code/addons/themes/src/theme-switcher.tsx index b950f780c1d5..3658a3ef78cc 100644 --- a/code/addons/themes/src/theme-switcher.tsx +++ b/code/addons/themes/src/theme-switcher.tsx @@ -1,8 +1,8 @@ import React, { Fragment, useMemo } from 'react'; import { useAddonState, useChannel, useGlobals, useParameter } from '@storybook/manager-api'; import { styled } from '@storybook/theming'; -import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; + import type { ThemeAddonState, ThemeParameters } from './constants'; import { PARAM_KEY, @@ -74,7 +74,7 @@ export const ThemeSwitcher = () => { }} > - + {label && {label}} diff --git a/code/addons/viewport/src/Tool.tsx b/code/addons/viewport/src/Tool.tsx index e62ce3543eb3..df65988e5097 100644 --- a/code/addons/viewport/src/Tool.tsx +++ b/code/addons/viewport/src/Tool.tsx @@ -4,8 +4,8 @@ import memoize from 'memoizerific'; import { styled, Global, type Theme, withTheme } from '@storybook/theming'; -import { IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; + import { useStorybookApi, useParameter, useAddonState } from '@storybook/manager-api'; import { registerShortcuts } from './shortcuts'; import { PARAM_KEY, ADDON_ID } from './constants'; @@ -188,7 +188,7 @@ export const ViewportTool: FC = memo( setState({ ...state, selected: responsiveViewport.id }); }} > - + {styles ? ( {isRotated ? `${item.title} (L)` : `${item.title} (P)`} @@ -234,7 +234,7 @@ export const ViewportTool: FC = memo( setState({ ...state, isRotated: !isRotated }); }} > - + {styles.height.replace('px', '')} 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 c99a1df1da81..d2f6ec6affbc 100644 --- a/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts +++ b/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts @@ -31,10 +31,6 @@ const getAbsolutePath = (input: I): I => dirname(require.resolve(join(input, 'package.json'))) as any; const storybookPaths: Record = { - // this is a temporary hack to get webpack to alias this correctly - [`@storybook/components/experimental`]: `${getAbsolutePath( - `@storybook/components` - )}/dist/experimental`, ...[ // these packages are not pre-bundled because of react dependencies 'components', diff --git a/code/ui/.storybook/main.ts b/code/ui/.storybook/main.ts index b21c8b0f9413..5f979898a5c2 100644 --- a/code/ui/.storybook/main.ts +++ b/code/ui/.storybook/main.ts @@ -6,16 +6,12 @@ import type { StorybookConfig } from '../../frameworks/react-vite'; const isBlocksOnly = process.env.STORYBOOK_BLOCKS_ONLY === 'true'; const allStories = [ - { - directory: '../components/src/new', - titlePrefix: '@core-ui', - }, { directory: '../manager/src', titlePrefix: '@manager', }, { - directory: '../components/src/legacy', + directory: '../components/src/components', titlePrefix: '@components', }, { diff --git a/code/ui/blocks/src/blocks/mdx.tsx b/code/ui/blocks/src/blocks/mdx.tsx index eae97528ecb4..3c1c69f87fc2 100644 --- a/code/ui/blocks/src/blocks/mdx.tsx +++ b/code/ui/blocks/src/blocks/mdx.tsx @@ -1,8 +1,7 @@ import type { FC, MouseEvent, PropsWithChildren, SyntheticEvent } from 'react'; import React, { useContext } from 'react'; import { NAVIGATE_URL } from '@storybook/core-events'; -import { Code, components, nameSpaceClassNames } from '@storybook/components'; -import { Icon } from '@storybook/components/experimental'; +import { Code, components, Icons, nameSpaceClassNames } from '@storybook/components'; import { global } from '@storybook/global'; import { styled } from '@storybook/theming'; import { Source } from '../components'; @@ -191,7 +190,7 @@ const HeaderWithOcticonAnchor: FC - + {children} diff --git a/code/ui/blocks/src/components/ArgsTable/ArgControl.tsx b/code/ui/blocks/src/components/ArgsTable/ArgControl.tsx index 7a1061f14e7a..be9b7e1c8a46 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgControl.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgControl.tsx @@ -1,7 +1,7 @@ import type { FC } from 'react'; import React, { useCallback, useState, useEffect } from 'react'; -import { Link } from '@storybook/components/experimental'; +import { Link } from '@storybook/components'; import { BooleanControl, ColorControl, diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx index d575ddda9162..39ed63dc6299 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.stories.tsx @@ -1,17 +1,22 @@ import React from 'react'; import { action } from '@storybook/addon-actions'; import { styled } from '@storybook/theming'; +import type { Meta, StoryObj } from '@storybook/react'; import { ArgsTable, ArgsTableError } from './ArgsTable'; import * as ArgRow from './ArgRow.stories'; -export default { +const meta = { component: ArgsTable, title: 'Components/ArgsTable/ArgsTable', args: { updateArgs: action('updateArgs'), resetArgs: action('resetArgs'), }, -}; +} satisfies Meta; + +export default meta; +type Story = StoryObj; + const propsSection = { category: 'props ', }; @@ -145,6 +150,16 @@ export const Empty = { }, }; +export const EmptyInsideAddonPanel: Story = { + args: { + isLoading: false, + inAddonPanel: true, + }, + parameters: { + layout: 'centered', + }, +}; + export const WithDefaultExpandedArgs = { args: { rows: { diff --git a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx index a528c292e25c..120cc7a21368 100644 --- a/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx +++ b/code/ui/blocks/src/components/ArgsTable/ArgsTable.tsx @@ -5,8 +5,7 @@ import { styled } from '@storybook/theming'; import { transparentize } from 'polished'; import { includeConditionalArg } from '@storybook/csf'; import { once } from '@storybook/client-logger'; -import { IconButton, ResetWrapper } from '@storybook/components'; -import { Icon, Link } from '@storybook/components/experimental'; +import { IconButton, Icons, ResetWrapper, Link } from '@storybook/components'; import { ArgRow } from './ArgRow'; import { SectionRow } from './SectionRow'; @@ -211,7 +210,7 @@ interface ArgsTableErrorProps { } export interface ArgsTableLoadingProps { - isLoading: true; + isLoading: boolean; } export type ArgsTableProps = ArgsTableOptionProps & @@ -380,7 +379,7 @@ export const ArgsTable: FC = (props) => { Control{' '} {!isLoading && resetArgs && ( resetArgs()} title="Reset controls"> - + )} diff --git a/code/ui/blocks/src/components/ArgsTable/Empty.tsx b/code/ui/blocks/src/components/ArgsTable/Empty.tsx index ea8e3c2f17fc..7fa211bffc0e 100644 --- a/code/ui/blocks/src/components/ArgsTable/Empty.tsx +++ b/code/ui/blocks/src/components/ArgsTable/Empty.tsx @@ -1,7 +1,7 @@ import type { FC } from 'react'; import React, { useEffect, useState } from 'react'; import { styled } from '@storybook/theming'; -import { Link } from '@storybook/components/experimental'; +import { Icons, Link } from '@storybook/components'; interface EmptyProps { inAddonPanel?: boolean; @@ -42,10 +42,11 @@ const Description = styled.div(({ theme }) => ({ color: theme.textMutedColor, })); -const Links = styled.div({ +const Links = styled.div(({ theme }) => ({ display: 'flex', + fontSize: theme.typography.size.s2 - 1, gap: 25, -}); +})); const Divider = styled.div(({ theme }) => ({ width: 1, @@ -85,8 +86,8 @@ export const Empty: FC = ({ inAddonPanel }) => { {inAddonPanel && ( <> - - Watch 5m video + + Watch 5m video void; @@ -34,7 +33,7 @@ const Zoom: FC = ({ zoom, resetZoom }) => ( }} title="Zoom in" > - + = ({ zoom, resetZoom }) => ( }} title="Zoom out" > - + = ({ zoom, resetZoom }) => ( }} title="Reset zoom" > - + ); diff --git a/code/ui/blocks/src/controls/Object.tsx b/code/ui/blocks/src/controls/Object.tsx index 8cd8c8bb7bea..11c51f8f6392 100644 --- a/code/ui/blocks/src/controls/Object.tsx +++ b/code/ui/blocks/src/controls/Object.tsx @@ -4,7 +4,6 @@ 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 { Icon } from '@storybook/components/experimental'; import { JsonTree, getObjectType } from './react-editable-json-tree'; import { getControlId, getControlSetterButtonId } from './helpers'; import type { ControlProps, ObjectValue, ObjectConfig } from './types'; @@ -295,7 +294,7 @@ export const ObjectControl: FC = ({ name, value, onChange }) => { setShowRaw((v) => !v); }} > - {showRaw ? : } + RAW )} diff --git a/code/ui/blocks/src/controls/options/Select.tsx b/code/ui/blocks/src/controls/options/Select.tsx index 43c47cfc3405..f033c131bd71 100644 --- a/code/ui/blocks/src/controls/options/Select.tsx +++ b/code/ui/blocks/src/controls/options/Select.tsx @@ -3,7 +3,8 @@ import React from 'react'; import { styled } from '@storybook/theming'; import type { CSSObject } from '@storybook/theming'; import { logger } from '@storybook/client-logger'; -import { Icon } from '@storybook/components/experimental'; +import { Icons } from '@storybook/components'; + import type { ControlProps, OptionsSelection, NormalizedOptionsConfig } from '../types'; import { selectedKey, selectedKeys, selectedValues } from './helpers'; @@ -72,17 +73,21 @@ const SelectWrapper = styled.span(({ theme }) => ({ position: 'relative', verticalAlign: 'top', width: '100%', -})); -const SelectChevronDown = styled.div(({ theme }) => ({ - position: 'absolute', - zIndex: 1, - pointerEvents: 'none', - height: '12px', - marginTop: '-6px', - right: '12px', - top: '50%', - color: theme.textMutedColor, + svg: { + position: 'absolute', + zIndex: 1, + pointerEvents: 'none', + height: '12px', + marginTop: '-6px', + right: '12px', + top: '50%', + fill: theme.textMutedColor, + + path: { + fill: theme.textMutedColor, + }, + }, })); type SelectConfig = NormalizedOptionsConfig & { isMulti: boolean }; @@ -99,9 +104,7 @@ const SingleSelect: FC = ({ name, value, options, onChange }) => { return ( - - - +