diff --git a/src/Spoiler/Spoiler.jsx b/src/Spoiler/Spoiler.jsx
new file mode 100644
index 0000000..b1cc652
--- /dev/null
+++ b/src/Spoiler/Spoiler.jsx
@@ -0,0 +1,109 @@
+'use strict';
+
+import React, { PropTypes } from 'react';
+
+import View from '../View';
+import Text from '../Text';
+import FontIcon from '../FontIcon';
+
+import { FONT, COLOR } from '../const/theme';
+
+import { StyleSheet, css } from '../helpers/styles';
+
+export default class Spoiler extends React.Component {
+ static propTypes = {
+ /**
+ * Spoiler title
+ */
+ title: PropTypes.string,
+ /**
+ * Spoiler text
+ */
+ text: PropTypes.string
+ };
+
+ static defaultProps = {
+ title: 'Спойлер'
+ };
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ isOpen: false
+ };
+ }
+
+ render() {
+ const props = this.props;
+ const state = this.state;
+
+ return (
+
+ this.setState({ isOpen: !state.isOpen })}
+ >
+
+
+
+
+ {props.title}
+
+
+ {
+ state.isOpen &&
+
+
+ {props.text}
+
+
+ }
+
+ )
+ }
+}
+
+const STYLE = StyleSheet.create({
+ root: {
+ flexDirection: 'column',
+ alignItems: 'stretch'
+ },
+ titleContainer: {
+ alignItems: 'center',
+ cursor: 'pointer'
+ },
+ iconContainer: {
+ width: '.75rem',
+ height: '1.25rem',
+ alignItems: 'center'
+ },
+ iconDown: {
+ width: '10px',
+ height: '10px',
+ border: '5px solid transparent',
+ borderTop: `5px solid ${COLOR.PRIMARY_MEDIUM}`,
+ marginTop: 5
+ },
+ iconRight: {
+ width: '10px',
+ height: '10px',
+ border: '5px solid transparent',
+ borderLeft: `5px solid ${COLOR.PRIMARY_MEDIUM}`,
+ marginLeft: 5
+ },
+ title: {
+ flex: 1,
+ fontSize: FONT.SIZE_TEXT,
+ lineHeight: '1.25rem',
+ color: COLOR.PRIMARY_MEDIUM
+ },
+ textContainer: {
+ paddingLeft: '.75rem',
+ marginBottom: '.5rem'
+ },
+ text: {
+ fontSize: FONT.SIZE_TEXT,
+ lineHeight: FONT.LINE_HEIGHT_TEXT
+ }
+});
diff --git a/src/Spoiler/Spoiler.md b/src/Spoiler/Spoiler.md
new file mode 100644
index 0000000..264e01b
--- /dev/null
+++ b/src/Spoiler/Spoiler.md
@@ -0,0 +1,26 @@
+### Usage
+
+```js
+import Spoiler from '@roistat/ui/lib/Spoiler';
+```
+const View = require('../View').default;
+
+Spoiler example
+
+
+ Я сразу смазал карту будня,
+ плеснувши краску из стакана;
+ я показал на блюде студня
+ косые скулы океана.
+ На чешуе жестяной рыбы
+ прочел я зовы новых губ.
+ А вы
+ ноктюрн сыграть
+ могли бы
+ на флейте водосточных труб?
+
+ }
+ />
diff --git a/src/Spoiler/index.js b/src/Spoiler/index.js
new file mode 100644
index 0000000..5baae90
--- /dev/null
+++ b/src/Spoiler/index.js
@@ -0,0 +1 @@
+export { default } from './Spoiler';
diff --git a/src/Spoiler/story.jsx b/src/Spoiler/story.jsx
new file mode 100644
index 0000000..580c76d
--- /dev/null
+++ b/src/Spoiler/story.jsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import { storiesOf, action } from '@kadira/storybook';
+import Spoiler from './Spoiler';
+import View from '../View';
+
+storiesOf('Spoiler', module)
+ .addWithInfo('Spoiler', 'Spoiler example', () => (
+
+ Я сразу смазал карту будня,
+ плеснувши краску из стакана;
+ я показал на блюде студня
+ косые скулы океана.
+ На чешуе жестяной рыбы
+ прочел я зовы новых губ.
+ А вы
+ ноктюрн сыграть
+ могли бы
+ на флейте водосточных труб?
+
+ }
+ />
+ ));