2019-09-17 14:30:26 +09:00
|
|
|
import React, {useEffect, useState, useRef} from 'react';
|
|
|
|
import styled from 'styled-components';
|
|
|
|
import {useTranslation} from 'react-i18next';
|
|
|
|
import fetch from 'isomorphic-unfetch';
|
|
|
|
import {TiArrowSync} from 'react-icons/ti';
|
2020-02-13 15:00:41 +09:00
|
|
|
import {motion} from 'framer-motion';
|
2019-08-06 02:07:05 +09:00
|
|
|
|
2020-02-06 00:32:05 +09:00
|
|
|
import {capitalize, stem, germanify, njoin, lower, upper} from '../util/text';
|
|
|
|
import {sampleFromArray, fillArray} from '../util/array';
|
2020-03-06 00:05:54 +09:00
|
|
|
import {mobile, slideUp} from '../util/css';
|
2020-02-11 17:57:10 +09:00
|
|
|
import {sanitize} from '../util/text';
|
2020-03-05 22:09:12 +09:00
|
|
|
import {
|
|
|
|
sendShuffleSuggestionEvent,
|
|
|
|
sendAcceptSuggestionEvent,
|
|
|
|
} from '../util/analytics';
|
2019-08-03 16:44:48 +09:00
|
|
|
|
2019-09-17 14:30:26 +09:00
|
|
|
type Modifier = (word: string) => string;
|
2019-09-01 01:28:24 +09:00
|
|
|
|
2019-09-17 14:30:26 +09:00
|
|
|
const maximumCount = 3;
|
2019-09-01 01:28:24 +09:00
|
|
|
const modifiers: Modifier[] = [
|
2020-02-06 00:06:04 +09:00
|
|
|
(word): string => `${capitalize(germanify(word))}`,
|
2020-02-05 21:25:00 +09:00
|
|
|
(word): string => `${capitalize(word)}`,
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin('Air', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('All', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Cloud', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Co', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Deep', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Easy', capitalize(word), {elision: false}),
|
2020-03-05 22:09:12 +09:00
|
|
|
(word): string => njoin('En', lower(word), {elision: false}),
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin('Fast', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Fire', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Fusion', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Git', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Go', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Hyper', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('In', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Infini', lower(word)),
|
|
|
|
(word): string => njoin('Insta', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('i', capitalize(word)),
|
|
|
|
(word): string => njoin('Lead', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Less', lower(word)),
|
|
|
|
(word): string => njoin('lib', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Many', lower(word)),
|
|
|
|
(word): string => njoin('Max', upper(word), {elision: false}),
|
|
|
|
(word): string => njoin('Micro', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('mini', lower(word)),
|
|
|
|
(word): string => njoin('Mono', lower(word)),
|
|
|
|
(word): string => njoin('Meta', lower(word)),
|
|
|
|
(word): string => njoin('nano', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Native', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Next', lower(word)),
|
|
|
|
(word): string => njoin('No', upper(word), {elision: false}),
|
|
|
|
(word): string => njoin('Octo', capitalize(word)),
|
|
|
|
(word): string => njoin('Omni', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('One', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Open', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Pro', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('quick', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Semantic', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Smart', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Snap', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Super', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Ultra', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Un', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Uni', lower(word)),
|
|
|
|
(word): string => njoin('Up', lower(word), {elision: false}),
|
|
|
|
(word): string => njoin('Wunder', lower(germanify(word)), {elision: false}),
|
|
|
|
(word): string => njoin('Zen', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin('Zero', capitalize(word), {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'able', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'al', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'el', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'em', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'en', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'er', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ery', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ia', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ible', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ics', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ifier', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ify', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ii', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'in', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'io', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ist', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ity', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ium', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'iverse', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'ory', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'um', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(stem(word)), 'y'),
|
|
|
|
(word): string => njoin(capitalize(word), 'AI', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'API', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'App'),
|
|
|
|
(word): string => njoin(capitalize(word), 'base', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'book', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Bot', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'butler', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'byte', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'cast', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'CDN', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'CI', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Club', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'DB', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Express', {elision: false}),
|
2020-03-05 22:09:12 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'en'),
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'feed', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Finder', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'flow', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'form', {elision: false}),
|
2020-02-06 00:06:04 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'ful'),
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'Go', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'gram', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Hero', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Hub', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Hunt', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'IO', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'It', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Kit', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Lab', {elision: false}),
|
2020-02-06 00:06:04 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'let'),
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'less'),
|
|
|
|
(word): string => njoin(capitalize(word), 'Link', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'list', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'list', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'lit', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'mind', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'ML', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'note', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Notes', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Pod', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Pro', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Scan', {elision: false}),
|
2020-02-06 00:06:04 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'shot'),
|
|
|
|
(word): string => njoin(capitalize(word), 'space'),
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'Stack', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'Studio', {elision: false}),
|
2020-03-11 12:37:39 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'Sensei', {elision: false}),
|
2020-02-06 00:06:04 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'time'),
|
|
|
|
(word): string => njoin(capitalize(word), 'way'),
|
2020-02-12 12:19:12 +09:00
|
|
|
(word): string => njoin(capitalize(word), 'x', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'check', {elision: false}),
|
|
|
|
(word): string => njoin(capitalize(word), 'joy'),
|
|
|
|
(word): string => njoin(lower(word), 'lint', {elision: false}),
|
|
|
|
(word): string => njoin(lower(word), 'ly', {elision: false}),
|
2019-09-17 14:30:26 +09:00
|
|
|
];
|
2019-08-03 22:26:37 +09:00
|
|
|
|
2019-12-24 01:57:07 +09:00
|
|
|
function modifyWord(word: string): string {
|
2019-09-17 14:30:26 +09:00
|
|
|
return modifiers[Math.floor(Math.random() * modifiers.length)](word);
|
2019-08-03 21:51:12 +09:00
|
|
|
}
|
|
|
|
|
2019-12-24 01:57:07 +09:00
|
|
|
async function findSynonyms(word: string): Promise<string[]> {
|
2019-08-03 21:51:12 +09:00
|
|
|
try {
|
|
|
|
const response = await fetch(
|
|
|
|
`https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&dt=ss&ie=UTF-8&oe=UTF-8&dj=1&q=${encodeURIComponent(
|
2019-09-17 14:30:26 +09:00
|
|
|
word,
|
|
|
|
)}`,
|
|
|
|
);
|
2019-09-01 01:28:24 +09:00
|
|
|
const json: {
|
2019-09-17 14:30:26 +09:00
|
|
|
synsets: Array<{entry: Array<{synonym: string[]}>}>;
|
|
|
|
} = await response.json();
|
2019-09-01 01:28:24 +09:00
|
|
|
const synonyms = Array.from(
|
|
|
|
new Set<string>(
|
2019-08-07 22:26:03 +09:00
|
|
|
json.synsets.reduce(
|
2019-09-01 01:28:24 +09:00
|
|
|
(sum, synset) => [...sum, ...synset.entry.map((e) => e.synonym[0])],
|
2019-09-17 14:30:26 +09:00
|
|
|
[] as string[],
|
|
|
|
),
|
|
|
|
),
|
2020-02-11 17:57:10 +09:00
|
|
|
)
|
|
|
|
.filter((word) => !/[\s-]/.exec(word))
|
|
|
|
.map((word) => sanitize(word));
|
2019-09-17 14:30:26 +09:00
|
|
|
return synonyms;
|
2019-08-03 21:51:12 +09:00
|
|
|
} catch (err) {
|
2019-09-17 14:30:26 +09:00
|
|
|
return [];
|
2019-08-03 21:51:12 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-01 01:28:24 +09:00
|
|
|
const Suggestion: React.FC<{
|
2019-09-17 14:30:26 +09:00
|
|
|
query: string;
|
|
|
|
onSubmit: (name: string) => void;
|
|
|
|
}> = ({query, onSubmit}) => {
|
|
|
|
const {t} = useTranslation();
|
|
|
|
const synonymRef = useRef<string[]>([]);
|
|
|
|
const [bestWords, setBestWords] = useState<string[]>([]);
|
2019-08-07 22:26:03 +09:00
|
|
|
|
2019-12-24 01:57:07 +09:00
|
|
|
function shuffle(): void {
|
2019-08-07 22:26:03 +09:00
|
|
|
const best = fillArray(
|
|
|
|
sampleFromArray(synonymRef.current, maximumCount),
|
|
|
|
query,
|
2019-09-17 14:30:26 +09:00
|
|
|
maximumCount,
|
|
|
|
).map((word) => modifyWord(word));
|
|
|
|
setBestWords(best);
|
2019-08-07 22:26:03 +09:00
|
|
|
}
|
|
|
|
|
2019-12-24 01:57:07 +09:00
|
|
|
function applyQuery(name: string): void {
|
2020-03-05 22:09:12 +09:00
|
|
|
sendAcceptSuggestionEvent();
|
2019-09-17 14:30:26 +09:00
|
|
|
onSubmit(name);
|
2019-08-07 22:26:03 +09:00
|
|
|
}
|
2019-08-03 16:44:48 +09:00
|
|
|
|
2020-03-05 22:09:12 +09:00
|
|
|
function onShuffleButtonClicked() {
|
|
|
|
sendShuffleSuggestionEvent();
|
|
|
|
shuffle();
|
|
|
|
}
|
|
|
|
|
2019-08-03 21:51:12 +09:00
|
|
|
useEffect(() => {
|
2020-02-05 15:59:53 +09:00
|
|
|
let isEffective = true;
|
2019-12-24 01:57:07 +09:00
|
|
|
const fn = async (): Promise<void> => {
|
2019-08-03 21:51:12 +09:00
|
|
|
if (query && query.length > 0) {
|
2019-09-17 14:30:26 +09:00
|
|
|
const synonyms = await findSynonyms(query);
|
2020-02-05 15:59:53 +09:00
|
|
|
if (!isEffective) {
|
|
|
|
return;
|
|
|
|
}
|
2020-02-12 12:19:12 +09:00
|
|
|
synonymRef.current = [query, ...synonyms];
|
|
|
|
shuffle();
|
2019-08-03 21:51:12 +09:00
|
|
|
}
|
2019-09-17 14:30:26 +09:00
|
|
|
};
|
|
|
|
fn();
|
2020-02-05 15:59:53 +09:00
|
|
|
return () => {
|
|
|
|
isEffective = false;
|
|
|
|
};
|
2020-03-27 00:49:23 +09:00
|
|
|
// eslint-disable-next-line
|
2019-09-17 14:30:26 +09:00
|
|
|
}, [query]);
|
2019-08-03 16:44:48 +09:00
|
|
|
|
|
|
|
return (
|
|
|
|
<Container>
|
|
|
|
<Title>{t('try')}</Title>
|
|
|
|
<Items>
|
2019-08-07 22:26:03 +09:00
|
|
|
{bestWords &&
|
2020-02-05 15:59:53 +09:00
|
|
|
bestWords.map((name, i) => (
|
2020-03-06 00:05:54 +09:00
|
|
|
<Item
|
|
|
|
key={name + i}
|
|
|
|
onClick={(): void => applyQuery(name)}
|
2020-03-11 12:37:39 +09:00
|
|
|
delay={i + 1}
|
|
|
|
>
|
2020-03-06 00:05:54 +09:00
|
|
|
<span>{name}</span>
|
2019-08-03 21:51:12 +09:00
|
|
|
</Item>
|
|
|
|
))}
|
2019-08-03 16:44:48 +09:00
|
|
|
</Items>
|
2020-03-05 22:09:12 +09:00
|
|
|
<Button onClick={onShuffleButtonClicked}>
|
2020-02-05 20:33:24 +09:00
|
|
|
<TiArrowSync />
|
2020-02-13 15:00:41 +09:00
|
|
|
</Button>
|
2019-08-03 16:44:48 +09:00
|
|
|
</Container>
|
2019-09-17 14:30:26 +09:00
|
|
|
);
|
|
|
|
};
|
2019-08-03 16:44:48 +09:00
|
|
|
|
2019-09-17 14:30:26 +09:00
|
|
|
export default Suggestion;
|
2019-09-01 01:28:24 +09:00
|
|
|
|
2019-08-03 16:44:48 +09:00
|
|
|
const Container = styled.div`
|
2020-02-08 19:05:33 +09:00
|
|
|
margin-top: 20px;
|
2019-08-03 16:44:48 +09:00
|
|
|
margin-bottom: 10px;
|
|
|
|
display: flex;
|
2019-08-07 22:26:03 +09:00
|
|
|
flex-direction: column;
|
|
|
|
align-items: center;
|
2019-08-03 16:44:48 +09:00
|
|
|
flex-wrap: wrap;
|
|
|
|
justify-content: center;
|
2020-02-08 19:05:33 +09:00
|
|
|
|
|
|
|
${mobile} {
|
|
|
|
margin-top: 15px;
|
|
|
|
}
|
2019-09-17 14:30:26 +09:00
|
|
|
`;
|
2019-08-03 16:44:48 +09:00
|
|
|
|
|
|
|
const Title = styled.div`
|
2020-02-06 17:21:22 +09:00
|
|
|
padding: 0 10px;
|
2019-08-07 22:26:03 +09:00
|
|
|
color: gray;
|
|
|
|
border: 1px solid gray;
|
|
|
|
border-radius: 2em;
|
2020-02-06 03:39:06 +09:00
|
|
|
text-transform: uppercase;
|
|
|
|
font-size: 12px;
|
|
|
|
user-select: none;
|
2019-09-17 14:30:26 +09:00
|
|
|
`;
|
2019-08-03 16:44:48 +09:00
|
|
|
|
|
|
|
const Items = styled.div`
|
2020-02-06 17:21:22 +09:00
|
|
|
margin: 5px 0;
|
2019-08-03 16:44:48 +09:00
|
|
|
display: flex;
|
|
|
|
flex-direction: row;
|
2019-08-03 21:51:12 +09:00
|
|
|
flex-wrap: wrap;
|
|
|
|
justify-content: center;
|
2019-08-07 22:26:03 +09:00
|
|
|
|
|
|
|
${mobile} {
|
|
|
|
flex-direction: column;
|
|
|
|
align-items: center;
|
|
|
|
}
|
2019-09-17 14:30:26 +09:00
|
|
|
`;
|
2019-08-03 16:44:48 +09:00
|
|
|
|
2020-03-06 00:05:54 +09:00
|
|
|
const Item = styled.div<{delay: number}>`
|
2020-02-13 15:00:41 +09:00
|
|
|
margin: 10px 10px 0;
|
2019-08-03 16:44:48 +09:00
|
|
|
cursor: pointer;
|
|
|
|
font-weight: bold;
|
2020-02-12 12:19:12 +09:00
|
|
|
font-family: inherit;
|
2020-02-06 13:16:30 +09:00
|
|
|
font-size: 1.5rem;
|
2020-02-06 17:21:22 +09:00
|
|
|
line-height: 1em;
|
2019-08-03 22:26:37 +09:00
|
|
|
border-bottom: 1px dashed black;
|
2019-08-07 22:26:03 +09:00
|
|
|
color: black;
|
2020-03-06 00:05:54 +09:00
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
span {
|
|
|
|
display: block;
|
2020-03-08 11:44:34 +09:00
|
|
|
animation: 0.6s cubic-bezier(0.19, 1, 0.22, 1)
|
|
|
|
${(props) => `${props.delay * 0.1}s`} 1 normal both running ${slideUp};
|
2020-03-06 00:05:54 +09:00
|
|
|
}
|
2019-08-07 22:26:03 +09:00
|
|
|
|
|
|
|
${mobile} {
|
2020-02-08 19:05:33 +09:00
|
|
|
margin: 10px 0 0;
|
2020-02-06 13:16:30 +09:00
|
|
|
font-size: 1.3rem;
|
2019-08-07 22:26:03 +09:00
|
|
|
}
|
2019-09-17 14:30:26 +09:00
|
|
|
`;
|
2019-08-07 22:26:03 +09:00
|
|
|
|
2020-02-13 15:00:41 +09:00
|
|
|
const Button = styled(motion.div).attrs({
|
|
|
|
whileHover: {scale: 1.1},
|
|
|
|
whileTap: {scale: 0.9},
|
|
|
|
})`
|
2020-02-05 20:33:24 +09:00
|
|
|
margin: 15px 0 0 0;
|
2020-02-13 15:00:41 +09:00
|
|
|
padding: 8px 12px;
|
2019-08-07 22:26:03 +09:00
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
border-bottom: none;
|
2020-02-05 20:33:24 +09:00
|
|
|
color: white;
|
|
|
|
border-radius: 4px;
|
|
|
|
font-size: 1.3rem;
|
|
|
|
user-select: none;
|
2020-02-05 20:47:03 +09:00
|
|
|
background: #5610ff;
|
2020-02-05 20:33:24 +09:00
|
|
|
transition: background 0.1s ease-out;
|
2020-02-13 15:00:41 +09:00
|
|
|
cursor: pointer;
|
2020-02-05 20:33:24 +09:00
|
|
|
|
|
|
|
&:hover {
|
2020-02-05 20:47:03 +09:00
|
|
|
background: #723df3;
|
2020-02-05 20:33:24 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
&:active {
|
2020-02-05 20:47:03 +09:00
|
|
|
background: #a17ff5;
|
2020-02-05 20:33:24 +09:00
|
|
|
}
|
2019-09-17 14:30:26 +09:00
|
|
|
`;
|