diff --git a/ts/components/Lightbox.md b/ts/components/Lightbox.md
deleted file mode 100644
index e93d2e7cbd38..000000000000
--- a/ts/components/Lightbox.md
+++ /dev/null
@@ -1,108 +0,0 @@
-## Image
-
-```jsx
-const noop = () => {};
-
-
-
-
;
-```
-
-## Image with caption
-
-```jsx
-const noop = () => {};
-
-
-
-
;
-```
-
-## Image with timer
-
-```jsx
-const noop = () => {};
-
-
- console.log('close')}
- i18n={util.i18n}
- />
-
;
-```
-
-## Image (unsupported format)
-
-```jsx
-const noop = () => {};
-
-
-
-
;
-```
-
-## Video (supported format)
-
-```jsx
-const noop = () => {};
-
-
-
-
;
-```
-
-## Video (unsupported format)
-
-```jsx
-const noop = () => {};
-
-
-
-
;
-```
-
-## Unsupported file format
-
-```jsx
-const noop = () => {};
-
-
-
-
;
-```
diff --git a/ts/components/Lightbox.stories.tsx b/ts/components/Lightbox.stories.tsx
new file mode 100644
index 000000000000..492c9327c2ad
--- /dev/null
+++ b/ts/components/Lightbox.stories.tsx
@@ -0,0 +1,120 @@
+import * as React from 'react';
+
+import { action } from '@storybook/addon-actions';
+import { boolean, text } from '@storybook/addon-knobs';
+import { storiesOf } from '@storybook/react';
+
+import { Lightbox, Props } from './Lightbox';
+import {
+ AUDIO_MP3,
+ IMAGE_JPEG,
+ MIMEType,
+ VIDEO_MP4,
+ VIDEO_QUICKTIME,
+} from '../types/MIME';
+
+// @ts-ignore
+import { setup as setupI18n } from '../../js/modules/i18n';
+// @ts-ignore
+import enMessages from '../../_locales/en/messages.json';
+const i18n = setupI18n('en', enMessages);
+
+const story = storiesOf('Components/Lightbox', module);
+
+const createProps = (overrideProps: Partial = {}): Props => ({
+ caption: text('caption', overrideProps.caption || ''),
+ close: action('close'),
+ contentType: overrideProps.contentType || IMAGE_JPEG,
+ i18n,
+ isViewOnce: boolean('isViewOnce', overrideProps.isViewOnce || false),
+ objectURL: text('objectURL', overrideProps.objectURL || ''),
+ onNext: overrideProps.onNext,
+ onPrevious: overrideProps.onPrevious,
+ onSave: overrideProps.onSave,
+});
+
+story.add('Image', () => {
+ const props = createProps({
+ objectURL: '/fixtures/tina-rolf-269345-unsplash.jpg',
+ });
+
+ return ;
+});
+
+story.add('Image with Caption', () => {
+ const props = createProps({
+ caption:
+ 'This is the user-provided caption. It can get long and wrap onto multiple lines.',
+ objectURL: '/fixtures/tina-rolf-269345-unsplash.jpg',
+ });
+
+ return ;
+});
+
+story.add('Video', () => {
+ const props = createProps({
+ contentType: VIDEO_MP4,
+ objectURL: '/fixtures/pixabay-Soap-Bubble-7141.mp4',
+ });
+
+ return ;
+});
+
+story.add('Video with Caption', () => {
+ const props = createProps({
+ caption:
+ 'This is the user-provided caption. It can get long and wrap onto multiple lines.',
+ contentType: VIDEO_MP4,
+ objectURL: '/fixtures/pixabay-Soap-Bubble-7141.mp4',
+ });
+
+ return ;
+});
+
+story.add('Video (View Once)', () => {
+ const props = createProps({
+ contentType: VIDEO_MP4,
+ isViewOnce: true,
+ objectURL: '/fixtures/pixabay-Soap-Bubble-7141.mp4',
+ });
+
+ return ;
+});
+
+story.add('Unsupported Image Type', () => {
+ const props = createProps({
+ contentType: 'image/tiff' as MIMEType,
+ objectURL: 'unsupported-image.tiff',
+ });
+
+ return ;
+});
+
+story.add('Unsupported Video Type', () => {
+ const props = createProps({
+ contentType: VIDEO_QUICKTIME,
+ objectURL: 'unsupported-video.mov',
+ });
+
+ return ;
+});
+
+story.add('Unsupported ContentType', () => {
+ const props = createProps({
+ contentType: AUDIO_MP3,
+ objectURL: '/fixtures/incompetech-com-Agnus-Dei-X.mp3',
+ });
+
+ return ;
+});
+
+story.add('Including Next/Previous/Save Callbacks', () => {
+ const props = createProps({
+ objectURL: '/fixtures/tina-rolf-269345-unsplash.jpg',
+ onNext: action('onNext'),
+ onPrevious: action('onPrevious'),
+ onSave: action('onSave'),
+ });
+
+ return ;
+});
diff --git a/ts/components/Lightbox.tsx b/ts/components/Lightbox.tsx
index ac6d94caa3a0..a87bed883363 100644
--- a/ts/components/Lightbox.tsx
+++ b/ts/components/Lightbox.tsx
@@ -23,7 +23,7 @@ const colorSVG = (url: string, color: string) => {
};
};
-interface Props {
+export interface Props {
close: () => void;
contentType: MIME.MIMEType | undefined;
i18n: LocalizerType;
@@ -363,7 +363,7 @@ export class Lightbox extends React.Component {
!isVideoTypeSupported && MIME.isVideo(contentType);
if (isUnsupportedImageType || isUnsupportedVideoType) {
const iconUrl = isUnsupportedVideoType
- ? 'images/video.svg'
+ ? 'images/movie.svg'
: 'images/image.svg';
return ;