.storybook/preview.tsx
import React, { ChakraProvider, extendTheme } from '@chakra-ui/react';
import type { StoryContext } from '@storybook/react';
import * as NextImage from 'next/image';
import { i18n } from './i18n';
import { withI18Next } from '../node_modules/storybook-react-i18next/dist/esm/withI18Next';
const OriginalNextImage = NextImage.default;
Object.defineProperty(NextImage, 'default', {
configurable: true,
value: (props) => <OriginalNextImage {...props} unoptimized loader={({ src }) => src} />,
});
export const parameters = {
i18n,
locale: 'en',
locales: {
en: 'English',
ja: '日本語',
},
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
};
/**
* Add global context for RTL-LTR switching
*/
export const globalTypes = {
direction: {
name: 'Direction',
description: 'Direction for layout',
defaultValue: 'LTR',
toolbar: {
icon: 'globe',
items: ['LTR', 'RTL'],
},
},
};
const withChakra = (StoryFn: Function, context: StoryContext) => {
const { direction } = context.globals;
const dir = direction.toLowerCase();
return (
<ChakraProvider theme={extendTheme({ direction: dir })}>
<div dir={dir} id="story-wrapper" style={{ minHeight: '100vh' }}>
<StoryFn />
</div>
</ChakraProvider>
);
};
export const decorators = [withChakra, withI18Next];