53 changed files with 565 additions and 54 deletions
@ -0,0 +1,8 @@ |
|||||||
|
interface Props { |
||||||
|
content: string; |
||||||
|
} |
||||||
|
|
||||||
|
export default function CustomPageContent(props: Props) { |
||||||
|
const { content } = props; |
||||||
|
return <div>{content}</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ExternalAction } from '../interfaces/external-action.interface'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
action: ExternalAction; |
||||||
|
} |
||||||
|
|
||||||
|
export default function ExternalActionButton(props: Props) { |
||||||
|
return <div>External action button component goes here</div>; |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
interface Props { |
||||||
|
url: string; |
||||||
|
} |
||||||
|
|
||||||
|
export default function PageLogo(props: Props) { |
||||||
|
return <div>Pimary logo component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { SocialLink } from '../interfaces/social-link.model'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
links: SocialLink[]; |
||||||
|
} |
||||||
|
|
||||||
|
export default function SocialLinks(props: Props) { |
||||||
|
return <div>Social links component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function UserDropdown(props: Props) { |
||||||
|
return <div>User settings dropdown component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ChatMessage } from '../../interfaces/chat-message.model'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
message: ChatMessage; |
||||||
|
} |
||||||
|
|
||||||
|
export default function ChatSystemMessage(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ChatMessage } from '../../interfaces/chat-message.model'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
messages: ChatMessage[]; |
||||||
|
} |
||||||
|
|
||||||
|
export default function ChatContainer(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function ChatModerationNotification(props: Props) { |
||||||
|
return <div>You are now a moderator notification component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ChatMessage } from '../../interfaces/chat-message.model'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
message: ChatMessage; |
||||||
|
} |
||||||
|
|
||||||
|
export default function ChatSocialMessage(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ChatMessage } from '../../interfaces/chat-message.model'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
message: ChatMessage; |
||||||
|
} |
||||||
|
|
||||||
|
export default function ChatSystemMessage(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function ChatTextField(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ChatMessage } from '../../interfaces/chat-message.model'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
message: ChatMessage; |
||||||
|
} |
||||||
|
|
||||||
|
export default function ChatUserMessage(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function AuthModal(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function BrowserNotifyModal(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function FediAuthModal(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function FollowModal(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
interface Props {} |
||||||
|
|
||||||
|
export default function IndieAuthModal(props: Props) { |
||||||
|
return <div>Component goes here</div>; |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
interface Props { |
||||||
|
online: boolean; |
||||||
|
viewers: number; |
||||||
|
timer: string; |
||||||
|
} |
||||||
|
|
||||||
|
export default function StatusBar(props: Props) { |
||||||
|
return <div>Stream status bar goes here</div>; |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
export interface ChatMessage {} |
@ -0,0 +1,6 @@ |
|||||||
|
export interface ExternalAction { |
||||||
|
title: string; |
||||||
|
description?: string; |
||||||
|
color?: string; |
||||||
|
url: string; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
export interface SocialLink { |
||||||
|
platform: string; |
||||||
|
icon: string; |
||||||
|
url: string; |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
import { ClientConfig } from '../models/ClientConfig'; |
import { ClientConfig } from '../interfaces/client-config.model'; |
||||||
const ENDPOINT = `http://localhost:8080/api/config`; |
const ENDPOINT = `http://localhost:8080/api/config`; |
||||||
|
|
||||||
class ClientConfigService { |
class ClientConfigService { |
@ -1,4 +1,4 @@ |
|||||||
import ServerStatus from '../models/ServerStatus'; |
import ServerStatus from '../interfaces/server-status.model'; |
||||||
|
|
||||||
const ENDPOINT = `http://localhost:8080/api/status`; |
const ENDPOINT = `http://localhost:8080/api/status`; |
||||||
|
|
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import AuthModal from '../components/modals/AuthModal'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<AuthModal /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Modals/Auth', |
||||||
|
component: AuthModal, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof AuthModal>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof AuthModal> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import BrowserNotifyModal from '../components/modals/BrowserNotifyModal'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<AuthModal /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Modals/Browser Push Notifications', |
||||||
|
component: BrowserNotifyModal, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof BrowserNotifyModal>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof BrowserNotifyModal> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,15 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ChatActionMessage from '../components/chat/ChatActionMessage'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Messages/Chat action', |
||||||
|
component: ChatActionMessage, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ChatActionMessage>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ChatActionMessage> = args => <ChatActionMessage />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ChatContainer from '../components/chat/ChatContainer'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<ChatContainer /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Chat messages container', |
||||||
|
component: ChatContainer, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ChatContainer>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ChatContainer> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,17 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ChatModeratorNotification from '../components/chat/ChatModeratorNotification'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Messages/Moderator notification', |
||||||
|
component: ChatModeratorNotification, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ChatModeratorNotification>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ChatModeratorNotification> = args => ( |
||||||
|
<ChatModeratorNotification /> |
||||||
|
); |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,15 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ChatSocialMessage from '../components/chat/ChatSocialMessage'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Messages/Social-fediverse event', |
||||||
|
component: ChatSocialMessage, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ChatSocialMessage>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ChatSocialMessage> = args => <ExamChatSocialMessageple />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,15 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ChatSystemMessage from '../components/chat/ChatSystemMessage'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Messages/System', |
||||||
|
component: ChatSystemMessage, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ChatSystemMessage>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ChatSystemMessage> = args => <ChatSystemMessage />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ChatTextField from '../components/chat/ChatTextField'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<ChatTextField /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Input text field', |
||||||
|
component: ChatTextField, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ChatTextField>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ChatTextField> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,15 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import UserChatMessage from '../components/chat/ChatUserMessage'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Chat/Messages/Standard user', |
||||||
|
component: UserChatMessage, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof UserChatMessage>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof UserChatMessage> = args => <UserChatMessage />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
File diff suppressed because one or more lines are too long
@ -0,0 +1,39 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import ExternalActionButton from '../components/ExternalActionButton'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/External action button', |
||||||
|
component: ExternalActionButton, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof ExternalActionButton>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof ExternalActionButton> = args => ( |
||||||
|
<ExternalActionButton {...args} /> |
||||||
|
); |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Example1 = Template.bind({}); |
||||||
|
Example1.args = { |
||||||
|
action: { |
||||||
|
url: 'https://owncast.online/docs', |
||||||
|
title: 'Documentation', |
||||||
|
description: 'Owncast Documentation', |
||||||
|
icon: 'https://owncast.online/images/logo.svg', |
||||||
|
color: '#5232c8', |
||||||
|
openExternally: false, |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
export const Example2 = Template.bind({}); |
||||||
|
Example2.args = { |
||||||
|
action: { |
||||||
|
url: 'https://opencollective.com/embed/owncast/donate', |
||||||
|
title: 'Support Owncast', |
||||||
|
description: 'Contribute to Owncast', |
||||||
|
icon: 'https://opencollective.com/static/images/opencollective-icon.svg', |
||||||
|
color: '#2b4863', |
||||||
|
openExternally: false, |
||||||
|
}, |
||||||
|
}; |
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import FediAuthModal from '../components/modals/FediAuthModal'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<FediAuthModal /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Modals/FediAuth', |
||||||
|
component: FediAuthModal, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof FediAuthModal>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof FediAuthModal> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import FollowModal from '../components/modals/FollowModal'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<FollowModal /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Modals/Follow', |
||||||
|
component: FollowModal, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof FollowModal>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof FollowModal> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,21 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import IndieAuthModal from '../components/modals/IndieAuthModal'; |
||||||
|
|
||||||
|
const Example = () => ( |
||||||
|
<div> |
||||||
|
<IndieAuthModal /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Modals/IndieAuth', |
||||||
|
component: IndieAuthModal, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof IndieAuthModal>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof IndieAuthModal> = args => <Example />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Basic = Template.bind({}); |
@ -0,0 +1,23 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import PageLogo from '../components/PageLogo'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Page Logo', |
||||||
|
component: PageLogo, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof PageLogo>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof PageLogo> = args => <PageLogo {...args} />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Logo = Template.bind({}); |
||||||
|
Logo.args = { |
||||||
|
url: '/logo', |
||||||
|
}; |
||||||
|
|
||||||
|
export const DemoServer = Template.bind({}); |
||||||
|
DemoServer.args = { |
||||||
|
url: 'https://watch.owncast.online/logo', |
||||||
|
}; |
@ -0,0 +1,35 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import SocialLinks from '../components/SocialLinks'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Social links', |
||||||
|
component: SocialLinks, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof SocialLinks>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof SocialLinks> = args => <SocialLinks {...args} />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Populated = Template.bind({}); |
||||||
|
Populated.args = { |
||||||
|
links: [ |
||||||
|
{ |
||||||
|
platform: 'github', |
||||||
|
url: 'https://github.com/owncast/owncast', |
||||||
|
icon: '/img/platformlogos/github.svg', |
||||||
|
}, |
||||||
|
{ platform: 'Documentation', url: 'https://owncast.online' }, |
||||||
|
{ |
||||||
|
platform: 'mastodon', |
||||||
|
url: 'https://fosstodon.org/users/owncast', |
||||||
|
icon: '/img/platformlogos/mastodon.svg', |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
|
||||||
|
export const Empty = Template.bind({}); |
||||||
|
Empty.args = { |
||||||
|
links: [], |
||||||
|
}; |
@ -0,0 +1,25 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import StatusBar from '../components/video/StatusBar'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/Status bar', |
||||||
|
component: StatusBar, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof StatusBar>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof StatusBar> = args => <StatusBar {...args} />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Online = Template.bind({}); |
||||||
|
Online.args = { |
||||||
|
online: true, |
||||||
|
viewers: 42, |
||||||
|
timer: '10:42', |
||||||
|
}; |
||||||
|
|
||||||
|
export const Offline = Template.bind({}); |
||||||
|
Offline.args = { |
||||||
|
online: false, |
||||||
|
}; |
@ -0,0 +1,15 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { ComponentStory, ComponentMeta } from '@storybook/react'; |
||||||
|
import UserDropdownMenu from '../components/UserDropdownMenu'; |
||||||
|
|
||||||
|
export default { |
||||||
|
title: 'owncast/User settings dropdown menu', |
||||||
|
component: UserDropdownMenu, |
||||||
|
parameters: {}, |
||||||
|
} as ComponentMeta<typeof UserDropdownMenu>; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const Template: ComponentStory<typeof UserDropdownMenu> = args => <UserDropdownMenu />; |
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const Example = Template.bind({}); |
Loading…
Reference in new issue