Compare commits

...

151 Commits

Author SHA1 Message Date
8db8fc605f fix emojigen 40(stretchが逆) 2022-05-15 23:26:48 +09:00
4c71d05f51 wip emojigen 39(fix link) 2022-05-08 01:06:44 +09:00
da8cb8fc73 wip emojigen 38(fix link) 2022-05-08 00:44:45 +09:00
aecc01fd8a wip emojigen 37(fix link) 2022-05-07 22:58:46 +09:00
ffeb109afd wip emojigen 36(add preview color, fix link) 2022-05-07 22:46:27 +09:00
042d5f8c2d wip emojigen 35(change fa version, fix link) 2022-05-07 21:32:36 +09:00
39f2ccf8a3 wip emojigen 34 2022-05-07 20:15:03 +09:00
55f0e23a74 emojigen wip33 2022-05-07 12:26:45 +09:00
b4edc40fa8 emojigen wip32 2022-05-07 12:04:56 +09:00
562e4fd743 emojigen wip31 2022-05-07 03:43:29 +09:00
db7abd17fb emojigen wip30 2022-05-06 22:42:04 +09:00
fb1781ca53 emojigen wip29 2022-05-06 18:37:20 +09:00
17af085bef emojigen wip28 2022-05-06 17:34:41 +09:00
5d23cf8c58 emojigen wip27 2022-05-06 04:43:32 +09:00
e051b7719d emojigen wip26 2022-05-06 04:30:48 +09:00
522e148146 emojigen wip25 2022-05-06 04:19:23 +09:00
04c7dcd201 emojigen wip23 2022-05-06 03:43:04 +09:00
744310dc4e emojigen wip22 2022-05-06 00:13:12 +09:00
7d62342477 Adzukiさんが変更 2022-05-06 00:11:11 +09:00
025dc3d6f9 emojigen wip21 2022-05-05 22:59:27 +09:00
98f412a172 emojigen wip20 2022-05-05 22:24:05 +09:00
970f373cae emojigen wip19(あほすぎる) 2022-05-05 21:40:11 +09:00
c8331b5822 emojigen wip18 2022-05-05 20:43:39 +09:00
a8337b0964 emojigen wip17 2022-05-05 20:28:46 +09:00
85cc716781 Adzukiさんが変更 2022-05-05 20:00:00 +09:00
14990a1bd1 emojigen wip16 2022-05-05 19:59:11 +09:00
6b9f0d800e emojigen wip15 2022-05-05 19:14:26 +09:00
3e96cc2b6b emojigen wip14 2022-05-05 18:08:09 +09:00
5dad50767e emojigen wip13 2022-05-05 17:02:11 +09:00
b54e63f835 emojigen wip12 2022-05-05 16:55:34 +09:00
d59a072de7 emojigen wip11 2022-05-05 16:31:44 +09:00
5e3554d693 emojigen wip10 2022-05-05 00:38:03 +09:00
8b3e7bf04c emojigen wip9 2022-05-04 23:45:12 +09:00
15a1f1e585 emojigen wip8 2022-05-04 23:38:11 +09:00
8db5ec2919 emojigen wip7 2022-05-04 23:34:25 +09:00
c7e1bdf701 emojigen wip6 2022-05-04 23:30:27 +09:00
4d1b6b1c24 emojigen wip5 2022-05-04 23:24:17 +09:00
7a2c54cbd9 emojigen wip4 2022-05-04 23:09:30 +09:00
3a896e220a emojigen wip3 2022-05-04 22:52:35 +09:00
3499ba5456 emojigen wip2 2022-05-04 20:49:47 +09:00
641a565a86 wip set query object 2022-05-03 17:18:15 +09:00
300a84f3c4 emojigen wip 2022-05-03 16:51:26 +09:00
545671818a Merge branch 'develop' 2022-04-25 18:08:54 +09:00
22b647d97d Merge remote-tracking branch 'misskey-dev/master' into develop 2022-04-25 18:08:05 +09:00
22312ce983 Merge branch 'develop' 2022-04-11 23:17:30 +09:00
49b21efb60 Merge remote-tracking branch 'misskey-dev/master' into develop 2022-04-11 23:17:10 +09:00
dca6d23415 Merge branch 'develop' 2022-04-03 21:25:59 +09:00
7156bfb01c Merge remote-tracking branch 'misskey-dev/master' into develop 2022-04-03 21:25:44 +09:00
d4e9082941 Merge branch 'develop' 2022-04-02 17:05:00 +09:00
a2242261db Merge remote-tracking branch 'misskey-dev/master' into develop 2022-04-02 17:04:46 +09:00
9cf6561a95 Merge branch 'develop' 2022-04-02 16:07:03 +09:00
a989e904cc Merge branch '2022-wtf' into develop 2022-04-02 16:06:26 +09:00
7774465274 Merge branch 'develop' 2022-04-02 15:58:45 +09:00
b2299e1344 Merge remote-tracking branch 'misskey-dev/master' into develop 2022-04-02 15:57:56 +09:00
af0dfb2362 wtf??? 2022-04-01 03:39:17 +09:00
ad74fbc48f wtf????aaaa 2022-04-01 03:29:45 +09:00
d0775da7d2 wtf????aaa 2022-04-01 03:23:01 +09:00
633994ecb6 wtf????aa 2022-04-01 02:46:07 +09:00
54923b7ac9 wtf????aa 2022-04-01 02:21:30 +09:00
48e132a2c7 wtf????a 2022-04-01 02:03:24 +09:00
7663170fae wtf????a 2022-04-01 01:59:08 +09:00
cebb66cc36 wtf???? 2022-04-01 00:47:56 +09:00
f6dda604dc fix: update package.json select-file-enc.ts 2022-03-30 16:05:35 +09:00
d10143544d fix: update package.json 2022-03-30 16:04:20 +09:00
40e3c75c13 fix: update select-file-enc.ts 2022-03-30 15:59:08 +09:00
a2150b1269 fix: update l-simkey.json5 2022-03-29 03:08:09 +09:00
19579ed0f1 fix: add l-simkey.json5 2022-03-29 02:54:17 +09:00
78396baf82 fix: update package.json 2022-03-29 02:34:31 +09:00
982896f7be fix: update default store.ts 2022-03-29 02:31:29 +09:00
1c9b842983 fix: max note text length to 8192 2022-03-23 11:36:10 +09:00
0cf950bb35 Update test.yml 2022-03-21 19:38:59 +09:00
ef4f49778e Merge branch 'develop' 2022-03-21 19:29:41 +09:00
721c47a74b fix: reject mp4 2022-03-21 19:28:22 +09:00
11cbbeb795 Merge branch 'develop' 2022-03-13 16:22:27 +09:00
6bc893ca44 Merge pull request #27 from sim1222/sim-dev-comv-mov-1
feat: Add convert video container button
2022-03-13 16:15:56 +09:00
9c34f96cdd feat: Add convert video container button lang 2022-03-13 16:14:57 +09:00
74a80b3405 feat: Add convert video container button 2022-03-13 16:11:08 +09:00
84da9d4cd4 fix: wip 2022-03-13 14:37:55 +09:00
b48f76aad1 fix: update package.json 2022-03-13 14:14:44 +09:00
78b9550eca fix: debug 2022-03-13 14:09:44 +09:00
8fc770d371 Merge branch 'develop' 2022-03-12 19:38:26 +09:00
4aed68ec96 Merge tag '12.108.1-simkey' into develop 2022-03-12 19:38:14 +09:00
90c89c3083 fix: debug 2022-03-12 02:24:23 +09:00
c63d7dc898 fix: wippppppppppppppppppppppaaafaafawfwafwaafw 2022-03-12 02:19:56 +09:00
74e695a320 fix: wipppppppppppppppppppppp 2022-03-12 02:11:15 +09:00
f269ceaee9 fix: wip 2022-03-12 01:30:08 +09:00
57a106a192 fix: wip 2022-03-12 01:23:49 +09:00
5563d6bdeb fix: wip 2022-03-11 22:48:50 +09:00
ab59a5b659 fix: dont export select-file-enc.ts 2022-03-11 22:45:03 +09:00
a81f8b8275 feat: Add video convert button 2022-03-11 22:34:38 +09:00
c99c4b73f4 Create select-file-enc.ts 2022-03-11 22:05:08 +09:00
995d8f2f5d Update post-form.vue 2022-03-11 22:03:36 +09:00
6bb22007d8 Merge branch 'develop' 2022-03-09 23:09:49 +09:00
a4a0d33348 Merge tag '12.108.0-simkey' into develop 2022-03-09 23:09:14 +09:00
7d1f3cd1e8 Merge branch 'develop' of github.com:sim1222/misskey into develop 2022-02-21 19:08:08 +09:00
dc13627a68 add gitignore 2022-02-21 19:08:04 +09:00
b96e886a61 Merge branch 'develop' 2022-02-17 01:19:43 +09:00
7024f6651f Merge remote-tracking branch 'origin/sim-dev-reload-button-2' into develop 2022-02-17 01:19:30 +09:00
4f9aca0aa3 add reload button 2022-02-17 01:18:37 +09:00
88a2606884 Merge branch 'develop' 2022-02-12 17:39:33 +09:00
d6b15add1b Merge remote-tracking branch 'misskey-dev/master' into develop 2022-02-12 17:39:23 +09:00
39307694b5 Merge branch 'develop' 2022-02-11 22:20:20 +09:00
9b7be06eef Merge remote-tracking branch 'misskey-dev/develop' into develop 2022-02-11 22:20:04 +09:00
5afb3a59cd Merge branch 'develop' 2022-02-11 19:25:04 +09:00
73d66fc439 Merge tag '12.106.0-simkey' into develop 2022-02-11 19:24:42 +09:00
12214c473a Merge branch 'develop' 2022-02-09 22:01:03 +09:00
8e173a6d8e Merge tag '12.105.0' into develop 2022-02-09 22:00:47 +09:00
9d0c1a8fea Merge branch 'develop' 2022-02-09 17:17:20 +09:00
aee5193ef6 Merge branch 'master' into develop 2022-02-09 17:16:54 +09:00
2892a31142 Merge remote-tracking branch 'origin/develop' into develop 2022-02-09 17:14:50 +09:00
90bb0cec37 fix: Nya Translation from ja-JP 2022-02-09 17:14:30 +09:00
19775507fc Merge pull request #26 from sim1222/develop
Merge Develop 12.104.0
2022-02-09 16:40:32 +09:00
9d4f621833 fix conflct 2022-02-09 16:39:15 +09:00
2e095b4863 Merge pull request #24 from sim1222/develop
Merge Develop 12.103.1
2022-02-03 10:48:14 +09:00
5d9b9eeaad Merge branch 'master' into develop 2022-02-03 10:48:04 +09:00
98f5cb6cd2 git push origin developMerge branch 'misskey-dev-develop' into develop 2022-02-03 01:43:09 +00:00
b88c4d6d34 fix comf 2022-02-03 01:42:58 +00:00
6238ba965b wip add button 2022-01-30 19:42:54 +09:00
8489c3ca7b Merge pull request #22 from sim1222/v12.102.1
Merge develop V12.102.1
2022-01-29 05:34:12 +09:00
33871f3cb8 Merge branch 'master' into v12.102.1 2022-01-29 05:34:03 +09:00
5eb758fa28 update package.json 2022-01-29 04:17:15 +09:00
56d8f7f257 Merge pull request #19 from sim1222/develop
Merge Develop v12.102.0
2022-01-27 00:53:29 +09:00
74c3e6d483 Merge branch 'misskey-dev-develop' into develop 2022-01-27 00:52:19 +09:00
ead62a538f fix confrict 2022-01-27 00:52:09 +09:00
72058b30c2 Merge branch 'misskey-dev:develop' into develop 2022-01-26 20:09:42 +09:00
22102639a8 Merge pull request #16 from sim1222/develop
Change Color
2022-01-13 03:11:14 +09:00
ee4289076f Change Color 2022-01-13 03:10:42 +09:00
be011d3985 Merge pull request #15 from sim1222/develop
change color
2022-01-09 21:43:44 +09:00
6ef86df368 change color 2022-01-09 21:43:12 +09:00
34e099984f Merge pull request #14 from sim1222/develop
Fix ja-NY Language
2022-01-04 19:50:23 +09:00
5a1c6be944 Fix ja-NY Language 2022-01-04 19:33:41 +09:00
25991cfdc1 Merge pull request #11 from sim1222/develop
Merge Develop 12.101.1
2021-12-29 18:15:50 +09:00
b1a526aeea fix conflict 2021-12-29 18:15:03 +09:00
f31ef70ce7 Merge pull request #9 from sim1222/develop
Merge develop 12.101.0
2021-12-29 15:12:02 +09:00
09a751b992 git push origin developMerge branch 'misskey-dev-develop' into develop 2021-12-29 15:08:42 +09:00
a41e4ed4fd fix conflict 2021-12-29 15:08:31 +09:00
b77f7f5041 Merge pull request #7 from sim1222/develop
change repo url
2021-12-28 16:16:19 +09:00
7adcf99865 change repo url 2021-12-28 16:15:51 +09:00
cc2d5480f3 Merge pull request #6 from sim1222/develop
wip
2021-12-28 03:16:18 +09:00
fdd129fb83 wip 2021-12-28 03:15:56 +09:00
8dd3fef0e2 Merge pull request #5 from sim1222/develop
fix wip
2021-12-28 03:04:25 +09:00
f1c66f09e1 fix wip 2021-12-28 03:03:58 +09:00
6f328f2ccf Merge pull request #4 from sim1222/develop
fix typo
2021-12-28 02:55:19 +09:00
70b3d598c6 fix typo 2021-12-28 02:54:53 +09:00
668c403ece Merge pull request #3 from sim1222/develop
fix NYA JP
2021-12-28 02:49:24 +09:00
c873f17080 fix NYA JP 2021-12-28 02:48:55 +09:00
3f6691bd5e Merge pull request #2 from sim1222/develop
vsddgvsgdsgsdsg
2021-12-28 02:27:13 +09:00
260ece9881 Update package.json 2021-12-28 02:26:10 +09:00
9a4c04fe79 Merge pull request #1 from sim1222/sim-dev-ja-nya
Sim dev ja nya
2021-12-28 02:25:13 +09:00
24896d4a36 Merge branch 'misskey-dev:develop' into sim-dev-ja-nya 2021-12-28 02:17:22 +09:00
8aea52e9b4 てぬきにゃ翻訳 2021-12-28 02:05:40 +09:00
21 changed files with 2597 additions and 55 deletions

2
.gitignore vendored
View File

@ -42,3 +42,5 @@ ormconfig.json
*.blend3
*.blend4
*.blend5
start.sh

View File

@ -23,6 +23,7 @@ const languages = [
'fr-FR',
'id-ID',
'it-IT',
'ja-NY',
'ja-JP',
'ja-KS',
'kab-KAB',
@ -56,6 +57,7 @@ module.exports = Object.entries(locales)
const [lang] = k.split('-');
switch (k) {
case 'ja-JP': return v;
case 'ja-NY':
case 'ja-KS':
case 'en-US': return merge(locales['ja-JP'], v);
default: return merge(

View File

@ -222,6 +222,7 @@ currentPassword: "現在のパスワード"
newPassword: "新しいパスワード"
newPasswordRetype: "新しいパスワード(再入力)"
attachFile: "ファイルを添付"
attachVideoFile: "MOVファイルを添付"
more: "もっと!"
featured: "ハイライト"
usernameOrUserId: "ユーザー名かユーザーID"

1801
locales/ja-NY.yml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
{
"name": "misskey",
"version": "12.110.1",
"version": "12.110.1-simkey-v1",
"codename": "indigo",
"repository": {
"type": "git",
"url": "https://github.com/misskey-dev/misskey.git"
"url": "https://github.com/sim1222/misskey.git"
},
"private": true,
"scripts": {

View File

@ -1,4 +1,4 @@
export const MAX_NOTE_TEXT_LENGTH = 3000;
export const MAX_NOTE_TEXT_LENGTH = 8192;
export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days

View File

@ -4,7 +4,7 @@
"start_url": "/",
"display": "standalone",
"background_color": "#313a42",
"theme_color": "#86b300",
"theme_color": "#a7dc4e",
"icons": [
{
"src": "/static-assets/icons/192.png",

View File

@ -1,39 +1,78 @@
<template>
<div ref="el" class="fdidabkb" :class="{ slim: narrow, thin: thin_ }" :style="{ background: bg }" @click="onClick">
<template v-if="info">
<div v-if="!hideTitle" class="titleContainer" @click="showTabsPopup">
<MkAvatar v-if="info.avatar" class="avatar" :user="info.avatar" :disable-preview="true" :show-indicator="true"/>
<i v-else-if="info.icon" class="icon" :class="info.icon"></i>
<div
ref="el"
class="fdidabkb"
:class="{ slim: narrow, thin: thin_ }"
:style="{ background: bg }"
@click="onClick"
>
<template v-if="info">
<div v-if="!hideTitle" class="titleContainer" @click="showTabsPopup">
<MkAvatar
v-if="info.avatar"
class="avatar"
:user="info.avatar"
:disable-preview="true"
:show-indicator="true"
/>
<i v-else-if="info.icon" class="icon" :class="info.icon"></i>
<div class="title">
<MkUserName v-if="info.userName" :user="info.userName" :nowrap="true" class="title"/>
<div v-else-if="info.title" class="title">{{ info.title }}</div>
<div v-if="!narrow && info.subtitle" class="subtitle">
{{ info.subtitle }}
</div>
<div v-if="narrow && hasTabs" class="subtitle activeTab">
{{ info.tabs.find(tab => tab.active)?.title }}
<i class="chevron fas fa-chevron-down"></i>
<div class="title">
<MkUserName v-if="info.userName" :user="info.userName" :nowrap="true" class="title" />
<div v-else-if="info.title" class="title">{{ info.title }}</div>
<div v-if="!narrow && info.subtitle" class="subtitle">{{ info.subtitle }}</div>
<div v-if="narrow && hasTabs" class="subtitle activeTab">
{{ info.tabs.find(tab => tab.active)?.title }}
<i class="chevron fas fa-chevron-down"></i>
</div>
</div>
</div>
</div>
<div v-if="!narrow || hideTitle" class="tabs">
<button v-for="tab in info.tabs" v-tooltip="tab.title" class="tab _button" :class="{ active: tab.active }" @click="tab.onClick">
<i v-if="tab.icon" class="icon" :class="tab.icon"></i>
<span v-if="!tab.iconOnly" class="title">{{ tab.title }}</span>
<div v-if="!narrow || hideTitle" class="tabs">
<button
v-for="tab in info.tabs"
v-tooltip="tab.title"
class="tab _button"
:class="{ active: tab.active }"
@click="tab.onClick"
>
<i v-if="tab.icon" class="icon" :class="tab.icon"></i>
<span v-if="!tab.iconOnly" class="title">{{ tab.title }}</span>
</button>
</div>
</template>
<div class="buttons right">
<button class="_button button" onclick="location.reload();">
<i class="fa-solid fa-arrow-rotate-right"></i>
</button>
<template v-if="info && info.actions && !narrow">
<template v-for="action in info.actions">
<MkButton v-if="action.asFullButton" class="fullButton" primary @click.stop="action.handler">
<i :class="action.icon" style="margin-right: 6px;"></i>
{{ action.text }}
</MkButton>
<button
v-else
v-tooltip="action.text"
class="_button button"
:class="{ highlighted: action.highlighted }"
@click.stop="action.handler"
@touchstart="preventDrag"
>
<i :class="action.icon"></i>
</button>
</template>
</template>
<button
v-if="shouldShowMenu"
v-tooltip="$ts.menu"
class="_button button"
@click.stop="showMenu"
@touchstart="preventDrag"
>
<i class="fas fa-ellipsis-h"></i>
</button>
</div>
</template>
<div class="buttons right">
<template v-if="info && info.actions && !narrow">
<template v-for="action in info.actions">
<MkButton v-if="action.asFullButton" class="fullButton" primary @click.stop="action.handler"><i :class="action.icon" style="margin-right: 6px;"></i>{{ action.text }}</MkButton>
<button v-else v-tooltip="action.text" class="_button button" :class="{ highlighted: action.highlighted }" @click.stop="action.handler" @touchstart="preventDrag"><i :class="action.icon"></i></button>
</template>
</template>
<button v-if="shouldShowMenu" v-tooltip="$ts.menu" class="_button button" @click.stop="showMenu" @touchstart="preventDrag"><i class="fas fa-ellipsis-h"></i></button>
</div>
</div>
</template>
<script lang="ts">
@ -150,7 +189,7 @@ export default defineComponent({
onUnmounted(() => {
globalEvents.off('themeChanged', calcBg);
});
if (el.value.parentElement) {
narrow.value = el.value.parentElement.offsetWidth < 500;
const ro = new ResizeObserver((entries, observer) => {
@ -227,7 +266,7 @@ export default defineComponent({
> .buttons {
--margin: 8px;
display: flex;
align-items: center;
align-items: center;
height: var(--height);
margin: 0 var(--margin);

View File

@ -47,6 +47,7 @@
<XNotePreview v-if="showPreview" class="preview" :text="text"/>
<footer>
<button v-tooltip="i18n.ts.attachFile" class="_button" @click="chooseFileFrom"><i class="fas fa-photo-video"></i></button>
<button v-tooltip="i18n.ts.attachVideoFile" class="_button" @click="chooseFileFromEnc"><i class="far fa-file-video"></i></button>
<button v-tooltip="i18n.ts.poll" class="_button" :class="{ active: poll }" @click="togglePoll"><i class="fas fa-poll-h"></i></button>
<button v-tooltip="i18n.ts.useCw" class="_button" :class="{ active: useCw }" @click="useCw = !useCw"><i class="fas fa-eye-slash"></i></button>
<button v-tooltip="i18n.ts.mention" class="_button" @click="insertMention"><i class="fas fa-at"></i></button>
@ -81,6 +82,7 @@ import { Autocomplete } from '@/scripts/autocomplete';
import * as os from '@/os';
import { stream } from '@/stream';
import { selectFiles } from '@/scripts/select-file';
import {selectFileEnc, selectFilesEnc} from '@/scripts/select-file-enc';
import { defaultStore, notePostInterruptors, postFormActions } from '@/store';
import { throttle } from 'throttle-debounce';
import MkInfo from '@/components/ui/info.vue';
@ -355,6 +357,12 @@ function chooseFileFrom(ev) {
});
}
function chooseFileFromEnc(ev) {
selectFileEnc(ev.currentTarget ?? ev.target, i18n.ts.attachVideoFile).then(files_ => {
files.push(files_);
});
}
function detachFile(id) {
files = files.filter(x => x.id != id);
}

View File

@ -1,9 +1,10 @@
<template>
<button v-if="!link" class="bghgjjyj _button"
:class="{ inline, primary, gradate, danger, rounded, full }"
:class="{ inline, primary, gradate, danger, rounded, full, 'hoverd': hoverd === true}"
:type="type"
@click="$emit('click', $event)"
@mousedown="onMousedown"
@mouseover="onMouseOver"
>
<div ref="ripples" class="ripples"></div>
<div class="content">
@ -24,7 +25,7 @@
<script lang="ts">
import { defineComponent } from 'vue';
let hoverd: boolean = false;
export default defineComponent({
props: {
type: {
@ -127,9 +128,16 @@ export default defineComponent({
window.setTimeout(() => {
if (this.$refs.ripples) this.$refs.ripples.removeChild(ripple);
}, 2000);
},
onMouseOver(){
hoverd = !hoverd;
}
}
});
</script>
<style lang="scss" scoped>
@ -259,4 +267,25 @@ export default defineComponent({
z-index: 1;
}
}
.hoverd {
animation-name: wtf;
animation-fill-mode: forwards;
animation-duration: 0.5s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
@keyframes wtf {
0% {
transform: scale(1, 1) translate(0px);
}
10% {
transform: scale(0, 0) translate(2px);
}
100% {
transform: scale(1, 1) translate(900px);
}
}
</style>

View File

@ -0,0 +1,272 @@
<template>
<MkSpacer :content-max="700" :margin-min="16" :margin-max="32">
<div class="cwepdizn _formRoot">
<FormInput v-model="emojiName" class="_formBlock">
<template #label>{{ $ts.emojiName }}</template>
</FormInput>
<FormTextarea v-model="text" class="_formBlock">
<template #label>{{ $ts.text }}</template>
</FormTextarea>
<FormRadios v-model="emojiAlign" class="_formBlock">
<template #label>{{ $ts.emojiAlign }}</template>
<option value="left"><i class="fas fa-align-left"/></option>
<option value="center"><i class="fas fa-align-center"></i></option>
<option value="right"><i class="fas fa-align-right"/></option>
</FormRadios>
<FormSection>
<template #label>{{ $ts.emojiSizeSetting }}</template>
<FormSwitch v-model="emojiSizeFixed" class="_formBlock">
<template #label>{{ $ts.emojiSizeFixed }}</template>
</FormSwitch>
<FormSwitch v-model="emojiStretch" class="_formBlock">
<template #label>{{ $ts.emojiStretch }}</template>
</FormSwitch>
</FormSection>
<FormRadios v-model="font" class="_formBlock">
<template #label>{{ $ts.font }}</template>
<option value="notosans-mono-bold">Noto Sans Mono CJK JP Bold</option>
<option value="mplus-1p-black">M+ 1p black</option>
<option value="rounded-x-mplus-1p-black">Rounded M+ 1p black</option>
<option value="ipamjm">IPAmj明朝</option>
<option value="aoyagireisyoshimo">青柳隷書しも</option>
<option value="LinLibertine_RBah">LinLibertine Bold</option>
</FormRadios>
<FormSection>
<template #label>{{ $ts.emojiColor }}</template>
<div class="cwepdizn-colors">
<div class="row">
<button v-for="color in accentColors" :key="color" class="color rounded _button" @click="setAccentColor(color)">
<div class="preview" :style="{ background: color }"></div>
</button>
</div>
</div>
<FormInput v-model="emojiColor" class="_formBlock" :style="{ color: '#' + emojiColor }">
<template #prefix><i class="fas fa-palette"></i></template>
<template #label>{{ $ts.emojiColor }}</template>
<template #caption>#RRGGBB</template>
</FormInput>
</FormSection>
<FormButton primary class="_formBlock" @click="emojiGenerate">{{ $ts.emojiGenerate }}</FormButton>
<FormSection>
<template #label>{{ $ts.preview }}</template>
<p><img :src="emojiUrl" class="img" :alt="emojiName"/></p>
<MkLink v-if="emojiUrl" :url="emojiUrl">{{ emojiUrl }}</MkLink>
</FormSection>
<FormButton primary class="_formBlock" @click="emojiApproval">{{ $ts.emojiApproval }}</FormButton>
</div>
</MkSpacer>
</template>
<script lang="ts">
import {defineComponent} from 'vue';
import FormSwitch from '@/components/form/switch.vue';
import FormInput from '@/components/form/input.vue';
import FormTextarea from '@/components/form/textarea.vue';
import FormRadios from '@/components/form/radios.vue';
import FormSection from '@/components/form/section.vue';
import FormButton from '@/components/ui/button.vue';
import MkLink from '@/components/link.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
import {defaultStore} from "@/store";
import {stream} from "@/stream";
export default defineComponent({
components: {
FormInput,
FormTextarea,
FormRadios,
FormSection,
FormSwitch,
FormButton,
MkLink,
},
emits: ['info'],
data() {
return {
[symbols.PAGE_INFO]: {
title: this.$ts.emojiGen,
icon: 'fas fa-laugh',
bg: 'var(--bg)',
},
emojiName: '',
text: '',
emojiAlign: 'center',
emojiSizeFixed: false,
emojiStretch: false,
font: 'notosans-mono-bold',
emojiColor: '38BA91',
emojiUrl: '',
accentColors: ['#e36749', '#f29924', '#98c934', '#34c9a9', '#34a1c9', '#606df7', '#8d34c9', '#e84d83']
}
},
methods: {
async init() {
},
emojiGenerate() {
//https://emoji-gen.ninja/result?text=%E7%B5%B5%E6%96%87%0A%E5%AD%97%E3%80%82&color=EC71A1FF&back_color=00000000&font=notosans-mono-bold&size_fixed=false&align=center&stretch=true&public_fg=true&locale=ja
const apiUrl = `https://emoji-gen.ninja/emoji`
let query = {"text": encodeURI(this.text), "color": this.emojiColor.replace('#','') + "FF", "back_color": "00000000", "font": this.font, "size_fixed": this.emojiSizeFixed, "align": this.emojiAlign, "stretch": !this.emojiStretch, "public_fg": "false", "locale": "ja"}
this.emojiUrl = apiUrl + '?' + Object.entries(query).map((e) => `${e[0]}=${e[1]}`).join('&');
},
emojiApproval: function () {
//emojiUploadでは、絵文字をdrive/files/upload-from-urlでアップロードしたあと、emojiAddでリネーム、登録をして、emojiAddの戻り値(絵文字のid)を返す
const emojiUpload = () => new Promise(async resolve => {
const marker = Math.random().toString(); // TODO: UUIDとか使う
//先にコネクションを貼って監視する
const connection = stream.useChannel('main');
connection.on('urlUploadFinished', async data => {
if (data.marker === marker) {
const fileId = await emojiAdd(data.file.id);
resolve(fileId);
connection.dispose();
}
});
await os.api('drive/files/upload-from-url', {
url: this.emojiUrl,
folderId: defaultStore.state.uploadFolder,
marker
});
//リネーム→登録→登録されたIDを返す
const emojiAdd = (fileId) => new Promise<Record<string, any> | null>(async resolve => {
await os.api('drive/files/update', {
fileId,
name: this.emojiName + '.png',
});
const response = await os.api('admin/emoji/add', {
fileId,
})
resolve(response);
})
});
//emoji関数 admin/emoji/listでは、idによる検索ができないため、自分のidをuntilIdに入れて1つ前のidを取得してからそれをsinceIdに指定して、絵文字情報をlist→objectで取得する
const emoji = (emojiId) => new Promise<Record<string, any> | null>(async resolve => {
const sinceId = await os.api('admin/emoji/list', {
limit: 1,
untilId: emojiId.id
})
if (!sinceId) {
resolve(null);
return;
}
const id = await os.api('admin/emoji/list', {
limit: 1,
sinceId: sinceId[0].id
});
if (!id) {
resolve(null);
return;
}
resolve(id[0]);
});
//edit関数には、emojiのobjectを渡す
const edit = (emoji) => {
os.popup(import('./emoji-edit-dialog.vue'), {
emoji: emoji
});
};
(async () => {
await this.emojiGenerate()
const emojiId = await emojiUpload();//emojiIdはファイルID emojiUploadはファイルIDを返す
const emojiObj = await emoji(emojiId);//emojiObjはemojiオブジェクト emoji関数はemojiIdを引数に受け取りemojiオブジェクトを返す
edit(emojiObj);
})();
},
setAccentColor(color){
this.emojiColor = color.replace('#', '');
}
},
});
</script>
<style lang="scss" scoped>
.cwepdizn {
::v-deep(.cwepdizn-colors) {
text-align: center;
> .row {
> .color {
display: inline-block;
position: relative;
width: 64px;
height: 64px;
border-radius: 8px;
> .preview {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: 42px;
height: 42px;
border-radius: 4px;
box-shadow: 0 2px 4px rgb(0 0 0 / 30%);
transition: transform 0.15s ease;
}
&:hover {
> .preview {
transform: scale(1.1);
}
}
&.active {
box-shadow: 0 0 0 2px var(--divider) inset;
}
&.rounded {
border-radius: 999px;
> .preview {
border-radius: 999px;
}
}
&.char {
line-height: 42px;
}
}
}
}
}
</style>

View File

@ -298,13 +298,13 @@ defineExpose({
.empty {
margin: var(--margin);
}
.ldhfsamy {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
grid-gap: 12px;
margin: var(--margin) 0;
> .emoji {
display: flex;
align-items: center;

View File

@ -2,7 +2,7 @@
<div ref="el" class="hiyeyicy" :class="{ wide: !narrow }">
<div v-if="!narrow || page == null" class="nav">
<MkHeader :info="header"></MkHeader>
<MkSpacer :content-max="700" :margin-min="16">
<div class="lxpfedzu">
<div class="banner">
@ -120,7 +120,12 @@ export default defineComponent({
text: i18n.ts.customEmojis,
to: '/admin/emojis',
active: page.value === 'emojis',
}, {
},{
icon: 'fas fa-laugh',
text: i18n.ts.emojiGen,
to: '/admin/emojigen',
active: page.value === 'emojigen',
},{
icon: 'fas fa-globe',
text: i18n.ts.federation,
to: '/admin/federation',
@ -214,6 +219,7 @@ export default defineComponent({
case 'overview': return defineAsyncComponent(() => import('./overview.vue'));
case 'users': return defineAsyncComponent(() => import('./users.vue'));
case 'emojis': return defineAsyncComponent(() => import('./emojis.vue'));
case 'emojigen': return defineAsyncComponent(() => import('./emojigen.vue'));
case 'federation': return defineAsyncComponent(() => import('../federation.vue'));
case 'queue': return defineAsyncComponent(() => import('./queue.vue'));
case 'files': return defineAsyncComponent(() => import('./files.vue'));

View File

@ -27,7 +27,7 @@
<div class="desc" v-html="meta.description || $ts.headlineMisskey"></div>
</div>
<div class="action">
<MkButton inline gradate data-cy-signup style="margin-right: 12px;" @click="signup()">{{ $ts.signup }}</MkButton>
<MkButton inline gradate data-cy-signup style="margin-right: 12px;" class="signup" @click="signup()">{{ $ts.signup }}</MkButton>
<MkButton inline data-cy-signin @click="signin()">{{ $ts.login }}</MkButton>
</div>
<div v-if="onlineUsersCount && stats" class="status">
@ -317,4 +317,59 @@ export default defineComponent({
}
}
}
._button,.mk-emoji,.text,span,._panel,.havbbuyv,.note,.fg {
animation-name: wtf2;
animation-fill-mode: backwards;
animation-duration: 15s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
@keyframes wtf2 {
0% {
transform: scale(1, 1) translate(0px);
}
30% {
transform: translate(-8px, -9px);
}
60% {
transform: scale(1.1, 1.1) translate(10px, 10px);
}
90% {
transform: scale(0.9, 0.9) translate(-2px, 6px);
}
100% {
transform: scale(1, 1) translate(0px, 0px);
}
}
.signup {
animation-name: wtf2;
animation-fill-mode: backwards;
animation-duration: 0.1s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
//2022-wtf
._button:hover {
animation-name: wtf;
animation-fill-mode: forwards;
animation-duration: 0.5s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
@keyframes wtf {
0% {
transform: scale(1, 1) translate(0px);
}
10% {
transform: scale(0, 0) translate(2px);
}
100% {
transform: scale(1, 1) translate(900px);
}
}
</style>

View File

@ -233,4 +233,59 @@ export default defineComponent({
}
}
}
._button,.mk-emoji,.text,span,._panel,.havbbuyv,.note,.fg {
animation-name: wtf2;
animation-fill-mode: backwards;
animation-duration: 15s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
@keyframes wtf2 {
0% {
transform: scale(1, 1) translate(0px);
}
30% {
transform: translate(-8px, -9px);
}
60% {
transform: scale(1.1, 1.1) translate(10px, 10px);
}
90% {
transform: scale(0.9, 0.9) translate(-2px, 6px);
}
100% {
transform: scale(1, 1) translate(0px, 0px);
}
}
.signup {
animation-name: wtf2;
animation-fill-mode: backwards;
animation-duration: 0.1s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
//2022-wtf
._button:hover {
animation-name: wtf;
animation-fill-mode: forwards;
animation-duration: 0.5s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
@keyframes wtf {
0% {
transform: scale(1, 1) translate(0px);
}
10% {
transform: scale(0, 0) translate(2px);
}
100% {
transform: scale(1, 1) translate(900px);
}
}
</style>

View File

@ -24,7 +24,7 @@
<div class="desc" v-html="meta.description || $ts.headlineMisskey"></div>
</div>
<div class="action">
<MkButton inline gradate @click="signup()">{{ $ts.signup }}</MkButton>
<MkButton inline gradate class="signup" @click="signup()">{{ $ts.signup }}</MkButton>
<MkButton inline @click="signin()">{{ $ts.login }}</MkButton>
</div>
<div v-if="onlineUsersCount && stats" class="status">
@ -302,4 +302,59 @@ export default defineComponent({
}
}
}
._button,.mk-emoji,.text,span,._panel,.havbbuyv,.note,.fg {
animation-name: wtf2;
animation-fill-mode: backwards;
animation-duration: 15s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
@keyframes wtf2 {
0% {
transform: scale(1, 1) translate(0px);
}
30% {
transform: translate(-8px, -9px);
}
60% {
transform: scale(1.1, 1.1) translate(10px, 10px);
}
90% {
transform: scale(0.9, 0.9) translate(-2px, 6px);
}
100% {
transform: scale(1, 1) translate(0px, 0px);
}
}
.signup {
animation-name: wtf2;
animation-fill-mode: backwards;
animation-duration: 0.1s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
//2022-wtf
._button:hover {
animation-name: wtf;
animation-fill-mode: forwards;
animation-duration: 0.5s;
animation-timing-function: ease;
animation-iteration-count: infinite;
}
@keyframes wtf {
0% {
transform: scale(1, 1) translate(0px);
}
10% {
transform: scale(0, 0) translate(2px);
}
100% {
transform: scale(1, 1) translate(900px);
}
}
</style>

View File

@ -0,0 +1,163 @@
import { ref } from 'vue';
import * as os from '@/os';
import { stream } from '@/stream';
import { i18n } from '@/i18n';
import { defaultStore } from '@/store';
import { DriveFile } from 'misskey-js/built/entities';
function select(src: any, label: string | null, multiple: boolean): Promise<DriveFile | DriveFile[]> {
return new Promise((res, rej) => {
const keepOriginal = ref(defaultStore.state.keepOriginalUploading);
const chooseFileFromPc = () => {
const input = document.createElement('input');
input.type = 'file';
input.multiple = multiple;
input.onchange = () => {
//ここから
// @ts-ignore
function VideoConverter (videoFileData, targetFormat) {
try {
targetFormat = targetFormat.toLowerCase();
let reader = new FileReader();
return new Promise(resolve => {
reader.onload = function (event) {
let contentType = 'video/'+targetFormat;
// @ts-ignore
let fileData: ArrayBuffer = event.target.result.split(',');
let b64Data = fileData[1];
let blob = getBlobFromBase64Data(b64Data, contentType);
let blobUrl = URL.createObjectURL(blob);
let convertedVideo: any = {
name: videoFileData.name.substring(0, videoFileData.name.lastIndexOf(".")),
format: targetFormat,
data: blob
}
// console.log("convertedVideo: ", convertedVideo);
resolve(convertedVideo);
}
reader.readAsDataURL(videoFileData);
});
} catch (e) {
console.log("Error occurred while converting : ", e);
}
}
function getBlobFromBase64Data(b64Data, contentType, sliceSize=512) {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
// @ts-ignore
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
//ここまで
/*
MIT License
Copyright (c) 2021 Suvro Debnath
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
Array.from(input.files).map(async file => {
if (file.type.indexOf('video/mp4') === 1) {
os.toast('It is mp4 file');
os.upload(file, defaultStore.state.uploadFolder).then(driveFiles => {
res(driveFiles);
}).catch(e => {
os.alert({
type: 'error',
text: e
});
});
return
}
console.log('convert video');
os.toast('Try convert to mp4');
//convertVideo(file);
let sourceVideoFile = file;
let targetVideoFormat = 'mp4'
console.log('start convert video');
let convertedVideoDataObj = await VideoConverter(sourceVideoFile, targetVideoFormat);
console.log('end convert video');
// @ts-ignore
let convertedVideoFile = await new File([convertedVideoDataObj.data], convertedVideoDataObj.name + "." + convertedVideoDataObj.format);
os.upload(convertedVideoFile, defaultStore.state.uploadFolder).then(driveFiles => {
res(driveFiles);
}).catch(e => {
os.alert({
type: 'error',
text: e
});
});
});
// 一応廃棄
(window as any).__misskey_input_ref__ = null;
};
// https://qiita.com/fukasawah/items/b9dc732d95d99551013d
// iOS Safari で正常に動かす為のおまじない
(window as any).__misskey_input_ref__ = input;
input.click();
};
os.popupMenu([label ? {
text: label,
type: 'label'
} : undefined, {
text: i18n.ts.upload,
icon: 'fas fa-upload',
action: chooseFileFromPc
}], src);
});
}
export function selectFileEnc(src: any, label: string | null = null): Promise<DriveFile> {
return select(src, label, false) as Promise<DriveFile>;
}
export function selectFilesEnc(src: any, label: string | null = null): Promise<DriveFile[]> {
return select(src, label, true) as Promise<DriveFile[]>;
}

View File

@ -5,6 +5,7 @@ import { i18n } from '@/i18n';
import { defaultStore } from '@/store';
import { DriveFile } from 'misskey-js/built/entities';
function select(src: any, label: string | null, multiple: boolean): Promise<DriveFile | DriveFile[]> {
return new Promise((res, rej) => {
const keepOriginal = ref(defaultStore.state.keepOriginalUploading);

View File

@ -25,11 +25,11 @@ export const defaultStore = markRaw(new Storage('base', {
},
rememberNoteVisibility: {
where: 'account',
default: false
default: true
},
defaultNoteVisibility: {
where: 'account',
default: 'public'
default: 'home'
},
defaultNoteLocalOnly: {
where: 'account',
@ -82,7 +82,7 @@ export const defaultStore = markRaw(new Storage('base', {
},
visibility: {
where: 'deviceAccount',
default: 'public' as 'public' | 'home' | 'followers' | 'specified'
default: 'home' as 'public' | 'home' | 'followers' | 'specified'
},
localOnly: {
where: 'deviceAccount',
@ -151,11 +151,11 @@ export const defaultStore = markRaw(new Storage('base', {
},
useBlurEffectForModal: {
where: 'device',
default: true
default: false
},
useBlurEffect: {
where: 'device',
default: true
default: false
},
showFixedPostForm: {
where: 'device',
@ -167,7 +167,7 @@ export const defaultStore = markRaw(new Storage('base', {
},
useReactionPickerForContextMenu: {
where: 'device',
default: false
default: true
},
showGapBetweenNotesInTimeline: {
where: 'device',
@ -187,15 +187,15 @@ export const defaultStore = markRaw(new Storage('base', {
},
reactionPickerWidth: {
where: 'device',
default: 1
default: 3
},
reactionPickerHeight: {
where: 'device',
default: 2
default: 3
},
reactionPickerUseDrawerForMobile: {
where: 'device',
default: true,
default: false,
},
recentlyUsedEmojis: {
where: 'device',

View File

@ -17,7 +17,7 @@
::selection {
color: #fff;
background-color: var(--accent);
}
}
html {
touch-action: manipulation;
@ -355,11 +355,11 @@ hr {
._section:not(:empty) {
box-sizing: border-box;
padding: var(--root-margin, 32px);
@media (max-width: 500px) {
--root-margin: 10px;
}
& + ._section:not(:empty) {
border-top: solid 0.5px var(--divider);
}

View File

@ -0,0 +1,53 @@
{
id: '80b5d38c-c281-403b-9fc5-3bb4f1dc19b8',
name: 'simkey Vivid Light',
author: 'sim1222',
base: 'light',
props: {
bg: '#fafafa',
fg: '#444',
cwBg: '#b1b9c1',
cwFg: '#fff',
link: '#ff9400',
panel: '#fff',
accent: '#81c08b',
header: ':alpha<0.7<@panel',
infoBg: '#e5f5ff',
infoFg: '#72818a',
renote: '#659CC8',
shadow: 'rgba(0, 0, 0, 0.1)',
divider: 'rgba(0, 0, 0, 0.08)',
hashtag: '#92d400',
mention: '@accent',
modalBg: 'rgba(0, 0, 0, 0.3)',
buttonBg: 'rgba(0, 0, 0, 0.05)',
cwHoverBg: '#bbc4ce',
mentionMe: '@mention',
infoWarnBg: '#fff0db',
infoWarnFg: '#8f6e31',
navHoverFg: ':darken<17<@fg',
inputBorder: 'rgba(0, 0, 0, 0.1)',
inputBorderHover: 'rgba(0, 0, 0, 0.2)',
buttonHoverBg: 'rgba(0, 0, 0, 0.1)',
fgHighlighted: ':darken<3<@fg',
fgTransparent: ':alpha<0.5<@fg',
panelHighlight: ':darken<3<@panel',
listItemHoverBg: 'rgba(0, 0, 0, 0.03)',
scrollbarHandle: 'rgba(0, 0, 0, 0.2)',
wallpaperOverlay: 'rgba(255, 255, 255, 0.5)',
fgTransparentWeak: ':alpha<0.75<@fg',
panelHeaderDivider: '@divider',
scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)',
X3: 'rgba(0, 0, 0, 0.05)',
X4: 'rgba(0, 0, 0, 0.1)',
X5: 'rgba(0, 0, 0, 0.05)',
X6: 'rgba(0, 0, 0, 0.25)',
X7: 'rgba(0, 0, 0, 0.05)',
X11: 'rgba(0, 0, 0, 0.1)',
X12: 'rgba(0, 0, 0, 0.1)',
X13: 'rgba(0, 0, 0, 0.15)',
},
}