about summary refs log tree commit diff
path: root/app/javascript
diff options
context:
space:
mode:
Diffstat (limited to 'app/javascript')
-rw-r--r--app/javascript/glitch/actions/local_settings.js (renamed from app/javascript/mastodon/actions/local_settings.js)0
-rw-r--r--app/javascript/glitch/components/account/header.js (renamed from app/javascript/mastodon/features/account/components/header.js)13
-rw-r--r--app/javascript/glitch/components/compose/advanced_options.js (renamed from app/javascript/mastodon/features/compose/components/advanced_options_dropdown.js)7
-rw-r--r--app/javascript/glitch/components/notification/index.js (renamed from app/javascript/mastodon/features/notifications/components/notification.js)13
-rw-r--r--app/javascript/glitch/components/settings/index.js (renamed from app/javascript/mastodon/features/ui/components/settings_modal.js)92
-rw-r--r--app/javascript/glitch/components/settings/item.js79
-rw-r--r--app/javascript/glitch/components/status/action_bar.js (renamed from app/javascript/mastodon/components/status_action_bar.js)9
-rw-r--r--app/javascript/glitch/components/status/content.js (renamed from app/javascript/mastodon/components/status_content.js)9
-rw-r--r--app/javascript/glitch/components/status/gallery/index.js79
-rw-r--r--app/javascript/glitch/components/status/gallery/item.js (renamed from app/javascript/mastodon/components/media_gallery.js)75
-rw-r--r--app/javascript/glitch/components/status/header.js (renamed from app/javascript/mastodon/components/status_header.js)14
-rw-r--r--app/javascript/glitch/components/status/index.js (renamed from app/javascript/mastodon/components/status.js)29
-rw-r--r--app/javascript/glitch/components/status/prepend.js (renamed from app/javascript/mastodon/components/status_prepend.js)8
-rw-r--r--app/javascript/glitch/components/status/video_player.js (renamed from app/javascript/mastodon/components/video_player.js)9
-rw-r--r--app/javascript/glitch/containers/compose/advanced_options.js22
-rw-r--r--app/javascript/glitch/containers/notification/index.js (renamed from app/javascript/mastodon/features/notifications/containers/notification_container.js)9
-rw-r--r--app/javascript/glitch/containers/settings/index.js (renamed from app/javascript/mastodon/features/ui/containers/settings_modal_container.js)13
-rw-r--r--app/javascript/glitch/containers/status/index.js (renamed from app/javascript/mastodon/containers/status_container.js)36
-rw-r--r--app/javascript/glitch/reducers/local_settings.js (renamed from app/javascript/mastodon/reducers/local_settings.js)9
-rw-r--r--app/javascript/glitch/util/bio_metadata.js (renamed from app/javascript/mastodon/features/account/util/bio_metadata.js)0
-rw-r--r--app/javascript/mastodon/components/status_list.js2
-rw-r--r--app/javascript/mastodon/features/account_timeline/components/header.js2
-rw-r--r--app/javascript/mastodon/features/compose/components/compose_form.js4
-rw-r--r--app/javascript/mastodon/features/compose/components/search_results.js2
-rw-r--r--app/javascript/mastodon/features/compose/containers/advanced_options_container.js17
-rw-r--r--app/javascript/mastodon/features/compose/index.js2
-rw-r--r--app/javascript/mastodon/features/notifications/index.js2
-rw-r--r--app/javascript/mastodon/features/status/components/detailed_status.js10
-rw-r--r--app/javascript/mastodon/features/status/index.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/boost_modal.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/modal_root.js4
-rw-r--r--app/javascript/mastodon/reducers/index.js2
-rw-r--r--app/javascript/packs/public.js2
33 files changed, 315 insertions, 263 deletions
diff --git a/app/javascript/mastodon/actions/local_settings.js b/app/javascript/glitch/actions/local_settings.js
index 18e0c245c..18e0c245c 100644
--- a/app/javascript/mastodon/actions/local_settings.js
+++ b/app/javascript/glitch/actions/local_settings.js
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/glitch/components/account/header.js
index 32424400f..875ee3c54 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/glitch/components/account/header.js
@@ -1,13 +1,18 @@
+//  Package imports  //
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import emojify from '../../../emoji';
 import escapeTextContentForBrowser from 'escape-html';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import IconButton from '../../../components/icon_button';
-import Avatar from '../../../components/avatar';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { processBio } from '../util/bio_metadata';
+
+//  Mastodon imports  //
+import emojify from '../../../mastodon/emoji';
+import IconButton from '../../../mastodon/components/icon_button';
+import Avatar from '../../../mastodon/components/avatar';
+
+//  Our imports  //
+import { processBio } from '../../util/bio_metadata';
 
 const messages = defineMessages({
   unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
diff --git a/app/javascript/mastodon/features/compose/components/advanced_options_dropdown.js b/app/javascript/glitch/components/compose/advanced_options.js
index aea810b66..0e72bd053 100644
--- a/app/javascript/mastodon/features/compose/components/advanced_options_dropdown.js
+++ b/app/javascript/glitch/components/compose/advanced_options.js
@@ -1,10 +1,13 @@
+//  Package imports  //
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import IconButton from '../../../components/icon_button';
 import Toggle from 'react-toggle';
 import { injectIntl, defineMessages } from 'react-intl';
 
+//  Mastodon imports  //
+import IconButton from '../../../mastodon/components/icon_button';
+
 const messages = defineMessages({
   local_only_short: { id: 'advanced-options.local-only.short', defaultMessage: 'Local-only' },
   local_only_long: { id: 'advanced-options.local-only.long', defaultMessage: 'Do not post to other instances' },
@@ -17,7 +20,7 @@ const iconStyle = {
 };
 
 @injectIntl
-export default class AdvancedOptionsDropdown extends React.PureComponent {
+export default class ComposeAdvancedOptions extends React.PureComponent {
 
   static propTypes = {
     values: ImmutablePropTypes.contains({
diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/glitch/components/notification/index.js
index 2b2171f8b..3f424d85d 100644
--- a/app/javascript/mastodon/features/notifications/components/notification.js
+++ b/app/javascript/glitch/components/notification/index.js
@@ -1,13 +1,18 @@
+//  Package imports  //
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import StatusContainer from '../../../containers/status_container';
-import AccountContainer from '../../../containers/account_container';
 import { FormattedMessage } from 'react-intl';
-import Permalink from '../../../components/permalink';
-import emojify from '../../../emoji';
 import escapeTextContentForBrowser from 'escape-html';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
+//  Mastodon imports  //
+import AccountContainer from '../../../mastodon/containers/account_container';
+import Permalink from '../../../mastodon/components/permalink';
+import emojify from '../../../mastodon/emoji';
+
+//  Our imports  //
+import StatusContainer from '../../containers/status';
+
 export default class Notification extends ImmutablePureComponent {
 
   static propTypes = {
diff --git a/app/javascript/mastodon/features/ui/components/settings_modal.js b/app/javascript/glitch/components/settings/index.js
index 9ed2acbc7..afe7e9a87 100644
--- a/app/javascript/mastodon/features/ui/components/settings_modal.js
+++ b/app/javascript/glitch/components/settings/index.js
@@ -1,7 +1,11 @@
+//  Package imports  //
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
+import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
+
+//  Our imports  //
+import SettingsItem from './item';
 
 const messages = defineMessages({
   layout_auto: {  id: 'layout.auto', defaultMessage: 'Auto' },
@@ -10,89 +14,14 @@ const messages = defineMessages({
 });
 
 @injectIntl
-class SettingsItem extends React.PureComponent {
-
-  static propTypes = {
-    settings: ImmutablePropTypes.map.isRequired,
-    item: PropTypes.array.isRequired,
-    id: PropTypes.string.isRequired,
-    options: PropTypes.arrayOf(PropTypes.shape({
-      value: PropTypes.string.isRequired,
-      message: PropTypes.object.isRequired,
-    })),
-    dependsOn: PropTypes.array,
-    dependsOnNot: PropTypes.array,
-    children: PropTypes.element.isRequired,
-    onChange: PropTypes.func.isRequired,
-    intl: PropTypes.object.isRequired,
-  };
-
-  handleChange = (e) => {
-    const { item, onChange } = this.props;
-    onChange(item, e);
-  }
-
-  render () {
-    const { settings, item, id, options, children, dependsOn, dependsOnNot, intl } = this.props;
-    let enabled = true;
-
-    if (dependsOn) {
-      for (let i = 0; i < dependsOn.length; i++) {
-        enabled = enabled && settings.getIn(dependsOn[i]);
-      }
-    }
-    if (dependsOnNot) {
-      for (let i = 0; i < dependsOnNot.length; i++) {
-        enabled = enabled && !settings.getIn(dependsOnNot[i]);
-      }
-    }
-
-    if (options && options.length > 0) {
-      const currentValue = settings.getIn(item);
-      const optionElems = options && options.length > 0 && options.map((opt) => (
-        <option key={opt.value} selected={currentValue === opt.value} value={opt.value} >
-          {intl.formatMessage(opt.message)}
-        </option>
-      ));
-      return (
-        <label htmlFor={id}>
-          <p>{children}</p>
-          <p>
-            <select
-              id={id}
-              disabled={!enabled}
-              onBlur={this.handleChange}
-            >
-              {optionElems}
-            </select>
-          </p>
-        </label>
-      );
-    } else {
-      return (
-        <label htmlFor={id}>
-          <input
-            id={id}
-            type='checkbox'
-            checked={settings.getIn(item)}
-            onChange={this.handleChange}
-            disabled={!enabled}
-          />
-          {children}
-        </label>
-      );
-    }
-  }
-
-}
-
-export default class SettingsModal extends React.PureComponent {
+export default class Settings extends React.PureComponent {
 
   static propTypes = {
     settings: ImmutablePropTypes.map.isRequired,
     toggleSetting: PropTypes.func.isRequired,
     changeSetting: PropTypes.func.isRequired,
     onClose: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
   };
 
   state = {
@@ -100,6 +29,7 @@ export default class SettingsModal extends React.PureComponent {
   };
 
   General = () => {
+    const { intl } = this.props;
     return (
       <div>
         <h1><FormattedMessage id='settings.general' defaultMessage='General' /></h1>
@@ -108,9 +38,9 @@ export default class SettingsModal extends React.PureComponent {
           item={['layout']}
           id='mastodon-settings--layout'
           options={[
-            { value: 'auto', message: messages.layout_auto },
-            { value: 'multiple', message: messages.layout_desktop },
-            { value: 'single', message: messages.layout_mobile },
+            { value: 'auto', message: intl.formatMessage(messages.layout_auto) },
+            { value: 'multiple', message: intl.formatMessage(messages.layout_desktop) },
+            { value: 'single', message: intl.formatMessage(messages.layout_mobile) },
           ]}
           onChange={this.props.changeSetting}
         >
diff --git a/app/javascript/glitch/components/settings/item.js b/app/javascript/glitch/components/settings/item.js
new file mode 100644
index 000000000..4c67cc2ac
--- /dev/null
+++ b/app/javascript/glitch/components/settings/item.js
@@ -0,0 +1,79 @@
+//  Package imports  //
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+
+export default class SettingsItem extends React.PureComponent {
+
+  static propTypes = {
+    settings: ImmutablePropTypes.map.isRequired,
+    item: PropTypes.array.isRequired,
+    id: PropTypes.string.isRequired,
+    options: PropTypes.arrayOf(PropTypes.shape({
+      value: PropTypes.string.isRequired,
+      message: PropTypes.object.isRequired,
+    })),
+    dependsOn: PropTypes.array,
+    dependsOnNot: PropTypes.array,
+    children: PropTypes.element.isRequired,
+    onChange: PropTypes.func.isRequired,
+  };
+
+  handleChange = (e) => {
+    const { item, onChange } = this.props;
+    onChange(item, e);
+  }
+
+  render () {
+    const { settings, item, id, options, children, dependsOn, dependsOnNot } = this.props;
+    let enabled = true;
+
+    if (dependsOn) {
+      for (let i = 0; i < dependsOn.length; i++) {
+        enabled = enabled && settings.getIn(dependsOn[i]);
+      }
+    }
+    if (dependsOnNot) {
+      for (let i = 0; i < dependsOnNot.length; i++) {
+        enabled = enabled && !settings.getIn(dependsOnNot[i]);
+      }
+    }
+
+    if (options && options.length > 0) {
+      const currentValue = settings.getIn(item);
+      const optionElems = options && options.length > 0 && options.map((opt) => (
+        <option key={opt.value} selected={currentValue === opt.value} value={opt.value} >
+          {opt.message}
+        </option>
+      ));
+      return (
+        <label htmlFor={id}>
+          <p>{children}</p>
+          <p>
+            <select
+              id={id}
+              disabled={!enabled}
+              onBlur={this.handleChange}
+            >
+              {optionElems}
+            </select>
+          </p>
+        </label>
+      );
+    } else {
+      return (
+        <label htmlFor={id}>
+          <input
+            id={id}
+            type='checkbox'
+            checked={settings.getIn(item)}
+            onChange={this.handleChange}
+            disabled={!enabled}
+          />
+          {children}
+        </label>
+      );
+    }
+  }
+
+}
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/glitch/components/status/action_bar.js
index c26261d1a..f298dcaa8 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/glitch/components/status/action_bar.js
@@ -1,11 +1,14 @@
+//  Package imports  //
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import IconButton from './icon_button';
-import DropdownMenu from './dropdown_menu';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import RelativeTimestamp from './relative_timestamp';
+
+//  Mastodon imports  //
+import RelativeTimestamp from '../../../mastodon/components/relative_timestamp';
+import IconButton from '../../../mastodon/components/icon_button';
+import DropdownMenu from '../../../mastodon/components/dropdown_menu';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/glitch/components/status/content.js
index 26103e1a3..76f5b765a 100644
--- a/app/javascript/mastodon/components/status_content.js
+++ b/app/javascript/glitch/components/status/content.js
@@ -1,11 +1,14 @@
+//  Package imports  //
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import escapeTextContentForBrowser from 'escape-html';
 import PropTypes from 'prop-types';
-import emojify from '../emoji';
-import { isRtl } from '../rtl';
 import { FormattedMessage } from 'react-intl';
-import Permalink from './permalink';
+
+//  Mastodon imports  //
+import emojify from '../../../mastodon/emoji';
+import { isRtl } from '../../../mastodon/rtl';
+import Permalink from '../../../mastodon/components/permalink';
 
 export default class StatusContent extends React.PureComponent {
 
diff --git a/app/javascript/glitch/components/status/gallery/index.js b/app/javascript/glitch/components/status/gallery/index.js
new file mode 100644
index 000000000..ae03dc08d
--- /dev/null
+++ b/app/javascript/glitch/components/status/gallery/index.js
@@ -0,0 +1,79 @@
+//  Package imports  //
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+
+//  Mastodon imports  //
+import IconButton from '../../../../mastodon/components/icon_button';
+
+//  Our imports  //
+import StatusGalleryItem from './item';
+
+const messages = defineMessages({
+  toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' },
+});
+
+@injectIntl
+export default class StatusGallery extends React.PureComponent {
+
+  static propTypes = {
+    sensitive: PropTypes.bool,
+    media: ImmutablePropTypes.list.isRequired,
+    letterbox: PropTypes.bool,
+    fullwidth: PropTypes.bool,
+    height: PropTypes.number.isRequired,
+    onOpenMedia: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+    autoPlayGif: PropTypes.bool.isRequired,
+  };
+
+  state = {
+    visible: !this.props.sensitive,
+  };
+
+  handleOpen = () => {
+    this.setState({ visible: !this.state.visible });
+  }
+
+  handleClick = (index) => {
+    this.props.onOpenMedia(this.props.media, index);
+  }
+
+  render () {
+    const { media, intl, sensitive, letterbox, fullwidth } = this.props;
+
+    let children;
+
+    if (!this.state.visible) {
+      let warning;
+
+      if (sensitive) {
+        warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />;
+      } else {
+        warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />;
+      }
+
+      children = (
+        <div role='button' tabIndex='0' className='media-spoiler' onClick={this.handleOpen}>
+          <span className='media-spoiler__warning'>{warning}</span>
+          <span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span>
+        </div>
+      );
+    } else {
+      const size = media.take(4).size;
+      children = media.take(4).map((attachment, i) => <StatusGalleryItem key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} autoPlayGif={this.props.autoPlayGif} index={i} size={size} letterbox={letterbox} />);
+    }
+
+    return (
+      <div className={`media-gallery ${fullwidth ? 'full-width' : ''}`} style={{ height: `${this.props.height}px` }}>
+        <div className={`spoiler-button ${this.state.visible ? 'spoiler-button--visible' : ''}`}>
+          <IconButton title={intl.formatMessage(messages.toggle_visible)} icon={this.state.visible ? 'eye' : 'eye-slash'} overlay onClick={this.handleOpen} />
+        </div>
+
+        {children}
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/glitch/components/status/gallery/item.js
index a71c94ef2..d646825a3 100644
--- a/app/javascript/mastodon/components/media_gallery.js
+++ b/app/javascript/glitch/components/status/gallery/item.js
@@ -1,15 +1,12 @@
+//  Package imports  //
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import IconButton from './icon_button';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { isIOS } from '../is_mobile';
 
-const messages = defineMessages({
-  toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' },
-});
+//  Mastodon imports  //
+import { isIOS } from '../../../../mastodon/is_mobile';
 
-class Item extends React.PureComponent {
+export default class StatusGalleryItem extends React.PureComponent {
 
   static propTypes = {
     attachment: ImmutablePropTypes.map.isRequired,
@@ -133,67 +130,3 @@ class Item extends React.PureComponent {
   }
 
 }
-
-@injectIntl
-export default class MediaGallery extends React.PureComponent {
-
-  static propTypes = {
-    sensitive: PropTypes.bool,
-    media: ImmutablePropTypes.list.isRequired,
-    letterbox: PropTypes.bool,
-    fullwidth: PropTypes.bool,
-    height: PropTypes.number.isRequired,
-    onOpenMedia: PropTypes.func.isRequired,
-    intl: PropTypes.object.isRequired,
-    autoPlayGif: PropTypes.bool.isRequired,
-  };
-
-  state = {
-    visible: !this.props.sensitive,
-  };
-
-  handleOpen = () => {
-    this.setState({ visible: !this.state.visible });
-  }
-
-  handleClick = (index) => {
-    this.props.onOpenMedia(this.props.media, index);
-  }
-
-  render () {
-    const { media, intl, sensitive, letterbox, fullwidth } = this.props;
-
-    let children;
-
-    if (!this.state.visible) {
-      let warning;
-
-      if (sensitive) {
-        warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />;
-      } else {
-        warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />;
-      }
-
-      children = (
-        <div role='button' tabIndex='0' className='media-spoiler' onClick={this.handleOpen}>
-          <span className='media-spoiler__warning'>{warning}</span>
-          <span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span>
-        </div>
-      );
-    } else {
-      const size = media.take(4).size;
-      children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} autoPlayGif={this.props.autoPlayGif} index={i} size={size} letterbox={letterbox} />);
-    }
-
-    return (
-      <div className={`media-gallery ${fullwidth ? 'full-width' : ''}`} style={{ height: `${this.props.height}px` }}>
-        <div className={`spoiler-button ${this.state.visible ? 'spoiler-button--visible' : ''}`}>
-          <IconButton title={intl.formatMessage(messages.toggle_visible)} icon={this.state.visible ? 'eye' : 'eye-slash'} overlay onClick={this.handleOpen} />
-        </div>
-
-        {children}
-      </div>
-    );
-  }
-
-}
diff --git a/app/javascript/mastodon/components/status_header.js b/app/javascript/glitch/components/status/header.js
index ce7f942b1..78aef1ed5 100644
--- a/app/javascript/mastodon/components/status_header.js
+++ b/app/javascript/glitch/components/status/header.js
@@ -18,19 +18,17 @@ Imports:
 
 */
 
-//  Our standard React imports:
+//  Package imports  //
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-
-//  We will need internationalization in this component:
 import { defineMessages, injectIntl } from 'react-intl';
 
-//  The various components used when constructing our header:
-import Avatar from './avatar';
-import AvatarOverlay from './avatar_overlay';
-import DisplayName from './display_name';
-import IconButton from './icon_button';
+//  Mastodon imports  //
+import Avatar from '../../../mastodon/components/avatar';
+import AvatarOverlay from '../../../mastodon/components/avatar_overlay';
+import DisplayName from '../../../mastodon/components/display_name';
+import IconButton from '../../../mastodon/components/icon_button';
 
                             /* * * * */
 
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/glitch/components/status/index.js
index e19f194b8..a11cc0b6e 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/glitch/components/status/index.js
@@ -31,27 +31,22 @@ Imports:
 
 */
 
-//  Our standard React imports:
+//  Package imports  //
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-
-//  `ImmutablePureComponent` gives us `updateOnProps` and
-//  `updateOnStates`:
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
-//  These are our various media types:
-import MediaGallery from './media_gallery';
-import VideoPlayer from './video_player';
-
-//  These are our core status components:
-import StatusPrepend from './status_prepend';
-import StatusHeader from './status_header';
-import StatusContent from './status_content';
-import StatusActionBar from './status_action_bar';
+//  Mastodon imports  //
+import scheduleIdleTask from '../../../mastodon/features/ui/util/schedule_idle_task';
 
-//  This is used to schedule tasks at the browser's convenience:
-import scheduleIdleTask from '../features/ui/util/schedule_idle_task';
+//  Our imports  //
+import StatusPrepend from './prepend';
+import StatusHeader from './header';
+import StatusContent from './content';
+import StatusActionBar from './action_bar';
+import StatusGallery from './gallery';
+import StatusVideoPlayer from './video_player';
 
                             /* * * * */
 
@@ -622,7 +617,7 @@ backgrounds for collapsed statuses are enabled.
         attachments.getIn([0, 'type']) === 'video'
       ) {
         media = (  //  Media type is 'video'
-          <VideoPlayer
+          <StatusVideoPlayer
             media={attachments.get(0)}
             sensitive={status.get('sensitive')}
             letterbox={settings.getIn(['media', 'letterbox'])}
@@ -634,7 +629,7 @@ backgrounds for collapsed statuses are enabled.
         mediaIcon = 'video-camera';
       } else {  //  Media type is 'image' or 'gifv'
         media = (
-          <MediaGallery
+          <StatusGallery
             media={attachments}
             sensitive={status.get('sensitive')}
             letterbox={settings.getIn(['media', 'letterbox'])}
diff --git a/app/javascript/mastodon/components/status_prepend.js b/app/javascript/glitch/components/status/prepend.js
index 34ccee358..ef9209e81 100644
--- a/app/javascript/mastodon/components/status_prepend.js
+++ b/app/javascript/glitch/components/status/prepend.js
@@ -18,16 +18,16 @@ Imports:
 
 */
 
-//  Our standard React imports:
+//  Package imports  //
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-
-//  This helps us process our text:
-import emojify from '../emoji';
 import escapeTextContentForBrowser from 'escape-html';
 import { FormattedMessage } from 'react-intl';
 
+//  Mastodon imports  //
+import emojify from '../../../mastodon/emoji';
+
                             /* * * * */
 
 /*
diff --git a/app/javascript/mastodon/components/video_player.js b/app/javascript/glitch/components/status/video_player.js
index 5e43ee7e6..6583107c8 100644
--- a/app/javascript/mastodon/components/video_player.js
+++ b/app/javascript/glitch/components/status/video_player.js
@@ -1,9 +1,12 @@
+//  Package imports  //
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import IconButton from './icon_button';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { isIOS } from '../is_mobile';
+
+//  Mastodon imports  //
+import IconButton from '../../../mastodon/components/icon_button';
+import { isIOS } from '../../../mastodon/is_mobile';
 
 const messages = defineMessages({
   toggle_sound: { id: 'video_player.toggle_sound', defaultMessage: 'Toggle sound' },
@@ -12,7 +15,7 @@ const messages = defineMessages({
 });
 
 @injectIntl
-export default class VideoPlayer extends React.PureComponent {
+export default class StatusVideoPlayer extends React.PureComponent {
 
   static propTypes = {
     media: ImmutablePropTypes.map.isRequired,
diff --git a/app/javascript/glitch/containers/compose/advanced_options.js b/app/javascript/glitch/containers/compose/advanced_options.js
new file mode 100644
index 000000000..f8b7354ff
--- /dev/null
+++ b/app/javascript/glitch/containers/compose/advanced_options.js
@@ -0,0 +1,22 @@
+//  Package imports  //
+import { connect } from 'react-redux';
+
+//  Mastodon imports  //
+import { changeComposeAdvancedOption } from '../../../mastodon/actions/compose';
+
+//  Our imports  //
+import ComposeAdvancedOptions from '../../components/compose/advanced_options';
+
+const mapStateToProps = state => ({
+  values: state.getIn(['compose', 'advanced_options']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+  onChange (option) {
+    dispatch(changeComposeAdvancedOption(option));
+  },
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(ComposeAdvancedOptions);
diff --git a/app/javascript/mastodon/features/notifications/containers/notification_container.js b/app/javascript/glitch/containers/notification/index.js
index 66baf98a1..783c838ae 100644
--- a/app/javascript/mastodon/features/notifications/containers/notification_container.js
+++ b/app/javascript/glitch/containers/notification/index.js
@@ -1,6 +1,11 @@
+//  Package imports  //
 import { connect } from 'react-redux';
-import { makeGetNotification } from '../../../selectors';
-import Notification from '../components/notification';
+
+//  Mastodon imports  //
+import { makeGetNotification } from '../../../mastodon/selectors';
+
+//  Our imports  //
+import Notification from '../../components/notification';
 
 const makeMapStateToProps = () => {
   const getNotification = makeGetNotification();
diff --git a/app/javascript/mastodon/features/ui/containers/settings_modal_container.js b/app/javascript/glitch/containers/settings/index.js
index 571f028ed..6034935eb 100644
--- a/app/javascript/mastodon/features/ui/containers/settings_modal_container.js
+++ b/app/javascript/glitch/containers/settings/index.js
@@ -1,7 +1,12 @@
+//  Package imports  //
 import { connect } from 'react-redux';
-import { changeLocalSetting } from '../../../actions/local_settings';
-import { closeModal } from '../../../actions/modal';
-import SettingsModal from '../components/settings_modal';
+
+//  Mastodon imports  //
+import { closeModal } from '../../../mastodon/actions/modal';
+
+//  Our imports  //
+import { changeLocalSetting } from '../../actions/local_settings';
+import Settings from '../../components/settings';
 
 const mapStateToProps = state => ({
   settings: state.get('local_settings'),
@@ -19,4 +24,4 @@ const mapDispatchToProps = dispatch => ({
   },
 });
 
-export default connect(mapStateToProps, mapDispatchToProps)(SettingsModal);
+export default connect(mapStateToProps, mapDispatchToProps)(Settings);
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/glitch/containers/status/index.js
index 4c0829fd0..baf898e97 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/glitch/containers/status/index.js
@@ -18,45 +18,41 @@ Imports:
 
 */
 
-//  Our standard React/Redux imports:
+//  Package imports  //
 import React from 'react';
 import { connect } from 'react-redux';
+import {
+  defineMessages,
+  injectIntl,
+  FormattedMessage,
+} from 'react-intl';
 
-//  Our `<Status>`:
-import Status from '../components/status';
-
-//  This selector helps us get our status from the store:
-import { makeGetStatus } from '../selectors';
-
-//  These are our various `<Status>`-related actions:
+//  Mastodon imports  //
+import { makeGetStatus } from '../../../mastodon/selectors';
 import {
   replyCompose,
   mentionCompose,
-} from '../actions/compose';
+} from '../../../mastodon/actions/compose';
 import {
   reblog,
   favourite,
   unreblog,
   unfavourite,
-} from '../actions/interactions';
+} from '../../../mastodon/actions/interactions';
 import {
   blockAccount,
   muteAccount,
-} from '../actions/accounts';
+} from '../../../mastodon/actions/accounts';
 import {
   muteStatus,
   unmuteStatus,
   deleteStatus,
-} from '../actions/statuses';
-import { initReport } from '../actions/reports';
-import { openModal } from '../actions/modal';
+} from '../../../mastodon/actions/statuses';
+import { initReport } from '../../../mastodon/actions/reports';
+import { openModal } from '../../../mastodon/actions/modal';
 
-//  We will need internationalization in this component:
-import {
-  defineMessages,
-  injectIntl,
-  FormattedMessage,
-} from 'react-intl';
+//  Our imports  //
+import Status from '../../components/status';
 
                             /* * * * */
 
diff --git a/app/javascript/mastodon/reducers/local_settings.js b/app/javascript/glitch/reducers/local_settings.js
index 0b5354797..db99f2c46 100644
--- a/app/javascript/mastodon/reducers/local_settings.js
+++ b/app/javascript/glitch/reducers/local_settings.js
@@ -1,7 +1,12 @@
-import { LOCAL_SETTING_CHANGE } from '../actions/local_settings';
-import { STORE_HYDRATE } from '../actions/store';
+//  Package imports  //
 import Immutable from 'immutable';
 
+//  Mastodon imports  //
+import { STORE_HYDRATE } from '../../mastodon/actions/store';
+
+//  Our imports  //
+import { LOCAL_SETTING_CHANGE } from '../actions/local_settings';
+
 const initialState = Immutable.fromJS({
   layout    : 'auto',
   stretch   : true,
diff --git a/app/javascript/mastodon/features/account/util/bio_metadata.js b/app/javascript/glitch/util/bio_metadata.js
index bdbb1750b..bdbb1750b 100644
--- a/app/javascript/mastodon/features/account/util/bio_metadata.js
+++ b/app/javascript/glitch/util/bio_metadata.js
diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js
index 5bc46e8ee..b5c6c2053 100644
--- a/app/javascript/mastodon/components/status_list.js
+++ b/app/javascript/mastodon/components/status_list.js
@@ -2,7 +2,7 @@ import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { ScrollContainer } from 'react-router-scroll';
 import PropTypes from 'prop-types';
-import StatusContainer from '../containers/status_container';
+import StatusContainer from '../../glitch/containers/status';
 import LoadMore from './load_more';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import IntersectionObserverWrapper from '../features/ui/util/intersection_observer_wrapper';
diff --git a/app/javascript/mastodon/features/account_timeline/components/header.js b/app/javascript/mastodon/features/account_timeline/components/header.js
index 167a2097e..09883d7d6 100644
--- a/app/javascript/mastodon/features/account_timeline/components/header.js
+++ b/app/javascript/mastodon/features/account_timeline/components/header.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import InnerHeader from '../../account/components/header';
+import InnerHeader from '../../../../glitch/components/account/header';
 import ActionBar from '../../account/components/action_bar';
 import MissingIndicator from '../../../components/missing_indicator';
 import ImmutablePureComponent from 'react-immutable-pure-component';
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 3559e4c82..313635443 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -11,7 +11,7 @@ import { defineMessages, injectIntl } from 'react-intl';
 import Collapsable from '../../../components/collapsable';
 import SpoilerButtonContainer from '../containers/spoiler_button_container';
 import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
-import AdvancedOptionsContainer from '../containers/advanced_options_container';
+import ComposeAdvancedOptionsContainer from '../../../../glitch/containers/compose/advanced_options';
 import SensitiveButtonContainer from '../containers/sensitive_button_container';
 import EmojiPickerDropdown from './emoji_picker_dropdown';
 import UploadFormContainer from '../containers/upload_form_container';
@@ -196,7 +196,7 @@ export default class ComposeForm extends ImmutablePureComponent {
           <div className='compose-form__buttons'>
             <UploadButtonContainer />
             <PrivacyDropdownContainer />
-            <AdvancedOptionsContainer />
+            <ComposeAdvancedOptionsContainer />
             <SensitiveButtonContainer />
             <SpoilerButtonContainer />
           </div>
diff --git a/app/javascript/mastodon/features/compose/components/search_results.js b/app/javascript/mastodon/features/compose/components/search_results.js
index ae4d1e86a..3d1c3ca5e 100644
--- a/app/javascript/mastodon/features/compose/components/search_results.js
+++ b/app/javascript/mastodon/features/compose/components/search_results.js
@@ -2,7 +2,7 @@ import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { FormattedMessage } from 'react-intl';
 import AccountContainer from '../../../containers/account_container';
-import StatusContainer from '../../../containers/status_container';
+import StatusContainer from '../../../../glitch/containers/status';
 import Link from 'react-router-dom/Link';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
diff --git a/app/javascript/mastodon/features/compose/containers/advanced_options_container.js b/app/javascript/mastodon/features/compose/containers/advanced_options_container.js
deleted file mode 100644
index 01a9c9a72..000000000
--- a/app/javascript/mastodon/features/compose/containers/advanced_options_container.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { connect } from 'react-redux';
-import AdvancedOptionsDropdown from '../components/advanced_options_dropdown';
-import { changeComposeAdvancedOption } from '../../../actions/compose';
-
-const mapStateToProps = state => ({
-  values: state.getIn(['compose', 'advanced_options']),
-});
-
-const mapDispatchToProps = dispatch => ({
-
-  onChange (option) {
-    dispatch(changeComposeAdvancedOption(option));
-  },
-
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(AdvancedOptionsDropdown);
\ No newline at end of file
diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js
index 537e425d9..3ec205f2c 100644
--- a/app/javascript/mastodon/features/compose/index.js
+++ b/app/javascript/mastodon/features/compose/index.js
@@ -5,7 +5,7 @@ import PropTypes from 'prop-types';
 import { connect } from 'react-redux';
 import { mountCompose, unmountCompose } from '../../actions/compose';
 import { openModal } from '../../actions/modal';
-import { changeLocalSetting } from '../../actions/local_settings';
+import { changeLocalSetting } from '../../../glitch/actions/local_settings';
 import Link from 'react-router-dom/Link';
 import { injectIntl, defineMessages } from 'react-intl';
 import SearchContainer from './containers/search_container';
diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js
index ed4b3ad98..d4e1555b2 100644
--- a/app/javascript/mastodon/features/notifications/index.js
+++ b/app/javascript/mastodon/features/notifications/index.js
@@ -6,7 +6,7 @@ import Column from '../../components/column';
 import ColumnHeader from '../../components/column_header';
 import { expandNotifications, scrollTopNotifications } from '../../actions/notifications';
 import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
-import NotificationContainer from './containers/notification_container';
+import NotificationContainer from '../../../glitch/containers/notification';
 import { ScrollContainer } from 'react-router-scroll';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index 277b79810..db0181f23 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -3,9 +3,9 @@ import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import Avatar from '../../../components/avatar';
 import DisplayName from '../../../components/display_name';
-import StatusContent from '../../../components/status_content';
-import MediaGallery from '../../../components/media_gallery';
-import VideoPlayer from '../../../components/video_player';
+import StatusContent from '../../../../glitch/components/status/content';
+import StatusGallery from '../../../../glitch/components/status/gallery';
+import StatusVideoPlayer from '../../../../glitch/components/status/video_player';
 import AttachmentList from '../../../components/attachment_list';
 import Link from 'react-router-dom/Link';
 import { FormattedDate, FormattedNumber } from 'react-intl';
@@ -48,7 +48,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         media = <AttachmentList media={status.get('media_attachments')} />;
       } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
         media = (
-          <VideoPlayer
+          <StatusVideoPlayer
             sensitive={status.get('sensitive')}
             media={status.getIn(['media_attachments', 0])}
             letterbox={settings.getIn(['media', 'letterbox'])}
@@ -60,7 +60,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         mediaIcon = 'video-camera';
       } else {
         media = (
-          <MediaGallery
+          <StatusGallery
             sensitive={status.get('sensitive')}
             media={status.get('media_attachments')}
             letterbox={settings.getIn(['media', 'letterbox'])}
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index 5ec26c2d5..b24beadd2 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -22,7 +22,7 @@ import { initReport } from '../../actions/reports';
 import { makeGetStatus } from '../../selectors';
 import { ScrollContainer } from 'react-router-scroll';
 import ColumnBackButton from '../../components/column_back_button';
-import StatusContainer from '../../containers/status_container';
+import StatusContainer from '../../../glitch/containers/status';
 import { openModal } from '../../actions/modal';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.js b/app/javascript/mastodon/features/ui/components/boost_modal.js
index 6c80a1084..a1b0cf4bd 100644
--- a/app/javascript/mastodon/features/ui/components/boost_modal.js
+++ b/app/javascript/mastodon/features/ui/components/boost_modal.js
@@ -3,7 +3,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import Button from '../../../components/button';
-import StatusContent from '../../../components/status_content';
+import StatusContent from '../../../../glitch/components/status/content';
 import Avatar from '../../../components/avatar';
 import RelativeTimestamp from '../../../components/relative_timestamp';
 import DisplayName from '../../../components/display_name';
diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js
index 3e3894441..3777c1bf6 100644
--- a/app/javascript/mastodon/features/ui/components/modal_root.js
+++ b/app/javascript/mastodon/features/ui/components/modal_root.js
@@ -6,7 +6,7 @@ import VideoModal from './video_modal';
 import BoostModal from './boost_modal';
 import ConfirmationModal from './confirmation_modal';
 import ReportModal from './report_modal';
-import SettingsModal from '../containers/settings_modal_container';
+import SettingsContainer from '../../../../glitch/containers/settings';
 import TransitionMotion from 'react-motion/lib/TransitionMotion';
 import spring from 'react-motion/lib/spring';
 
@@ -17,7 +17,7 @@ const MODAL_COMPONENTS = {
   'BOOST': BoostModal,
   'CONFIRM': ConfirmationModal,
   'REPORT': ReportModal,
-  'SETTINGS': SettingsModal,
+  'SETTINGS': SettingsContainer,
 };
 
 export default class ModalRoot extends React.PureComponent {
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index 0749a4e4a..a3f5cb58e 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -14,7 +14,7 @@ import relationships from './relationships';
 import search from './search';
 import notifications from './notifications';
 import settings from './settings';
-import local_settings from './local_settings';
+import local_settings from '../../glitch/reducers/local_settings';
 import status_lists from './status_lists';
 import cards from './cards';
 import reports from './reports';
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index ae903cdd3..8a3ae0b3c 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -4,7 +4,7 @@ import { delegate } from 'rails-ujs';
 import emojify from '../mastodon/emoji';
 import { getLocale } from '../mastodon/locales';
 import loadPolyfills from '../mastodon/load_polyfills';
-import { processBio } from '../mastodon/features/account/util/bio_metadata';
+import { processBio } from '../glitch/util/bio_metadata';
 
 require.context('../images/', true);