diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..f7048a79bc090f18d557bae104e9cc4f02001d1c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,23 @@ +image: alpine:latest + +before_script: + - apk add yarn + - yarn global add node-gyp + - yarn install + +cache: + paths: + - node_modules + +test: + script: + - yarn run test:jest + +build: + script: + - yarn run build + artifacts: + paths: + - public/packs + - public/assets + expire_in: 1 week diff --git a/README.md b/README.md index 470e379dc0aae2875a0238c99286b3cb5275800b..4a2ca60ae8874a6caf006401265e3912f1112457 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,61 @@ -# Mastodon Glitch Edition # +# Mastodon Frontend, Glitch-soc + Pleroma Edition -> Now with automated deploys! +Here is a distribution of the glitch-soc frontend for pleroma. Everything from the upstream repository is kept and rebased on for easy updates, this does screws up on Merge Requests so they’ll be treated as a patchset if done here. -[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci] +# Deployement -[circleci]: https://circleci.com/gh/glitch-soc/mastodon +This is what you want to do to update the mastofe bundled with pleroma. -So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it? +- Run ``build.sh`` at the root of this repo, you can set the ``TARGET`` environment variable if pleroma isn’t at ``../pleroma`` (default value of ``TARGET``) +- Go to pleroma repo: + - ``git add priv/static/sw.js priv/static/packs`` + - ``git commit -m "update mastofe"`` -- You can view documentation for this project at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/). -- And contributing guidelines are available [here](CONTRIBUTING.md) and [here](https://glitch-soc.github.io/docs/contributing/). +# Development +## Branches +- `pleroma` branch which merges from `rebase/glitch-soc` once it is stable +- `master`: Same branch as upstream repository +- `rebase/glitch-soc`: branch which rebases from upstream, used for testing + +For developement/Merge Requests I would suggest to use `master` when you are introducing new modifications that cannot be in the upstream, and when you are changing current modifications prefer `rebase/glitch-soc`. + +Never use `pleroma` as a base for Merge Requests, it is not meant to be modified directly. + +## Tools +- Node.js +- yarn (preferred) or npm +- HTTP proxy (such as nginx) + +## nginx setup +I'll assume that you have already fired up pleroma using the installation guide. To work on the frontend while still having the backend up, use this nginx config. + +``` +server { + listen 80; + server_name pleroma.testing; + + location /packs { + add_header 'Access-Control-Allow-Origin' '*'; + proxy_http_version 1.1; + proxy_set_header Host $http_host; + + proxy_pass http://localhost:3035; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*'; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + + proxy_pass http://localhost:4000; + } +} +``` + +Change the `server_name` if you like. I personally like to create a new entry in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you. + +## Running +- Getting the node dependencies is done with `yarn install -D` (or `npm install` if you don’t have yarn) +- Launching the frontend is done with `npm run dev`. It should be reachable once it finnishes compiling. diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index ac09adcebd070a5b1151b43a6b3360d923c3e196..3a85d90adaf0aab4290307047c82161cb6b68be9 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -5,7 +5,6 @@ import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_sea import { useEmoji } from './emojis'; import { tagHistory } from 'flavours/glitch/util/settings'; import { recoverHashtags } from 'flavours/glitch/util/hashtag'; -import resizeImage from 'flavours/glitch/util/resize_image'; import { importFetchedAccounts } from './importer'; import { updateTimeline } from './timelines'; import { showAlertForError } from './alerts'; @@ -46,6 +45,7 @@ export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; +export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE'; export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT'; @@ -74,12 +74,6 @@ export function changeCompose(text) { }; }; -export function cycleElefriendCompose() { - return { - type: COMPOSE_CYCLE_ELEFRIEND, - }; -}; - export function replyCompose(status, router) { return (dispatch, getState) => { dispatch({ @@ -147,6 +141,7 @@ export function submitCompose(routerHistory) { } api(getState).post('/api/v1/statuses', { status, + content_type: getState().getIn(['compose', 'content_type']), in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null), media_ids: media.map(item => item.get('id')), sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0), @@ -242,21 +237,42 @@ export function uploadCompose(files) { dispatch(uploadComposeRequest()); - for (const [i, f] of Array.from(files).entries()) { - if (media.size + i > 3) break; - - resizeImage(f).then(file => { - const data = new FormData(); - data.append('file', file); - - return api(getState).post('/api/v1/media', data, { - onUploadProgress: function({ loaded }){ - progress[i] = loaded; - dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); - }, - }).then(({ data }) => dispatch(uploadComposeSuccess(data))); - }).catch(error => dispatch(uploadComposeFail(error))); + for (const [i, file] of Array.from(files).entries()) { + // Looks useless or should reuse uploadLimit + // if (media.size + i > 3) break; + + const data = new FormData(); + data.append('file', file); + + api(getState).post('/api/v1/media', data, { + onUploadProgress: function({ loaded }){ + progress[i] = loaded; + dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); + }, + }).then(function (response) { + dispatch(uploadComposeSuccess(response.data)); + }).catch(function (error) { + dispatch(uploadComposeFail(error)); + }); }; + + /* + * Previous pre-multiple upload code + * + * a372436a8... Revert: Resize images before upload in web UI to reduce bandwidth + * + * let data = new FormData(); + * data.append('file', files[0]); + * api(getState).post('/api/v1/media', data, { + * onUploadProgress: function (e) { + * dispatch(uploadComposeProgress(e.loaded, e.total)); + * }, + * }).then(function (response) { + * dispatch(uploadComposeSuccess(response.data)); + * }).catch(function (error) { + * dispatch(uploadComposeFail(error)); + * }); + */ }; }; @@ -514,6 +530,13 @@ export function changeComposeVisibility(value) { }; }; +export function changeComposeContentType(value) { + return { + type: COMPOSE_CONTENT_TYPE_CHANGE, + value, + }; +}; + export function insertEmojiCompose(position, emoji) { return { type: COMPOSE_EMOJI_INSERT, diff --git a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js index 8fdb239f7218e00b353388db2996d7921d55846a..45ca25cde5d479dbe2cefb94f57cd2df995945c1 100644 --- a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js +++ b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js @@ -18,7 +18,10 @@ const urlBase64ToUint8Array = (base64String) => { return outputArray; }; -const getApplicationServerKey = () => document.querySelector('[name="applicationServerKey"]').getAttribute('content'); +const getApplicationServerKey = () => { + const k = document.querySelector('[name="applicationServerKey"]'); + return k === null ? '' : k.getAttribute('content'); +}; const getRegistration = () => navigator.serviceWorker.ready; diff --git a/app/javascript/flavours/glitch/components/error_boundary.js b/app/javascript/flavours/glitch/components/error_boundary.js index 142a0c21a178976957f7be53861ed97e3d6ff85a..d84bd857aabc46bfabc9f93b145f34cbbf031e2c 100644 --- a/app/javascript/flavours/glitch/components/error_boundary.js +++ b/app/javascript/flavours/glitch/components/error_boundary.js @@ -55,7 +55,7 @@ export default class ErrorBoundary extends React.PureComponent { }} + values={{ issuetracker: }} /> { debugInfo !== '' && (
@@ -85,6 +85,13 @@ export default class ErrorBoundary extends React.PureComponent { /> )} +
  • + }} + /> +
  • diff --git a/app/javascript/flavours/glitch/components/hashtag.js b/app/javascript/flavours/glitch/components/hashtag.js index d75edd9947d264cb2edef49b4a5168bb4d963fda..79fada42d7e66af99d934485639604bbaeb459f8 100644 --- a/app/javascript/flavours/glitch/components/hashtag.js +++ b/app/javascript/flavours/glitch/components/hashtag.js @@ -20,7 +20,7 @@ const Hashtag = ({ hashtag }) => (
    - day.get('uses')).toArray()}> + day.get('uses')).toArray()}>
    diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js index 6be2b4700a9483e481d156b80ac816831533e5ac..53f862f80e0ee94e0b556059f9911e541f89ea29 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -176,6 +176,21 @@ class Item extends React.PureComponent { /> ); + } else if (attachment.get('type') === 'audio') { + thumbnail = ( +
    +

    sound
    only

    +

    {attachment.get('description')}

    +
    + ); } else if (attachment.get('type') === 'gifv') { const autoPlay = !isIOS() && autoPlayGif; diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index e0cc652d28ae28e44c23d8e56089660720cd4359..698bfd53ba846bd89e52e94afe039790656a3c87 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -5,7 +5,7 @@ import IconButton from './icon_button'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me, isStaff } from 'flavours/glitch/util/initial_state'; +import { me, isStaff, deleteOthersNotice } from 'flavours/glitch/util/initial_state'; import RelativeTimestamp from './relative_timestamp'; import { accountAdminLink, statusAdminLink } from 'flavours/glitch/util/backend_links'; @@ -218,7 +218,6 @@ export default class StatusActionBar extends ImmutablePureComponent { } menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); - menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); @@ -242,6 +241,9 @@ export default class StatusActionBar extends ImmutablePureComponent { }); } } + if ( deleteOthersNotice ) { + menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); + } } if (status.get('in_reply_to_id', null) === null) { diff --git a/app/javascript/flavours/glitch/features/composer/index.js b/app/javascript/flavours/glitch/features/composer/index.js index 9d2e0b3dac45fc4ba95e7c93f0df0943677f029c..f915caf1d8f428600bd547cd0427bda660a6d586 100644 --- a/app/javascript/flavours/glitch/features/composer/index.js +++ b/app/javascript/flavours/glitch/features/composer/index.js @@ -15,6 +15,7 @@ import { changeComposeSpoilerText, changeComposeSpoilerness, changeComposeVisibility, + changeComposeContentType, changeUploadCompose, clearComposeSuggestions, fetchComposeSuggestions, @@ -46,7 +47,6 @@ import ComposerHashtagWarning from './hashtag_warning'; import ComposerDirectWarning from './direct_warning'; // Utils. -import { countableText } from 'flavours/glitch/util/counter'; import { me } from 'flavours/glitch/util/initial_state'; import { isMobile } from 'flavours/glitch/util/is_mobile'; import { assignHandlers } from 'flavours/glitch/util/react_helpers'; @@ -90,6 +90,7 @@ function mapStateToProps (state) { media: state.getIn(['compose', 'media_attachments']), preselectDate: state.getIn(['compose', 'preselectDate']), privacy: state.getIn(['compose', 'privacy']), + contentType: state.getIn(['compose', 'content_type']), progress: state.getIn(['compose', 'progress']), inReplyTo: inReplyTo ? state.getIn(['statuses', inReplyTo]) : null, replyAccount: inReplyTo ? state.getIn(['statuses', inReplyTo, 'account']) : null, @@ -119,6 +120,9 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onChangeAdvancedOption(option, value) { dispatch(changeComposeAdvancedOption(option, value)); }, + onChangeContentType(value) { + dispatch(changeComposeContentType(value)); + }, onChangeDescription(id, description) { dispatch(changeUploadCompose(id, { description })); }, @@ -400,6 +404,7 @@ class Composer extends React.Component { advancedOptions, amUnlocked, anyMedia, + contentType, intl, isSubmitting, isChangingUpload, @@ -409,6 +414,7 @@ class Composer extends React.Component { poll, onCancelReply, onChangeAdvancedOption, + onChangeContentType, onChangeDescription, onChangeSensitivity, onChangeSpoilerness, @@ -497,6 +503,7 @@ class Composer extends React.Component { item.get('type') === 'video' @@ -506,6 +513,7 @@ class Composer extends React.Component { hasPoll={!!poll} intl={intl} onChangeAdvancedOption={onChangeAdvancedOption} + onChangeContentType={onChangeContentType} onChangeSensitivity={onChangeSensitivity} onChangeVisibility={onChangeVisibility} onTogglePoll={onTogglePoll} @@ -520,7 +528,7 @@ class Composer extends React.Component { spoiler={spoilersAlwaysOn ? (spoilerText && spoilerText.length > 0) : spoiler} /> , + }, + html: { + icon: 'code', + name: 'text/html', + text: , + }, + markdown: { + icon: 'arrow-circle-down', + name: 'text/markdown', + text: , + }, + }; + // The result. return (
    @@ -313,6 +349,20 @@ export default class ComposerOptions extends React.PureComponent { title={intl.formatMessage(messages.change_privacy)} value={privacy} /> + {onToggleSpoiler && ( , - name: 'do_not_federate', - on: advancedOptions.get('do_not_federate'), - text: , - }, { meta: , name: 'threaded_mode', @@ -355,6 +399,7 @@ export default class ComposerOptions extends React.PureComponent { ComposerOptions.propTypes = { acceptContentTypes: PropTypes.string, advancedOptions: ImmutablePropTypes.map, + contentType: PropTypes.string, disabled: PropTypes.bool, allowMedia: PropTypes.bool, hasMedia: PropTypes.bool, @@ -365,6 +410,7 @@ ComposerOptions.propTypes = { onChangeSensitivity: PropTypes.func, onChangeVisibility: PropTypes.func, onTogglePoll: PropTypes.func, + onChangeContentType: PropTypes.func, onDoodleOpen: PropTypes.func, onModalClose: PropTypes.func, onModalOpen: PropTypes.func, diff --git a/app/javascript/flavours/glitch/features/drawer/index.js b/app/javascript/flavours/glitch/features/drawer/index.js index c8121b8e559fba0132b1524e0225eceba21d59d8..c1a88187df93c206be11a1e77adbeea3981a3379 100644 --- a/app/javascript/flavours/glitch/features/drawer/index.js +++ b/app/javascript/flavours/glitch/features/drawer/index.js @@ -13,7 +13,6 @@ import { showSearch, submitSearch, } from 'flavours/glitch/actions/search'; -import { cycleElefriendCompose } from 'flavours/glitch/actions/compose'; // Components. import Composer from 'flavours/glitch/features/composer'; @@ -35,7 +34,6 @@ const messages = defineMessages({ const mapStateToProps = state => ({ account: state.getIn(['accounts', me]), columns: state.getIn(['settings', 'columns']), - elefriend: state.getIn(['compose', 'elefriend']), results: state.getIn(['search', 'results']), searchHidden: state.getIn(['search', 'hidden']), searchValue: state.getIn(['search', 'value']), @@ -52,9 +50,6 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onClear () { dispatch(clearSearch()); }, - onClickElefriend () { - dispatch(cycleElefriendCompose()); - }, onShow () { dispatch(showSearch()); }, @@ -81,12 +76,10 @@ class Drawer extends React.Component { const { account, columns, - elefriend, intl, multiColumn, onChange, onClear, - onClickElefriend, onOpenSettings, onShow, onSubmit, @@ -98,7 +91,7 @@ class Drawer extends React.Component { unreadNotifications, showNotificationsBadge, } = this.props; - const computedClass = classNames('drawer', `mbstobon-${elefriend}`); + const computedClass = classNames('drawer', 'mbstobon'); // The result. return ( @@ -125,9 +118,9 @@ class Drawer extends React.Component { {!isSearchPage &&
    - {multiColumn && ( + {multiColumn && mascot && (
    - {mascot ? :
    )}
    } @@ -154,7 +147,6 @@ Drawer.propTypes = { account: ImmutablePropTypes.map, columns: ImmutablePropTypes.list, results: ImmutablePropTypes.map, - elefriend: PropTypes.number, searchHidden: PropTypes.bool, searchValue: PropTypes.string, submitted: PropTypes.bool, @@ -164,7 +156,6 @@ Drawer.propTypes = { // Dispatch props. onChange: PropTypes.func, onClear: PropTypes.func, - onClickElefriend: PropTypes.func, onShow: PropTypes.func, onSubmit: PropTypes.func, onOpenSettings: PropTypes.func, diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js index 7b645c9d0901a5f1b73962afe87439d270f8f40e..93ab5aa4143312e156fa38deeccf6c3a32b186c0 100644 --- a/app/javascript/flavours/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -14,6 +14,7 @@ import { List as ImmutableList } from 'immutable'; import { createSelector } from 'reselect'; import { fetchLists } from 'flavours/glitch/actions/lists'; import { preferencesLink, profileLink, signOutLink } from 'flavours/glitch/util/backend_links'; +import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma'; const messages = defineMessages({ heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, @@ -52,6 +53,8 @@ const makeMapStateToProps = () => { columns: state.getIn(['settings', 'columns']), unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size, unreadNotifications: state.getIn(['notifications', 'unread']), + customPanelEnabled: state.getIn(['custom_panel', 'enabled']), + customPanel: state.getIn(['custom_panel', 'panel']), }); return mapStateToProps; @@ -61,6 +64,8 @@ const mapDispatchToProps = dispatch => ({ fetchFollowRequests: () => dispatch(fetchFollowRequests()), fetchLists: () => dispatch(fetchLists()), openSettings: () => dispatch(openModal('SETTINGS', {})), + fetchPanel: () => dispatch(fetchPanel()), + fetchPleromaConfig: () => dispatch(fetchPleromaConfig()), }); const badgeDisplay = (number, limit) => { @@ -88,6 +93,10 @@ export default class GettingStarted extends ImmutablePureComponent { lists: ImmutablePropTypes.list, fetchLists: PropTypes.func.isRequired, openSettings: PropTypes.func.isRequired, + fetchPanel: PropTypes.func.isRequired, + fetchPleromaConfig: PropTypes.func.isRequired, + customPanelEnabled: PropTypes.bool, + customPanel: PropTypes.string.isRequired, }; componentWillMount () { @@ -95,15 +104,18 @@ export default class GettingStarted extends ImmutablePureComponent { } componentDidMount () { - const { myAccount, fetchFollowRequests } = this.props; + const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props; if (myAccount.get('locked')) { fetchFollowRequests(); } + + fetchPleromaConfig(); + fetchPanel(); } render () { - const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings } = this.props; + const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings, customPanelEnabled, customPanel } = this.props; const navItems = []; let listItems = []; @@ -149,39 +161,36 @@ export default class GettingStarted extends ImmutablePureComponent {
    , ]); + const instance_panel = (customPanelEnabled ?
    : null); + return ( -
    -
    - - {navItems} - - {listItems} - - { preferencesLink !== undefined && } - - -
    - -
    -
      - {invitesEnabled &&
    • ·
    • } -
    • ·
    • -
    • ·
    • -
    • ·
    • -
    • -
    - -

    - glitch-soc/mastodon (v{version}), - Mastodon: Mastodon }} - /> -

    -
    +
    + + {navItems} + + {listItems} + + { preferencesLink !== undefined && } + + +
    + + {instance_panel} + +
    +

    + Mastofe, + glitchsoc: glitch-soc, + mastodon: Mastodon, + pleroma: Pleroma + }} + /> +

    ); diff --git a/app/javascript/flavours/glitch/features/getting_started_misc/index.js b/app/javascript/flavours/glitch/features/getting_started_misc/index.js index ee4452472f34bf018ae422bbfd614c1f5e8fc5a3..d5db4c9ea8baf5beee892b2c8ceea39eecd276d3 100644 --- a/app/javascript/flavours/glitch/features/getting_started_misc/index.js +++ b/app/javascript/flavours/glitch/features/getting_started_misc/index.js @@ -8,6 +8,7 @@ import ColumnLink from 'flavours/glitch/features/ui/components/column_link'; import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading'; import { openModal } from 'flavours/glitch/actions/modal'; import { connect } from 'react-redux'; +import { switchFlavour } from 'mastodon/actions/pleroma'; const messages = defineMessages({ heading: { id: 'column.heading', defaultMessage: 'Misc' }, @@ -22,6 +23,7 @@ const messages = defineMessages({ info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' }, keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' }, featured_users: { id: 'navigation_bar.featured_users', defaultMessage: 'Featured users' }, + switch_to_vanilla: { id: 'navigation_bar.switch_to_vanilla', defaultMessage: 'Switch to Vanilla Flavour' }, }); @connect() @@ -31,6 +33,7 @@ export default class gettingStartedMisc extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, + switchFlavour: PropTypes.func.isRequired, }; openOnboardingModal = (e) => { @@ -41,6 +44,10 @@ export default class gettingStartedMisc extends ImmutablePureComponent { this.props.dispatch(openModal('PINNED_ACCOUNTS_EDITOR')); } + switch_flavour_vanilla = (e) => { + this.props.dispatch(switchFlavour('vanilla')); + } + render () { const { intl } = this.props; @@ -61,6 +68,7 @@ export default class gettingStartedMisc extends ImmutablePureComponent { +
    ); diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js index 8291319c395c04bd32e5a9c2b9ac274dfe229281..97e73acfa58dde0d2f89cfb6258598954d1190a2 100644 --- a/app/javascript/flavours/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -162,7 +162,6 @@ export default class ActionBar extends React.PureComponent { menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); menu.push(null); menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); - menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); diff --git a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg b/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg deleted file mode 100644 index 580c15a138838e806b9f72c1f3bb39d4a2e7d384..0000000000000000000000000000000000000000 --- a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/javascript/flavours/glitch/images/elephant_ui_working.svg b/app/javascript/flavours/glitch/images/elephant_ui_working.svg deleted file mode 100644 index 8ba475db0a07c4b1a9f0839d0e78ed5bdbceeb74..0000000000000000000000000000000000000000 --- a/app/javascript/flavours/glitch/images/elephant_ui_working.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-0.png b/app/javascript/flavours/glitch/images/mbstobon-ui-0.png deleted file mode 100644 index 25e1707c9932ea9091d2d794f3ca78b7f6b45978..0000000000000000000000000000000000000000 Binary files a/app/javascript/flavours/glitch/images/mbstobon-ui-0.png and /dev/null differ diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-1.png b/app/javascript/flavours/glitch/images/mbstobon-ui-1.png deleted file mode 100644 index 64cf3cbf322e9a636e9fcbefa1fbe0786e27172e..0000000000000000000000000000000000000000 Binary files a/app/javascript/flavours/glitch/images/mbstobon-ui-1.png and /dev/null differ diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-2.png b/app/javascript/flavours/glitch/images/mbstobon-ui-2.png deleted file mode 100644 index b767a9122a05a7154fb0c6d1cd3bf9dc81627e23..0000000000000000000000000000000000000000 Binary files a/app/javascript/flavours/glitch/images/mbstobon-ui-2.png and /dev/null differ diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-3.png b/app/javascript/flavours/glitch/images/mbstobon-ui-3.png deleted file mode 100644 index a1fb642a003b2e2b652b1e6022a84f08dc76105f..0000000000000000000000000000000000000000 Binary files a/app/javascript/flavours/glitch/images/mbstobon-ui-3.png and /dev/null differ diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index a79b0dd244010ba4f2f80ab25aa63e6eada9a305..cd4377d38565ed050bba4cca427de6dfcb38faac 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -25,6 +25,7 @@ import { COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, COMPOSE_VISIBILITY_CHANGE, + COMPOSE_CONTENT_TYPE_CHANGE, COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, COMPOSE_UPLOAD_CHANGE_SUCCESS, @@ -66,6 +67,7 @@ const initialState = ImmutableMap({ spoiler: false, spoiler_text: '', privacy: null, + content_type: 'text/plain', text: '', focusDate: null, caretPosition: null, @@ -230,7 +232,7 @@ const updateSuggestionTags = (state, token) => { return state.merge({ suggestions: state.get('tagHistory') - .filter(tag => tag.toLowerCase().startsWith(prefix.toLowerCase())) + .filter(tag => tag && tag.toLowerCase().startsWith(prefix.toLowerCase())) .slice(0, 4) .map(tag => '#' + tag), suggestion_token: token, @@ -308,6 +310,10 @@ export default function compose(state = initialState, action) { return state .set('privacy', action.value) .set('idempotencyKey', uuid()); + case COMPOSE_CONTENT_TYPE_CHANGE: + return state + .set('content_type', action.value) + .set('idempotencyKey', uuid()); case COMPOSE_CHANGE: return state .set('text', action.text) diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js index 76b38adb4a2fb9d380d28dad01bbadf02bf6ea64..56a1f2ee1f6b7e3c8c323400ed007f72116be28a 100644 --- a/app/javascript/flavours/glitch/reducers/index.js +++ b/app/javascript/flavours/glitch/reducers/index.js @@ -31,6 +31,7 @@ import filters from './filters'; import pinnedAccountsEditor from './pinned_accounts_editor'; import polls from './polls'; import identity_proofs from './identity_proofs'; +import custom_panel from './pleroma'; const reducers = { dropdown_menu, @@ -65,6 +66,7 @@ const reducers = { filters, pinnedAccountsEditor, polls, + custom_panel, }; export default combineReducers(reducers); diff --git a/app/javascript/flavours/glitch/reducers/pleroma.js b/app/javascript/flavours/glitch/reducers/pleroma.js new file mode 100644 index 0000000000000000000000000000000000000000..fb3871d7875cf2cf456c7966f8b5b9a34f623b17 --- /dev/null +++ b/app/javascript/flavours/glitch/reducers/pleroma.js @@ -0,0 +1,18 @@ +import { Map as ImmutableMap } from 'immutable'; +import { PANEL_FETCH_SUCCESS, PLEROMA_CONFIG_FETCH_SUCCESS } from 'mastodon/actions/pleroma'; + +const initialPanel = ImmutableMap({ + enabled: false, + panel: '' +}); + +export default function custom_panel(state = initialPanel, action) { + switch (action.type) { + case PANEL_FETCH_SUCCESS: + return state.set('panel', action.panel); break; + case PLEROMA_CONFIG_FETCH_SUCCESS: + return state.set('enabled', (action.config || {}).showInstanceSpecificPanel); + } + + return state; +}; diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss index d22783b94b7820e8868a0ccbcb7f02be55b6e877..603b18637993359c3921f17c441ae1e38bac920a 100644 --- a/app/javascript/flavours/glitch/styles/components/drawer.scss +++ b/app/javascript/flavours/glitch/styles/components/drawer.scss @@ -317,21 +317,3 @@ height: 100%; background: rgba($base-overlay-background, 0.5); } - -@for $i from 0 through 3 { - .mbstobon-#{$i} .drawer__inner__mastodon { - @if $i == 3 { - background: url('~flavours/glitch/images/wave-drawer.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%); - } @else { - background: url('~flavours/glitch/images/wave-drawer-glitched.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%); - } - - & > .mastodon { - background: url("~flavours/glitch/images/mbstobon-ui-#{$i}.png") no-repeat left bottom / contain; - - @if $i != 3 { - filter: contrast(50%) brightness(50%); - } - } - } -} diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index b098676b026f612d964ee09f92b60005c0fc3000..91eed1d55428857f3eafa7e8ec89ee795ea82e47 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -757,10 +757,15 @@ color: $dark-text-color; } + &__panel { + height: min-content; + } + + &__panel, &__footer { - flex: 0 0 auto; padding: 10px; padding-top: 20px; + flex: 0 1 auto; ul { margin-bottom: 10px; @@ -773,7 +778,6 @@ p { color: $dark-text-color; font-size: 13px; - margin-bottom: 20px; a { color: $dark-text-color; @@ -917,10 +921,6 @@ .missing-indicator { padding-top: 20px + 48px; - - .regeneration-indicator__figure { - background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg'); - } } .scrollable > div > :first-child .notification__dismiss-overlay > .wrappy { diff --git a/app/javascript/flavours/glitch/styles/components/media.scss b/app/javascript/flavours/glitch/styles/components/media.scss index e8011bde902a08678bd99db01ad3a059a5fcbd5b..1772e8412060c42424ef56874b01ce356842ebe3 100644 --- a/app/javascript/flavours/glitch/styles/components/media.scss +++ b/app/javascript/flavours/glitch/styles/components/media.scss @@ -74,6 +74,28 @@ } } +.media-gallery__audio { + height: 100%; + display: flex; + flex-direction: column; + + span { + text-align: center; + color: $darker-text-color; + display: flex; + height: 100%; + align-items: center; + + p { + width: 100%; + } + } + + audio { + width: 100%; + } +} + .media-gallery { box-sizing: border-box; margin-top: 8px; diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss index fece8593b6261c4a898591bcebd106119198015c..d10d2336c9f982ef8ab1e1be83e8b963ac849f73 100644 --- a/app/javascript/flavours/glitch/styles/components/modal.scss +++ b/app/javascript/flavours/glitch/styles/components/modal.scss @@ -255,7 +255,6 @@ } .onboarding-modal__page__wrapper-0 { - background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px; height: 100%; padding: 0; } diff --git a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss index 178df66525a112732f7eaad0e3b81a0746abb089..e550552d7dba636add4bdd5992b59ec636aefa49 100644 --- a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss +++ b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss @@ -18,7 +18,6 @@ } &__figure { - background: url('~flavours/glitch/images/elephant_ui_working.svg') no-repeat center 0; width: 100%; height: 160px; background-size: contain; @@ -30,10 +29,6 @@ &.missing-indicator { padding-top: 20px + 48px; - - .regeneration-indicator__figure { - background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg'); - } } &__label { diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index b73dd3d0980f4c4dddd8f90f40cb2cc806422f1d..6ace55bcb8021756cef0fd97ecc92112c9439485 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -8,10 +8,25 @@ font-size: 15px; line-height: 20px; word-wrap: break-word; - font-weight: 400; overflow: visible; padding-top: 5px; + em { + font-style: italic; + } + + strong { + font-weight: bold; + } + + ul { list-style: disc inside; } + ol { list-style: decimal inside; } + + blockquote { + margin: .2em 0 .2em 2em; + font-style: italic; + } + &:focus { outline: 0; } @@ -32,7 +47,7 @@ } a { - color: $secondary-text-color; + color: $pleroma-links; text-decoration: none; &:hover { @@ -591,6 +606,7 @@ } .muted { + .status__content, .status__content p, .status__content a { color: $dark-text-color; diff --git a/app/javascript/flavours/glitch/styles/index.scss b/app/javascript/flavours/glitch/styles/index.scss index 323b2e7fee4013abfe74a553fb27265baf5448fa..65cf35f459c3f7044044ee1e885bb0855fa93cf2 100644 --- a/app/javascript/flavours/glitch/styles/index.scss +++ b/app/javascript/flavours/glitch/styles/index.scss @@ -1,8 +1,5 @@ @import 'mixins'; @import 'variables'; -@import 'styles/fonts/roboto'; -@import 'styles/fonts/roboto-mono'; -@import 'styles/fonts/montserrat'; @import 'reset'; @import 'basics'; diff --git a/app/javascript/flavours/glitch/styles/modal.scss b/app/javascript/flavours/glitch/styles/modal.scss index 10de454c696b73a637e35f13833dfef2c53e1398..2a0d477ac9242a0ca1db73552ee322632c9c3b96 100644 --- a/app/javascript/flavours/glitch/styles/modal.scss +++ b/app/javascript/flavours/glitch/styles/modal.scss @@ -15,7 +15,6 @@ > * { flex: 1; max-height: 235px; - background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain; } } diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss index 1ed1a57787e4c05bf8f2e6ee20e1f13cc2f1ab3b..f817f08c5528a3d819d3974c56d6102e1846c3cd 100644 --- a/app/javascript/flavours/glitch/styles/variables.scss +++ b/app/javascript/flavours/glitch/styles/variables.scss @@ -8,11 +8,17 @@ $gold-star: #ca8f04; // Dark Goldenrod $red-bookmark: $warning-red; +// Pleroma-Dark colors +$pleroma-bg: #121a24; +$pleroma-fg: #182230; +$pleroma-text: #b9b9ba; +$pleroma-links: #d8a070; + // Values from the classic Mastodon UI -$classic-base-color: #282c37; // Midnight Express -$classic-primary-color: #9baec8; // Echo Blue -$classic-secondary-color: #d9e1e8; // Pattens Blue -$classic-highlight-color: #2b90d9; // Summer Sky +$classic-base-color: $pleroma-bg; +$classic-primary-color: #9baec8; +$classic-secondary-color: #d9e1e8; +$classic-highlight-color: #d8a070; // Variables for defaults in UI $base-shadow-color: $black !default; @@ -51,9 +57,9 @@ $media-modal-media-max-height: 80%; $no-gap-breakpoint: 415px; -$font-sans-serif: 'mastodon-font-sans-serif' !default; -$font-display: 'mastodon-font-display' !default; -$font-monospace: 'mastodon-font-monospace' !default; +$font-sans-serif: sans-serif !default; +$font-display: sans-serif !default; +$font-monospace: monospace !default; // Avatar border size (8% default, 100% for rounded avatars) $ui-avatar-border-size: 8%; diff --git a/app/javascript/flavours/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js index c59a24518c406c4ca54c698d5f67431f9d2eae8c..65aa61ba718c949ef430304db25167db4944254d 100644 --- a/app/javascript/flavours/glitch/util/api.js +++ b/app/javascript/flavours/glitch/util/api.js @@ -1,5 +1,4 @@ import axios from 'axios'; -import ready from './ready'; import LinkHeader from 'http-link-header'; export const getLinks = response => { @@ -12,21 +11,10 @@ export const getLinks = response => { return LinkHeader.parse(value); }; -let csrfHeader = {}; - -function setCSRFHeader() { - const csrfToken = document.querySelector('meta[name=csrf-token]'); - if (csrfToken) { - csrfHeader['X-CSRF-Token'] = csrfToken.content; - } -} - -ready(setCSRFHeader); - export default getState => axios.create({ - headers: Object.assign(csrfHeader, getState ? { + headers: getState ? { 'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}`, - } : {}), + } : {}, transformResponse: [function (data) { try { diff --git a/app/javascript/flavours/glitch/util/backend_links.js b/app/javascript/flavours/glitch/util/backend_links.js index 4fc03f9190bb80c518ea4c1fad08b582bb28d724..07b3951ea97508a4f16cefc518d88534814e4611 100644 --- a/app/javascript/flavours/glitch/util/backend_links.js +++ b/app/javascript/flavours/glitch/util/backend_links.js @@ -1,6 +1,6 @@ -export const preferencesLink = '/settings/preferences'; -export const profileLink = '/settings/profile'; +export const preferencesLink = '/settings'; +export const profileLink = '/user-settings'; export const signOutLink = '/auth/sign_out'; export const termsLink = '/terms'; -export const accountAdminLink = (id) => `/admin/accounts/${id}`; -export const statusAdminLink = (account_id, status_id) => `/admin/accounts/${account_id}/statuses/${status_id}`; +export const accountAdminLink = undefined; // = (id) => `/admin/accounts/${id}`; +export const statusAdminLink = undefined; // = (account_id, status_id) => `/admin/accounts/${account_id}/statuses/${status_id}`; diff --git a/app/javascript/flavours/glitch/util/counter.js b/app/javascript/flavours/glitch/util/counter.js deleted file mode 100644 index 700ba216354e1169d235a515737776bf60bbb8dc..0000000000000000000000000000000000000000 --- a/app/javascript/flavours/glitch/util/counter.js +++ /dev/null @@ -1,9 +0,0 @@ -import { urlRegex } from './url_regex'; - -const urlPlaceholder = 'xxxxxxxxxxxxxxxxxxxxxxx'; - -export function countableText(inputText) { - return inputText - .replace(urlRegex, urlPlaceholder) - .replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3'); -}; diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js index 62588eeaaf74f9449700cc1823c189a300143666..b84d62b024dce601e6d6bf51d8ef8e6030bd4fb4 100644 --- a/app/javascript/flavours/glitch/util/initial_state.js +++ b/app/javascript/flavours/glitch/util/initial_state.js @@ -10,6 +10,7 @@ const initialState = element && function () { }(); const getMeta = (prop) => initialState && initialState.meta && initialState.meta[prop]; +const getRight = (prop) => initialState && initialState.rights && initialState.rights[prop]; export const reduceMotion = getMeta('reduce_motion'); export const autoPlayGif = getMeta('auto_play_gif'); @@ -21,11 +22,13 @@ export const favouriteModal = getMeta('favourite_modal'); export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); -export const maxChars = (initialState && initialState.max_toot_chars) || 500; +export const maxChars = getMeta('max_toot_chars') || 500; export const pollLimits = (initialState && initialState.poll_limits); export const invitesEnabled = getMeta('invites_enabled'); export const version = getMeta('version'); export const mascot = getMeta('mascot'); export const isStaff = getMeta('is_staff'); +export const deleteOthersNotice = getRight('delete_others_notice'); + export default initialState; diff --git a/app/javascript/flavours/glitch/util/main.js b/app/javascript/flavours/glitch/util/main.js index b76826481acd96f195c9333c94775eac81f3956e..1fdb9ff2b94a5cf0605c27b961abe5fa7d9db8c7 100644 --- a/app/javascript/flavours/glitch/util/main.js +++ b/app/javascript/flavours/glitch/util/main.js @@ -12,7 +12,7 @@ function main() { if (window.history && history.replaceState) { const { pathname, search, hash } = window.location; const path = pathname + search + hash; - if (!(/^\/web[$/]/).test(path)) { + if (!(/^\/web($|\/)/).test(path)) { history.replaceState(null, document.title, `/web${path}`); } } diff --git a/app/javascript/flavours/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js index 306a068b7a073826fb77b58e20a6481c52ec1704..7cbc5166557c11698645246f447c6fd973aa6fc1 100644 --- a/app/javascript/flavours/glitch/util/stream.js +++ b/app/javascript/flavours/glitch/util/stream.js @@ -78,7 +78,10 @@ export default function getStream(streamingAPIBaseURL, accessToken, stream, { co const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`); ws.onopen = connected; - ws.onmessage = e => received(JSON.parse(e.data)); + ws.onmessage = e => { + if (e.data !== '') + received(JSON.parse(e.data)); + }; ws.onclose = disconnected; ws.onreconnect = reconnected; diff --git a/app/javascript/fonts/montserrat/Montserrat-Medium.ttf b/app/javascript/fonts/montserrat/Montserrat-Medium.ttf deleted file mode 100644 index 88d70b89c3f2740e9b9c80881616136b5f697091..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/montserrat/Montserrat-Medium.ttf and /dev/null differ diff --git a/app/javascript/fonts/montserrat/Montserrat-Regular.ttf b/app/javascript/fonts/montserrat/Montserrat-Regular.ttf deleted file mode 100644 index 29ca85d4a8bcfb20443653e7305c7e981b03eec0..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/montserrat/Montserrat-Regular.ttf and /dev/null differ diff --git a/app/javascript/fonts/montserrat/Montserrat-Regular.woff b/app/javascript/fonts/montserrat/Montserrat-Regular.woff deleted file mode 100644 index af3b5ec44a985f622e0c236b5ced7ad2fac3e855..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/montserrat/Montserrat-Regular.woff and /dev/null differ diff --git a/app/javascript/fonts/montserrat/Montserrat-Regular.woff2 b/app/javascript/fonts/montserrat/Montserrat-Regular.woff2 deleted file mode 100644 index 3d75434ddf9ae9f5f1eaec11a5fcc2140f283dd9..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/montserrat/Montserrat-Regular.woff2 and /dev/null differ diff --git a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.svg b/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.svg deleted file mode 100644 index 8b0e15729efc0c12574b5674b4ec0fd4da2ab7ed..0000000000000000000000000000000000000000 --- a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.svg +++ /dev/null @@ -1,1051 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.ttf b/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.ttf deleted file mode 100644 index 1ab663e403b4a0289e9230511f903e2ad17fa2c8..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.ttf and /dev/null differ diff --git a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.woff b/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.woff deleted file mode 100644 index 1ed8af5d090524558e4381c07b089a462d07d09e..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.woff and /dev/null differ diff --git a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.woff2 b/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.woff2 deleted file mode 100644 index 1142739f67eaa5162d40e13423367a46495ab8d0..0000000000000000000000000000000000000000 Binary files a/app/javascript/fonts/roboto-mono/robotomono-regular-webfont.woff2 and /dev/null differ diff --git a/app/javascript/fonts/roboto/roboto-bold-webfont.svg b/app/javascript/fonts/roboto/roboto-bold-webfont.svg deleted file mode 100644 index 8b591f99ece5af175432274293615521d3a17309..0000000000000000000000000000000000000000 --- a/app/javascript/fonts/roboto/roboto-bold-webfont.svg +++ /dev/null @@ -1,16273 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -