Merge pull request #229 from glitch-soc/glitch-theme
Advanced Next-Level Flavours And Skins For Mastodon™master
commit
81b0145759
@ -1,3 +0,0 @@ |
||||
[submodule "app/javascript/themes/mastodon-go"] |
||||
path = app/javascript/themes/mastodon-go |
||||
url = https://github.com/marrus-sh/mastodon-go |
@ -0,0 +1,12 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class Settings::BaseController < ApplicationController |
||||
layout 'admin' |
||||
|
||||
before_action :authenticate_user! |
||||
before_action :set_pack |
||||
|
||||
def set_pack |
||||
use_pack 'settings' |
||||
end |
||||
end |
@ -1,3 +1,5 @@ |
||||
// This file will be loaded on admin pages, regardless of theme.
|
||||
|
||||
import { delegate } from 'rails-ujs'; |
||||
|
||||
function handleDeleteStatus(event) { |
@ -0,0 +1,8 @@ |
||||
// This file will be loaded on all pages, regardless of theme.
|
||||
|
||||
import { start } from 'rails-ujs'; |
||||
import 'font-awesome/css/font-awesome.css'; |
||||
|
||||
require.context('../images/', true); |
||||
|
||||
start(); |
@ -0,0 +1,23 @@ |
||||
// This file will be loaded on embed pages, regardless of theme.
|
||||
|
||||
window.addEventListener('message', e => { |
||||
const data = e.data || {}; |
||||
|
||||
if (!window.parent || data.type !== 'setHeight') { |
||||
return; |
||||
} |
||||
|
||||
function setEmbedHeight () { |
||||
window.parent.postMessage({ |
||||
type: 'setHeight', |
||||
id: data.id, |
||||
height: document.getElementsByTagName('html')[0].scrollHeight, |
||||
}, '*'); |
||||
}; |
||||
|
||||
if (['interactive', 'complete'].includes(document.readyState)) { |
||||
setEmbedHeight(); |
||||
} else { |
||||
document.addEventListener('DOMContentLoaded', setEmbedHeight); |
||||
} |
||||
}); |
@ -0,0 +1,25 @@ |
||||
// This file will be loaded on public pages, regardless of theme.
|
||||
|
||||
const { delegate } = require('rails-ujs'); |
||||
|
||||
delegate(document, '.webapp-btn', 'click', ({ target, button }) => { |
||||
if (button !== 0) { |
||||
return true; |
||||
} |
||||
window.location.href = target.href; |
||||
return false; |
||||
}); |
||||
|
||||
delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { |
||||
const contentEl = target.parentNode.parentNode.querySelector('.e-content'); |
||||
|
||||
if (contentEl.style.display === 'block') { |
||||
contentEl.style.display = 'none'; |
||||
target.parentNode.style.marginBottom = 0; |
||||
} else { |
||||
contentEl.style.display = 'block'; |
||||
target.parentNode.style.marginBottom = null; |
||||
} |
||||
|
||||
return false; |
||||
}); |
@ -0,0 +1,43 @@ |
||||
// This file will be loaded on settings pages, regardless of theme.
|
||||
|
||||
const { length } = require('stringz'); |
||||
const { delegate } = require('rails-ujs'); |
||||
|
||||
import { processBio } from 'flavours/glitch/util/bio_metadata'; |
||||
|
||||
delegate(document, '.account_display_name', 'input', ({ target }) => { |
||||
const nameCounter = document.querySelector('.name-counter'); |
||||
|
||||
if (nameCounter) { |
||||
nameCounter.textContent = 30 - length(target.value); |
||||
} |
||||
}); |
||||
|
||||
delegate(document, '.account_note', 'input', ({ target }) => { |
||||
const noteCounter = document.querySelector('.note-counter'); |
||||
|
||||
if (noteCounter) { |
||||
const noteWithoutMetadata = processBio(target.value).text; |
||||
noteCounter.textContent = 500 - length(noteWithoutMetadata); |
||||
} |
||||
}); |
||||
|
||||
delegate(document, '#account_avatar', 'change', ({ target }) => { |
||||
const avatar = document.querySelector('.card.compact .avatar img'); |
||||
const [file] = target.files || []; |
||||
const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; |
||||
|
||||
avatar.src = url; |
||||
}); |
||||
|
||||
delegate(document, '#account_header', 'change', ({ target }) => { |
||||
const header = document.querySelector('.card.compact'); |
||||
const [file] = target.files || []; |
||||
const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; |
||||
|
||||
header.style.backgroundImage = `url(${url})`; |
||||
}); |
||||
|
||||
delegate(document, '#user_setting_flavour, #user_setting_skin', 'change', ({ target }) => { |
||||
target.form.submit(); |
||||
}); |
@ -0,0 +1,16 @@ |
||||
# These packs will be loaded on every appropriate page, regardless of |
||||
# theme. |
||||
pack: |
||||
about: |
||||
admin: admin.js |
||||
auth: |
||||
common: |
||||
filename: common.js |
||||
stylesheet: true |
||||
embed: embed.js |
||||
error: |
||||
home: |
||||
modal: |
||||
public: public.js |
||||
settings: settings.js |
||||
share: |
@ -1,4 +1,4 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
|
||||
export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST'; |
||||
export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS'; |
@ -1,4 +1,4 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
import { fetchRelationships } from './accounts'; |
||||
|
||||
export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST'; |
@ -1,4 +1,4 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
|
||||
export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST'; |
||||
export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS'; |
@ -1,6 +1,6 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
import { throttle } from 'lodash'; |
||||
import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light'; |
||||
import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light'; |
||||
import { useEmoji } from './emojis'; |
||||
|
||||
import { |
@ -1,4 +1,4 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
|
||||
export const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST'; |
||||
export const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS'; |
@ -1,4 +1,4 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
|
||||
export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST'; |
||||
export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS'; |
@ -1,4 +1,4 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
|
||||
export const REBLOG_REQUEST = 'REBLOG_REQUEST'; |
||||
export const REBLOG_SUCCESS = 'REBLOG_SUCCESS'; |
@ -1,6 +1,6 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
import { fetchRelationships } from './accounts'; |
||||
import { openModal } from 'themes/glitch/actions/modal'; |
||||
import { openModal } from 'flavours/glitch/actions/modal'; |
||||
|
||||
export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST'; |
||||
export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS'; |
@ -1,4 +1,4 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
import { List as ImmutableList } from 'immutable'; |
||||
import IntlMessageFormat from 'intl-messageformat'; |
||||
import { fetchRelationships } from './accounts'; |
@ -1,10 +1,10 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
|
||||
export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST'; |
||||
export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS'; |
||||
export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL'; |
||||
|
||||
import { me } from 'themes/glitch/util/initial_state'; |
||||
import { me } from 'flavours/glitch/util/initial_state'; |
||||
|
||||
export function fetchPinnedStatuses() { |
||||
return (dispatch, getState) => { |
@ -1,4 +1,4 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
import { openModal, closeModal } from './modal'; |
||||
|
||||
export const REPORT_INIT = 'REPORT_INIT'; |
@ -1,4 +1,4 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
|
||||
export const SEARCH_CHANGE = 'SEARCH_CHANGE'; |
||||
export const SEARCH_CLEAR = 'SEARCH_CLEAR'; |
@ -1,4 +1,4 @@ |
||||
import api from 'themes/glitch/util/api'; |
||||
import api from 'flavours/glitch/util/api'; |
||||
|
||||
import { deleteFromTimelines } from './timelines'; |
||||
import { fetchStatusCard } from './cards'; |
@ -1,4 +1,4 @@ |
||||
import { connectStream } from 'themes/glitch/util/stream'; |
||||
import { connectStream } from 'flavours/glitch/util/stream'; |
||||
import { |
||||
updateTimeline, |
||||
deleteFromTimelines, |
@ -1,4 +1,4 @@ |
||||
import api, { getLinks } from 'themes/glitch/util/api'; |
||||
import api, { getLinks } from 'flavours/glitch/util/api'; |
||||
import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; |
||||
|
||||
export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; |
@ -1,6 +1,6 @@ |
||||
import React from 'react'; |
||||
import PropTypes from 'prop-types'; |
||||
import unicodeMapping from 'themes/glitch/util/emoji/emoji_unicode_mapping_light'; |
||||
import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light'; |
||||
|
||||
const assetHost = process.env.CDN_HOST || ''; |
||||
|
@ -1,9 +1,9 @@ |
||||
import React from 'react'; |
||||
import AutosuggestAccountContainer from 'themes/glitch/features/compose/containers/autosuggest_account_container'; |
||||
import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container'; |
||||
import AutosuggestEmoji from './autosuggest_emoji'; |
||||
import ImmutablePropTypes from 'react-immutable-proptypes'; |
||||
import PropTypes from 'prop-types'; |
||||
import { isRtl } from 'themes/glitch/util/rtl'; |
||||
import { isRtl } from 'flavours/glitch/util/rtl'; |
||||
import ImmutablePureComponent from 'react-immutable-pure-component'; |
||||
import Textarea from 'react-textarea-autosize'; |
||||
import classNames from 'classnames'; |
@ -1,5 +1,5 @@ |
||||
import React from 'react'; |
||||
import Motion from 'themes/glitch/util/optional_motion'; |
||||
import Motion from 'flavours/glitch/util/optional_motion'; |
||||
import spring from 'react-motion/lib/spring'; |
||||
import PropTypes from 'prop-types'; |
||||
|
@ -1,7 +1,7 @@ |
||||
import React from 'react'; |
||||
import PropTypes from 'prop-types'; |
||||
import detectPassiveEvents from 'detect-passive-events'; |
||||
import { scrollTop } from 'themes/glitch/util/scroll'; |
||||
import { scrollTop } from 'flavours/glitch/util/scroll'; |
||||
|
||||
export default class Column extends React.PureComponent { |
||||
|
@ -1,5 +1,5 @@ |
||||
import React from 'react'; |
||||
import Motion from 'themes/glitch/util/optional_motion'; |
||||
import Motion from 'flavours/glitch/util/optional_motion'; |
||||
import spring from 'react-motion/lib/spring'; |
||||
import PropTypes from 'prop-types'; |
||||
import classNames from 'classnames'; |
@ -1,7 +1,7 @@ |
||||
import React from 'react'; |
||||
import PropTypes from 'prop-types'; |
||||
import scheduleIdleTask from 'themes/glitch/util/schedule_idle_task'; |
||||
import getRectFromEntry from 'themes/glitch/util/get_rect_from_entry'; |
||||
import scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task'; |
||||
import getRectFromEntry from 'flavours/glitch/util/get_rect_from_entry'; |
||||
import { is } from 'immutable'; |
||||
|
||||
// Diff these props in the "rendered" state
|
@ -1,13 +1,13 @@ |
||||
import React, { PureComponent } from 'react'; |
||||
import { ScrollContainer } from 'react-router-scroll-4'; |
||||
import PropTypes from 'prop-types'; |
||||
import IntersectionObserverArticleContainer from 'themes/glitch/containers/intersection_observer_article_container'; |
||||
import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container'; |
||||
import LoadMore from './load_more'; |
||||
import IntersectionObserverWrapper from 'themes/glitch/util/intersection_observer_wrapper'; |
||||
import IntersectionObserverWrapper from 'flavours/glitch/util/intersection_observer_wrapper'; |
||||
import { throttle } from 'lodash'; |
||||
import { List as ImmutableList } from 'immutable'; |
||||
import classNames from 'classnames'; |
||||
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen'; |
||||
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; |
||||
|
||||
export default class ScrollableList extends PureComponent { |
||||
|
@ -1,14 +1,11 @@ |
||||
// THIS FILE EXISTS FOR UPSTREAM COMPATIBILITY & SHOULDN'T BE USED !!
|
||||
// SEE INSTEAD : glitch/components/status/action_bar
|
||||
|
||||
import React from 'react'; |
||||
import ImmutablePropTypes from 'react-immutable-proptypes'; |
||||
import PropTypes from 'prop-types'; |
||||
import IconButton from './icon_button'; |
||||
import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; |
||||
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; |
||||
import { defineMessages, injectIntl } from 'react-intl'; |
||||
import ImmutablePureComponent from 'react-immutable-pure-component'; |
||||
import { me } from 'themes/glitch/util/initial_state'; |
||||
import { me } from 'flavours/glitch/util/initial_state'; |
||||
import RelativeTimestamp from './relative_timestamp'; |
||||
|
||||
const messages = defineMessages({ |
@ -1,7 +1,7 @@ |
||||
import React from 'react'; |
||||
import ImmutablePropTypes from 'react-immutable-proptypes'; |
||||
import PropTypes from 'prop-types'; |
||||
import { isRtl } from 'themes/glitch/util/rtl'; |
||||
import { isRtl } from 'flavours/glitch/util/rtl'; |
||||
import { FormattedMessage } from 'react-intl'; |
||||
import Permalink from './permalink'; |
||||
import classnames from 'classnames'; |
@ -1,7 +1,7 @@ |
||||
import React from 'react'; |
||||
import ImmutablePropTypes from 'react-immutable-proptypes'; |
||||
import PropTypes from 'prop-types'; |
||||
import StatusContainer from 'themes/glitch/containers/status_container'; |
||||
import StatusContainer from 'flavours/glitch/containers/status_container'; |
||||
import ImmutablePureComponent from 'react-immutable-pure-component'; |
||||
import ScrollableList from './scrollable_list'; |
||||
|
@ -1,6 +1,6 @@ |
||||
import React from 'react'; |
||||
import PropTypes from 'prop-types'; |
||||
import Card from 'themes/glitch/features/status/components/card'; |
||||
import Card from 'flavours/glitch/features/status/components/card'; |
||||
import { fromJS } from 'immutable'; |
||||
|
||||
export default class CardContainer extends React.PureComponent { |
@ -1,12 +1,12 @@ |
||||
import React from 'react'; |
||||
import { Provider } from 'react-redux'; |
||||
import PropTypes from 'prop-types'; |
||||
import configureStore from 'themes/glitch/store/configureStore'; |
||||
import { hydrateStore } from 'themes/glitch/actions/store'; |
||||
import configureStore from 'flavours/glitch/store/configureStore'; |
||||
import { hydrateStore } from 'flavours/glitch/actions/store'; |
||||
import { IntlProvider, addLocaleData } from 'react-intl'; |
||||
import { getLocale } from 'mastodon/locales'; |
||||
import Compose from 'themes/glitch/features/standalone/compose'; |
||||
import initialState from 'themes/glitch/util/initial_state'; |
||||
import Compose from 'flavours/glitch/features/standalone/compose'; |
||||
import initialState from 'flavours/glitch/util/initial_state'; |
||||
|
||||
const { localeData, messages } = getLocale(); |
||||
addLocaleData(localeData); |
@ -1,7 +1,7 @@ |
||||
import { openModal, closeModal } from 'themes/glitch/actions/modal'; |
||||
import { openModal, closeModal } from 'flavours/glitch/actions/modal'; |
||||
import { connect } from 'react-redux'; |
||||
import DropdownMenu from 'themes/glitch/components/dropdown_menu'; |
||||
import { isUserTouching } from 'themes/glitch/util/is_mobile'; |
||||
import DropdownMenu from 'flavours/glitch/components/dropdown_menu'; |
||||
import { isUserTouching } from 'flavours/glitch/util/is_mobile'; |
||||
|
||||
const mapStateToProps = state => ({ |
||||
isModalOpen: state.get('modal').modalType === 'ACTIONS', |
@ -1,6 +1,6 @@ |
||||
import { connect } from 'react-redux'; |
||||
import IntersectionObserverArticle from 'themes/glitch/components/intersection_observer_article'; |
||||
import { setHeight } from 'themes/glitch/actions/height_cache'; |
||||
import IntersectionObserverArticle from 'flavours/glitch/components/intersection_observer_article'; |
||||
import { setHeight } from 'flavours/glitch/actions/height_cache'; |
||||
|
||||
const makeMapStateToProps = (state, props) => ({ |
||||
cachedHeight: state.getIn(['height_cache', props.saveHeightKey, props.id]), |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue