import 'focus-visible'; import 'docs-ui/index.js'; import {Theme, ThemeProvider} from '@emotion/react'; import {DocsContainer, Meta} from '@storybook/addon-docs'; import {addDecorator, addParameters, DecoratorFn, Parameters} from '@storybook/react'; import {themes} from '@storybook/theming'; import Code from 'docs-ui/components/code'; import ColorChip from 'docs-ui/components/colorChip'; import DocsLinks from 'docs-ui/components/docsLinks'; import DoDont from 'docs-ui/components/doDont'; import Sample from 'docs-ui/components/sample'; import TableOfContents from 'docs-ui/components/tableOfContents'; import {useDarkMode} from 'storybook-dark-mode'; import GlobalStyles from 'sentry/styles/global'; import {darkTheme, lightTheme} from 'sentry/utils/theme'; import {DocsGlobalStyles, StoryGlobalStyles} from './globalStyles'; type ExtendedTheme = Theme & { /** * [For Storybook only, do not use inside the app.] * * Substitute for the "background" property in Storybook components * (anything inside docs-ui), since Storybook overrides "background" with * its own object value. */ docsBackground?: string; }; // Theme decorator for stories const WithThemeStory: DecoratorFn = (Story, context) => { const isDark = useDarkMode(); const currentTheme = isDark ? darkTheme : lightTheme; // Set @storybook/addon-backgrounds current color based on theme if (context.globals.theme) { context.globals.backgrounds = {value: currentTheme.bodyBackground}; } return ( ); }; addDecorator(WithThemeStory); // Theme decorator for MDX Docs const WithThemeDocs: DecoratorFn = ({children, context}) => { const isDark = useDarkMode(); const currentTheme: ExtendedTheme = isDark ? darkTheme : lightTheme; currentTheme.docsBackground = currentTheme.background; // Set @storybook/addon-backgrounds current color based on theme if (context.globals.theme) { context.globals.backgrounds = {value: currentTheme.bodyBackground}; } const {hideToc} = context.parameters; return ( {children} ); }; // Option defaults: addParameters({ docs: { container: WithThemeDocs, components: {Meta, code: Code, ColorChip, DocsLinks, DoDont, Sample}, }, options: { /** * show story component as full screen * @type {Boolean} */ isFullscreen: false, /** * display panel that shows a list of stories * @type {Boolean} */ showNav: true, /** * display panel that shows addon configurations * @type {Boolean} */ showPanel: true, /** * where to show the addon panel * @type {('bottom'|'right')} */ panelPosition: 'bottom', /** * regex for finding the hierarchy separator * @example: * null - turn off hierarchy * /\// - split by `/` * /\./ - split by `.` * /\/|\./ - split by `/` or `.` * @type {Regex} */ hierarchySeparator: /\/|\./, /** * regex for finding the hierarchy root separator * @example: * null - turn off multiple hierarchy roots * /\|/ - split by `|` * @type {Regex} */ hierarchyRootSeparator: /\|/, /** * sidebar tree animat * ions * @type {Boolean} */ sidebarAnimations: true, /** * enable/disable shortcuts * @type {Boolean} */ enableShortcuts: true, /** * show/hide tool bar * @type {Boolean} */ showToolbar: true, /** * function to sort stories in the tree view * common use is alphabetical `(a, b) => a[1].id.localeCompare(b[1].id)` * if left undefined, then the order in which the stories are imported will * be the order they display * @type {Function} */ storySort: { order: [ 'Getting Started', 'Changelog', 'Core', ['Overview', 'Colors', 'Typography'], 'Assets', ['Icons', 'Logo', 'Platforms'], 'Components', [ 'Buttons', 'Tables', 'Forms', 'Segmented Control', 'Data Visualization', 'Alerts', 'Tags', 'Badges', 'Pills', 'Tooltips', 'Toast Indicators', 'Loading Indicators', 'Avatars', 'Context Data', 'Confirm', 'Well', ], 'Views', [ 'Layout - Narrow', 'Layout - Thirds', 'Sidebar Section', 'Modals', 'Activity', 'Empty States', 'Not Available', 'Page Heading', 'Tabs', 'Breadcrumbs', 'Detailed Error', 'Onboarding Panel', ], 'Utilities', [ 'Text', 'Copy', 'Clipboard', 'Highlight', 'Hidden Content', 'Lazy Load', 'Command Line', 'Get Dynamic Text', ], 'Features', 'Deprecated', ], }, }, }); const commonTheme = { brandTitle: 'Sentry UI System', brandUrl: '#', fontBase: '"Rubik", sans-serif', }; const getThemeColors = (theme: ExtendedTheme) => ({ appBg: theme.bodyBackground, appContentBg: theme.background, appBorderColor: theme.innerBorder, textColor: theme.textColor, textInverseColor: theme.white, barTextColor: theme.subText, barSelectedColor: theme.active, barBg: theme.background, inputBg: theme.backgroundElevated, inputBorder: theme.border, inputTextColor: theme.textColor, }); export const parameters: Parameters = { darkMode: { dark: { ...themes.dark, ...commonTheme, ...getThemeColors(darkTheme), }, light: { ...themes.normal, ...commonTheme, ...getThemeColors(lightTheme), }, }, }; // Configure Emotion to use our theme declare module '@emotion/react' { export interface Theme extends ExtendedTheme {} }