Move from Giphy to Tenor
This commit is contained in:
parent
4d57353991
commit
cb0adf81f1
12 changed files with 296 additions and 61 deletions
|
@ -67,7 +67,7 @@ export const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS'
|
||||||
export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL';
|
export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL';
|
||||||
|
|
||||||
export const COMPOSE_DOODLE_SET = 'COMPOSE_DOODLE_SET';
|
export const COMPOSE_DOODLE_SET = 'COMPOSE_DOODLE_SET';
|
||||||
export const COMPOSE_GIPHY_SET = 'COMPOSE_GIPHY_SET';
|
export const COMPOSE_TENOR_SET = 'COMPOSE_TENOR_SET';
|
||||||
|
|
||||||
export const COMPOSE_POLL_ADD = 'COMPOSE_POLL_ADD';
|
export const COMPOSE_POLL_ADD = 'COMPOSE_POLL_ADD';
|
||||||
export const COMPOSE_POLL_REMOVE = 'COMPOSE_POLL_REMOVE';
|
export const COMPOSE_POLL_REMOVE = 'COMPOSE_POLL_REMOVE';
|
||||||
|
@ -287,9 +287,9 @@ export function doodleSet(options) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function giphySet(options) {
|
export function tenorSet(options) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_GIPHY_SET,
|
type: COMPOSE_TENOR_SET,
|
||||||
options: options,
|
options: options,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -133,7 +133,7 @@ class ComposerOptions extends ImmutablePureComponent {
|
||||||
onChangeContentType: PropTypes.func,
|
onChangeContentType: PropTypes.func,
|
||||||
onTogglePoll: PropTypes.func,
|
onTogglePoll: PropTypes.func,
|
||||||
onDoodleOpen: PropTypes.func,
|
onDoodleOpen: PropTypes.func,
|
||||||
onEmbedGiphy: PropTypes.func,
|
onEmbedTenor: PropTypes.func,
|
||||||
onModalClose: PropTypes.func,
|
onModalClose: PropTypes.func,
|
||||||
onModalOpen: PropTypes.func,
|
onModalOpen: PropTypes.func,
|
||||||
onToggleSpoiler: PropTypes.func,
|
onToggleSpoiler: PropTypes.func,
|
||||||
|
@ -156,7 +156,7 @@ class ComposerOptions extends ImmutablePureComponent {
|
||||||
// Handles attachment clicks.
|
// Handles attachment clicks.
|
||||||
handleClickAttach = (name) => {
|
handleClickAttach = (name) => {
|
||||||
const { fileElement } = this;
|
const { fileElement } = this;
|
||||||
const { onDoodleOpen, onEmbedGiphy } = this.props;
|
const { onDoodleOpen, onEmbedTenor } = this.props;
|
||||||
|
|
||||||
// We switch over the name of the option.
|
// We switch over the name of the option.
|
||||||
switch (name) {
|
switch (name) {
|
||||||
|
@ -171,8 +171,8 @@ class ComposerOptions extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case 'gif':
|
case 'gif':
|
||||||
if (onEmbedGiphy) {
|
if (onEmbedTenor) {
|
||||||
onEmbedGiphy();
|
onEmbedTenor();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,8 +49,8 @@ const mapDispatchToProps = (dispatch) => ({
|
||||||
dispatch(openModal('DOODLE', { noEsc: true, noClose: true }));
|
dispatch(openModal('DOODLE', { noEsc: true, noClose: true }));
|
||||||
},
|
},
|
||||||
|
|
||||||
onEmbedGiphy() {
|
onEmbedTenor() {
|
||||||
dispatch(openModal('GIPHY', { noEsc: true }));
|
dispatch(openModal('TENOR', { noEsc: true }));
|
||||||
},
|
},
|
||||||
|
|
||||||
onModalClose() {
|
onModalClose() {
|
||||||
|
|
|
@ -3,16 +3,16 @@ import PropTypes from 'prop-types';
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { giphySet, uploadCompose } from 'flavours/glitch/actions/compose';
|
import { tenorSet, uploadCompose } from 'flavours/glitch/actions/compose';
|
||||||
import IconButton from 'flavours/glitch/components/icon_button';
|
import IconButton from 'flavours/glitch/components/icon_button';
|
||||||
import ReactGiphySearchbox from 'react-giphy-searchbox'
|
import Tenor from 'react-tenor';
|
||||||
import { defineMessages, injectIntl } from 'react-intl';
|
import { defineMessages, injectIntl } from 'react-intl';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
search: { id: 'giphy.search', defaultMessage: 'Search for GIFs' },
|
search: { id: 'tenor.search', defaultMessage: 'Search for GIFs' },
|
||||||
error: { id: 'giphy.error', defaultMessage: 'Oops! Something went wrong. Please, try again.' },
|
error: { id: 'tenor.error', defaultMessage: 'Oops! Something went wrong. Please, try again.' },
|
||||||
loading: { id: 'giphy.loading', defaultMessage: 'Loading...'},
|
loading: { id: 'tenor.loading', defaultMessage: 'Loading...' },
|
||||||
nomatches: { id: 'giphy.nomatches', defaultMessage: 'No matches found.' },
|
nomatches: { id: 'tenor.nomatches', defaultMessage: 'No matches found.' },
|
||||||
close: { id: 'settings.close', defaultMessage: 'Close' },
|
close: { id: 'settings.close', defaultMessage: 'Close' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -28,12 +28,12 @@ function dataURLtoFile(dataurl, filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
options: state.getIn(['compose', 'giphy']),
|
options: state.getIn(['compose', 'tenor']),
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => ({
|
const mapDispatchToProps = dispatch => ({
|
||||||
/** Set options in the redux store */
|
/** Set options in the redux store */
|
||||||
setOpt: (opts) => dispatch(giphySet(opts)),
|
setOpt: (opts) => dispatch(tenorSet(opts)),
|
||||||
/** Submit GIF for upload */
|
/** Submit GIF for upload */
|
||||||
submit: (file) => dispatch(uploadCompose([file])),
|
submit: (file) => dispatch(uploadCompose([file])),
|
||||||
});
|
});
|
||||||
|
@ -50,9 +50,10 @@ class GIFModal extends ImmutablePureComponent {
|
||||||
submit: PropTypes.func.isRequired,
|
submit: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
onDoneButton = (item) => {
|
onDoneButton = (result) => {
|
||||||
const url = item["images"]["original"]["mp4"];
|
const url = result.media[0].mp4.url;
|
||||||
var modal = this;
|
var modal = this;
|
||||||
|
// eslint-disable-next-line promise/catch-or-return
|
||||||
fetch(url).then(function(response) {
|
fetch(url).then(function(response) {
|
||||||
return response.blob();
|
return response.blob();
|
||||||
}).then(function(blob) {
|
}).then(function(blob) {
|
||||||
|
@ -60,7 +61,7 @@ class GIFModal extends ImmutablePureComponent {
|
||||||
reader.readAsDataURL(blob);
|
reader.readAsDataURL(blob);
|
||||||
reader.onloadend = function() {
|
reader.onloadend = function() {
|
||||||
var dataUrl = reader.result;
|
var dataUrl = reader.result;
|
||||||
const file = dataURLtoFile(dataUrl, 'giphy.mp4');
|
const file = dataURLtoFile(dataUrl, 'tenor.mp4');
|
||||||
modal.props.submit(file);
|
modal.props.submit(file);
|
||||||
modal.props.onClose(); // close dialog
|
modal.props.onClose(); // close dialog
|
||||||
};
|
};
|
||||||
|
@ -72,24 +73,27 @@ class GIFModal extends ImmutablePureComponent {
|
||||||
const { intl } = this.props;
|
const { intl } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='modal-root__modal giphy-modal'>
|
<div className='modal-root__modal tenor-modal'>
|
||||||
<div className='giphy-modal__container'>
|
<div className='tenor-modal__container'>
|
||||||
<IconButton title={intl.formatMessage(messages.close)} icon="close" size="16" onClick={this.props.onClose} style={{float: "right"}} /><br />
|
<IconButton title={intl.formatMessage(messages.close)} icon='close' size="16" onClick={this.props.onClose} style={{ float: 'right' }} /><br />
|
||||||
<ReactGiphySearchbox
|
<div className='giphy-modal__searchbox'>
|
||||||
apiKey="1ttK05MF98dLllFFknTAVo0U4CGcQb4J"
|
<Tenor
|
||||||
onSelect={item => this.onDoneButton(item)}
|
token='FJBKNQSVF2DD'
|
||||||
|
// eslint-disable-next-line react/jsx-no-bind
|
||||||
|
onSelect={result => this.onDoneButton(result)}
|
||||||
masonryConfig={[
|
masonryConfig={[
|
||||||
{ columns: 2, imageWidth: 190, gutter: 5 },
|
{ columns: 2, imageWidth: 190, gutter: 5 },
|
||||||
{ mq: "700px", columns: 2, imageWidth: 210, gutter: 5 }
|
{ mq: '700px', columns: 2, imageWidth: 210, gutter: 5 }
|
||||||
]}
|
]}
|
||||||
autoFocus="true"
|
autoFocus='true'
|
||||||
searchPlaceholder={intl.formatMessage(messages.search)}
|
searchPlaceholder={intl.formatMessage(messages.search)}
|
||||||
messageError={intl.formatMessage(messages.error)}
|
messageError={intl.formatMessage(messages.error)}
|
||||||
messageLoading={intl.formatMessage(messages.loading)}
|
messageLoading={intl.formatMessage(messages.loading)}
|
||||||
messageNoMatches={intl.formatMessage(messages.nomatches)}
|
messageNoMatches={intl.formatMessage(messages.nomatches)}
|
||||||
wrapperClassName="giphy-modal__searchbox"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<br /><img src='/tenor.svg' alt='Tenor logo' />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ const MODAL_COMPONENTS = {
|
||||||
'BOOST': () => Promise.resolve({ default: BoostModal }),
|
'BOOST': () => Promise.resolve({ default: BoostModal }),
|
||||||
'FAVOURITE': () => Promise.resolve({ default: FavouriteModal }),
|
'FAVOURITE': () => Promise.resolve({ default: FavouriteModal }),
|
||||||
'DOODLE': () => Promise.resolve({ default: DoodleModal }),
|
'DOODLE': () => Promise.resolve({ default: DoodleModal }),
|
||||||
'GIPHY': () => Promise.resolve({ default: GIFModal }),
|
'TENOR': () => Promise.resolve({ default: GIFModal }),
|
||||||
'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }),
|
'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }),
|
||||||
'MUTE': MuteModal,
|
'MUTE': MuteModal,
|
||||||
'BLOCK': BlockModal,
|
'BLOCK': BlockModal,
|
||||||
|
@ -92,7 +92,7 @@ export default class ModalRoot extends React.PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
renderLoading = modalId => () => {
|
renderLoading = modalId => () => {
|
||||||
return ['MEDIA', 'VIDEO', 'BOOST', 'FAVOURITE', 'DOODLE', 'GIPHY', 'CONFIRM', 'ACTIONS'].indexOf(modalId) === -1 ? <ModalLoading /> : null;
|
return ['MEDIA', 'VIDEO', 'BOOST', 'FAVOURITE', 'DOODLE', 'TENOR', 'CONFIRM', 'ACTIONS'].indexOf(modalId) === -1 ? <ModalLoading /> : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
renderError = (props) => {
|
renderError = (props) => {
|
||||||
|
|
|
@ -38,7 +38,7 @@ import {
|
||||||
COMPOSE_UPLOAD_CHANGE_SUCCESS,
|
COMPOSE_UPLOAD_CHANGE_SUCCESS,
|
||||||
COMPOSE_UPLOAD_CHANGE_FAIL,
|
COMPOSE_UPLOAD_CHANGE_FAIL,
|
||||||
COMPOSE_DOODLE_SET,
|
COMPOSE_DOODLE_SET,
|
||||||
COMPOSE_GIPHY_SET,
|
COMPOSE_TENOR_SET,
|
||||||
COMPOSE_RESET,
|
COMPOSE_RESET,
|
||||||
COMPOSE_POLL_ADD,
|
COMPOSE_POLL_ADD,
|
||||||
COMPOSE_POLL_REMOVE,
|
COMPOSE_POLL_REMOVE,
|
||||||
|
@ -107,6 +107,7 @@ const initialState = ImmutableMap({
|
||||||
resetFileKey: Math.floor((Math.random() * 0x10000)),
|
resetFileKey: Math.floor((Math.random() * 0x10000)),
|
||||||
idempotencyKey: null,
|
idempotencyKey: null,
|
||||||
tagHistory: ImmutableList(),
|
tagHistory: ImmutableList(),
|
||||||
|
tenor: null,
|
||||||
media_modal: ImmutableMap({
|
media_modal: ImmutableMap({
|
||||||
id: null,
|
id: null,
|
||||||
description: '',
|
description: '',
|
||||||
|
@ -114,7 +115,6 @@ const initialState = ImmutableMap({
|
||||||
focusY: 0,
|
focusY: 0,
|
||||||
dirty: false,
|
dirty: false,
|
||||||
}),
|
}),
|
||||||
giphy: null,
|
|
||||||
doodle: ImmutableMap({
|
doodle: ImmutableMap({
|
||||||
fg: 'rgb( 0, 0, 0)',
|
fg: 'rgb( 0, 0, 0)',
|
||||||
bg: 'rgb(255, 255, 255)',
|
bg: 'rgb(255, 255, 255)',
|
||||||
|
@ -560,8 +560,8 @@ export default function compose(state = initialState, action) {
|
||||||
}));
|
}));
|
||||||
case COMPOSE_DOODLE_SET:
|
case COMPOSE_DOODLE_SET:
|
||||||
return state.mergeIn(['doodle'], action.options);
|
return state.mergeIn(['doodle'], action.options);
|
||||||
case COMPOSE_GIPHY_SET:
|
case COMPOSE_TENOR_SET:
|
||||||
return state.mergeIn(['giphy'], action.options);
|
return state.mergeIn(['tenor'], action.options);
|
||||||
case REDRAFT:
|
case REDRAFT:
|
||||||
const do_not_federate = !!action.status.get('local_only');
|
const do_not_federate = !!action.status.get('local_only');
|
||||||
let text = action.raw_text || unescapeHTML(expandMentions(action.status));
|
let text = action.raw_text || unescapeHTML(expandMentions(action.status));
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
.giphy-modal {
|
|
||||||
@extend .boost-modal;
|
|
||||||
width: 500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.giphy-modal__container {
|
|
||||||
text-align: center;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.giphy-modal__searchbox {
|
|
||||||
width: 450px !important;
|
|
||||||
}
|
|
|
@ -1814,7 +1814,7 @@ noscript {
|
||||||
@import 'search';
|
@import 'search';
|
||||||
@import 'emoji';
|
@import 'emoji';
|
||||||
@import 'doodle';
|
@import 'doodle';
|
||||||
@import 'giphy';
|
@import 'tenor';
|
||||||
@import 'drawer';
|
@import 'drawer';
|
||||||
@import 'media';
|
@import 'media';
|
||||||
@import 'sensitive';
|
@import 'sensitive';
|
||||||
|
|
217
app/javascript/flavours/glitch/styles/components/tenor.scss
Normal file
217
app/javascript/flavours/glitch/styles/components/tenor.scss
Normal file
|
@ -0,0 +1,217 @@
|
||||||
|
.tenor-modal {
|
||||||
|
@extend .boost-modal;
|
||||||
|
width: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tenor-modal__container {
|
||||||
|
text-align: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tenor-modal__searchbox {
|
||||||
|
width: 450px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor {
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
max-width: 480px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor-active {
|
||||||
|
box-shadow: 0 0 5px 1px rgba(0, 0, 0, .2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--search-bar {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--search {
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid #f7f7f7;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: #555;
|
||||||
|
font-family: Arial;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.3;
|
||||||
|
overflow: visible;
|
||||||
|
padding: .25em .5em;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--search:focus {
|
||||||
|
box-shadow: 0 0 2px 2px #6a89af;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--autocomplete {
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: #aaa;
|
||||||
|
font-family: Arial;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.3;
|
||||||
|
left: 0;
|
||||||
|
padding: .25em .5em;
|
||||||
|
pointer-events: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--autocomplete span {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--spinner {
|
||||||
|
animation: react-tenor-spin 1s linear infinite;
|
||||||
|
height: 22px;
|
||||||
|
position: absolute;
|
||||||
|
right: 4px;
|
||||||
|
top: 3px;
|
||||||
|
width: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--spinner path {
|
||||||
|
fill: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--suggestions {
|
||||||
|
overflow-x: auto;
|
||||||
|
padding: .5em .5em;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--suggestions button {
|
||||||
|
background: #6a89af;
|
||||||
|
border: 1px solid #f7f7f7;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: white;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 1em;
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--suggestions button:focus {
|
||||||
|
box-shadow: 0 0 2px 2px #6a89af;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--suggestions button + button {
|
||||||
|
margin-left: .5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--results {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--result {
|
||||||
|
background: #6a89af;
|
||||||
|
background-image: repeating-linear-gradient(
|
||||||
|
45deg,
|
||||||
|
rgba(255, 255, 255, .1),
|
||||||
|
rgba(255, 255, 255, .1) 15px,
|
||||||
|
transparent 0,
|
||||||
|
transparent 30px
|
||||||
|
);
|
||||||
|
border: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
flex-basis: 25%;
|
||||||
|
height: 120px;
|
||||||
|
opacity: 1;
|
||||||
|
padding: 0;
|
||||||
|
transition: opacity .3s;
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--result span {
|
||||||
|
animation: react-tenor-fade-in .2s;
|
||||||
|
background-size: cover;
|
||||||
|
display: block;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--result:focus {
|
||||||
|
box-shadow: 0 0 2px 2px #6a89af;
|
||||||
|
border: 1px solid #f7f7f7;
|
||||||
|
outline: none;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--result:hover {
|
||||||
|
opacity: .5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 480px) {
|
||||||
|
.react-tenor--result {
|
||||||
|
flex-basis: 33%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--page-left,
|
||||||
|
.react-tenor--page-right {
|
||||||
|
background: #6a89af;
|
||||||
|
border: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
height: 1.8em;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(50% - .9em);
|
||||||
|
opacity: .5;
|
||||||
|
position: absolute;
|
||||||
|
transition: opacity .2s, left .2s, right .2s;
|
||||||
|
width: 1.8em;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--results:hover .react-tenor--page-left,
|
||||||
|
.react-tenor--results:hover .react-tenor--page-right {
|
||||||
|
opacity: 1;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--results:hover .react-tenor--page-left {
|
||||||
|
left: -1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--results:hover .react-tenor--page-right {
|
||||||
|
right: -1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--page-left div,
|
||||||
|
.react-tenor--page-right div {
|
||||||
|
background: inherit;
|
||||||
|
height: 1.6em;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
top: .1em;
|
||||||
|
position: absolute;
|
||||||
|
width: 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--page-left {
|
||||||
|
left: -.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--page-left div {
|
||||||
|
left: -.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--page-right {
|
||||||
|
right: -.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-tenor--page-right div {
|
||||||
|
right: -.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes react-tenor-fade-in {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes react-tenor-spin {
|
||||||
|
from { transform: rotate(0deg); }
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
|
@ -36,8 +36,8 @@
|
||||||
"@rails/ujs": "^6.1.7",
|
"@rails/ujs": "^6.1.7",
|
||||||
"abortcontroller-polyfill": "^1.7.5",
|
"abortcontroller-polyfill": "^1.7.5",
|
||||||
"array-includes": "^3.1.6",
|
"array-includes": "^3.1.6",
|
||||||
"atrament": "0.2.4",
|
|
||||||
"arrow-key-navigation": "^1.2.0",
|
"arrow-key-navigation": "^1.2.0",
|
||||||
|
"atrament": "0.2.4",
|
||||||
"autoprefixer": "^9.8.8",
|
"autoprefixer": "^9.8.8",
|
||||||
"axios": "^1.3.2",
|
"axios": "^1.3.2",
|
||||||
"babel-loader": "^8.3.0",
|
"babel-loader": "^8.3.0",
|
||||||
|
@ -93,7 +93,6 @@
|
||||||
"react": "^16.14.0",
|
"react": "^16.14.0",
|
||||||
"react-dom": "^16.14.0",
|
"react-dom": "^16.14.0",
|
||||||
"react-helmet": "^6.1.0",
|
"react-helmet": "^6.1.0",
|
||||||
"react-giphy-searchbox": "^1.5.4",
|
|
||||||
"react-hotkeys": "^1.1.4",
|
"react-hotkeys": "^1.1.4",
|
||||||
"react-immutable-proptypes": "^2.2.0",
|
"react-immutable-proptypes": "^2.2.0",
|
||||||
"react-immutable-pure-component": "^2.2.2",
|
"react-immutable-pure-component": "^2.2.2",
|
||||||
|
@ -108,6 +107,7 @@
|
||||||
"react-select": "^5.7.0",
|
"react-select": "^5.7.0",
|
||||||
"react-sparklines": "^1.7.0",
|
"react-sparklines": "^1.7.0",
|
||||||
"react-swipeable-views": "^0.14.0",
|
"react-swipeable-views": "^0.14.0",
|
||||||
|
"react-tenor": "^2.2.0",
|
||||||
"react-textarea-autosize": "^8.4.0",
|
"react-textarea-autosize": "^8.4.0",
|
||||||
"react-toggle": "^4.1.3",
|
"react-toggle": "^4.1.3",
|
||||||
"redis": "^4.0.6 <4.1.0",
|
"redis": "^4.0.6 <4.1.0",
|
||||||
|
|
22
public/tenor.svg
Normal file
22
public/tenor.svg
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="50px" height="14px" viewBox="0 0 1584 447" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>TENOR_VECTOR</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="TENOR_VECTOR" fill="#007add">
|
||||||
|
<g id="TENOR_GREY">
|
||||||
|
<g id="Layer_1">
|
||||||
|
<g id="Group">
|
||||||
|
<path d="M314.8,295.7 C317.2,313.7 322.4,329.8 331.6,344.3 C353.2,378.4 384.6,394.6 424.8,394.3 C457.8,394.1 486.1,382.1 510.5,360.1 C523.3,348.5 541.3,350.7 550.3,364.6 C556.8,374.6 555.5,386.7 546.5,395.7 C519.2,423 486.7,440 448.2,444.7 C423,447.8 397.9,447.2 373.4,439.6 C317.6,422.3 280.5,385.3 264,329.7 C244.7,264.4 255,203.7 300.5,151.5 C331.4,116.2 371.4,99.4 418.5,100.2 C459.1,100.9 494.5,114.7 523,144.2 C546.7,168.7 559.8,198.6 565.8,231.8 C568.1,244.4 569.1,257.2 569.7,270 C570.4,284.1 559.4,295.1 545.3,295.8 C543.3,295.9 541.3,295.8 539.3,295.8 L321.9,295.8 C319.9,295.7 317.8,295.7 314.8,295.7 L314.8,295.7 Z M510,245.4 C508.5,232.4 504.8,220.4 499.9,208.7 C470.7,140 394.8,138.2 355.8,171.7 C335.3,189.3 323.2,211.8 317.2,237.8 C316.6,240.2 316.4,242.6 315.9,245.4 L510,245.4 L510,245.4 Z" id="Shape"></path>
|
||||||
|
<path d="M970.4,271.3 C970.5,182.9 1039,99.8 1143.8,100 C1241.5,100.1 1316.4,175.8 1316.2,274.2 C1316,370.9 1239.6,446.3 1141.7,446.4 C1047.4,446.4 970.2,367.6 970.4,271.3 L970.4,271.3 Z M1257,275.9 C1256.5,241.6 1246.6,213 1224.9,188.8 C1180.6,139.3 1099.7,141.2 1057.2,192.2 C1021.8,234.7 1019.3,309.7 1060.4,355.9 C1097,397.1 1162.8,405.6 1207.6,373.6 C1241.7,349.2 1256,314.7 1257,275.9 L1257,275.9 Z" id="Shape"></path>
|
||||||
|
<path d="M683.5,148.6 C689.8,142.6 694.9,137.5 700.2,132.7 C725.8,109.3 756.4,99.7 790.5,100 C817.4,100.3 842.7,106.3 865.1,121.9 C892.9,141.3 908,168.8 913.9,201.5 C915.8,212.1 916.8,223 916.9,233.8 C917.2,295 917,356.1 917,417.3 C917,429 909.6,440.1 898.7,444.1 C887.3,448.3 876.6,446.6 867.8,437.8 C861.6,431.7 858.9,424 858.9,415.2 C859,358.5 859.2,301.9 858.7,245.2 C858.6,234 857,222.5 854.3,211.7 C845.8,178.6 822.1,158.5 788.2,154.6 C764.1,151.8 741.2,155.6 721.1,170.2 C694.4,189.6 683.7,217.2 683.6,249.2 C683.4,305 683.6,360.9 683.5,416.7 C683.5,438.1 662.7,452 642.9,443.9 C632.4,439.6 625.3,428.2 625.3,415.4 L625.3,326.9 L625.3,129.4 C625.3,118.1 630.5,109.5 640.1,103.9 C650,98.1 660.3,98.4 670,104.5 C678.3,109.8 683.3,117.5 683.5,127.7 C683.6,134.3 683.5,140.7 683.5,148.6 L683.5,148.6 Z" id="Shape"></path>
|
||||||
|
<path d="M124.9,106.8 L131.4,106.8 L203.4,106.8 C214.2,106.8 223,110.3 228.6,120 C237.9,136.3 228.4,156 209.8,158.8 C206.9,159.2 203.8,159.3 200.8,159.3 L131.3,159.3 L124.9,159.3 L124.9,164.9 L124.9,343.4 C124.9,355.4 126.8,366.9 134.9,376.7 C141.5,384.7 150.4,388.1 160.1,389.6 C174.6,391.9 189,390.7 203.1,386.3 C216.5,382 229.7,388 234.2,400.5 C238.8,413.2 232.3,425.7 219.9,431.7 C203.1,439.9 185.5,443.5 166.9,444.5 C118.7,446.9 75.4,411.9 68.1,364.1 C67.1,357.9 66.8,351.5 66.8,345.2 C66.7,285.7 66.7,226.2 66.7,166.7 L66.7,159.8 C64.5,159.7 62.7,159.5 61,159.5 C50,159.5 39,159.7 28,159.4 C10,158.9 -1.6,145.4 1.1,128.4 C3,116.4 13.9,107.4 27.6,107 C38.4,106.7 49.3,106.9 60.1,106.9 C66.7,106.9 66.7,106.9 66.7,100 L66.7,30.5 C66.7,13.5 79,0.5 95.4,0.3 C111.8,0.1 124.7,13.2 124.8,30.4 C124.9,53.7 124.8,77.1 124.8,100.4 C124.9,102.3 124.9,104.3 124.9,106.8 L124.9,106.8 Z" id="Shape"></path>
|
||||||
|
<path d="M1432.4,170.1 C1441,160.3 1448.6,150.6 1457.4,142 C1477.5,122.4 1501.1,108.7 1528.9,103.2 C1537.3,101.5 1546.1,101.1 1554.7,101.5 C1571,102.4 1583.2,116 1583.2,132 C1583.2,147.8 1570.8,161.2 1554.7,162.7 C1542.8,163.8 1530.7,164 1519,166.5 C1486.9,173.4 1464.2,192.8 1449.6,221.9 C1436.8,247.3 1432.5,274.7 1432.4,302.8 C1432.2,340.3 1432.4,377.8 1432.4,415.3 C1432.4,432.7 1419.6,446.2 1403.1,446.1 C1386.5,446 1374,433.1 1374,415.7 L1374,128.8 C1374,115.8 1383.2,104 1395.6,100.9 C1409.2,97.5 1422.4,103.1 1428.3,115.6 C1430.6,120.4 1431.9,126 1432.1,131.4 C1432.7,142.5 1432.3,153.7 1432.3,164.9 C1432.4,166.6 1432.4,168.2 1432.4,170.1 L1432.4,170.1 Z" id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.4 KiB |
|
@ -2865,7 +2865,7 @@ braces@^3.0.2, braces@~3.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
fill-range "^7.0.1"
|
fill-range "^7.0.1"
|
||||||
|
|
||||||
bricks.js@^1.7.0, bricks.js@^1.8.0:
|
bricks.js@^1.7.0:
|
||||||
version "1.8.0"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/bricks.js/-/bricks.js-1.8.0.tgz#8fdeb3c0226af251f4d5727a7df7f9ac0092b4b2"
|
resolved "https://registry.yarnpkg.com/bricks.js/-/bricks.js-1.8.0.tgz#8fdeb3c0226af251f4d5727a7df7f9ac0092b4b2"
|
||||||
integrity sha1-j96zwCJq8lH01XJ6fff5rACStLI=
|
integrity sha1-j96zwCJq8lH01XJ6fff5rACStLI=
|
||||||
|
@ -9058,7 +9058,7 @@ react-immutable-pure-component@^2.2.2:
|
||||||
resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz#3014d3e20cd5a7a4db73b81f1f1464f4d351684b"
|
resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz#3014d3e20cd5a7a4db73b81f1f1464f4d351684b"
|
||||||
integrity sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==
|
integrity sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==
|
||||||
|
|
||||||
react-infinite-scroller@^1.0.12, react-infinite-scroller@^1.2.4:
|
react-infinite-scroller@^1.0.12:
|
||||||
version "1.2.4"
|
version "1.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/react-infinite-scroller/-/react-infinite-scroller-1.2.4.tgz#f67eaec4940a4ce6417bebdd6e3433bfc38826e9"
|
resolved "https://registry.yarnpkg.com/react-infinite-scroller/-/react-infinite-scroller-1.2.4.tgz#f67eaec4940a4ce6417bebdd6e3433bfc38826e9"
|
||||||
integrity sha512-/oOa0QhZjXPqaD6sictN2edFMsd3kkMiE19Vcz5JDgHpzEJVqYcmq+V3mkwO88087kvKGe1URNksHEOt839Ubw==
|
integrity sha512-/oOa0QhZjXPqaD6sictN2edFMsd3kkMiE19Vcz5JDgHpzEJVqYcmq+V3mkwO88087kvKGe1URNksHEOt839Ubw==
|
||||||
|
@ -9254,6 +9254,11 @@ react-swipeable-views@^0.14.0:
|
||||||
react-swipeable-views-utils "^0.14.0"
|
react-swipeable-views-utils "^0.14.0"
|
||||||
warning "^4.0.1"
|
warning "^4.0.1"
|
||||||
|
|
||||||
|
react-tenor@^2.2.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-tenor/-/react-tenor-2.2.0.tgz#98326868cc199165bacb911abdbbb48306232b6f"
|
||||||
|
integrity sha512-hs0KomduflTLU05fvKAtrf9f/aAj3wN2kPF2cl5cAOFPkhuaVJuWLNxRSAQN1m+aKHinujEQZ1fXp+gL1KgYhg==
|
||||||
|
|
||||||
react-test-renderer@^16.14.0:
|
react-test-renderer@^16.14.0:
|
||||||
version "16.14.0"
|
version "16.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae"
|
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae"
|
||||||
|
|
Loading…
Reference in a new issue