Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
b587fefe44 | |||
2511114c28 | |||
9cd267fee5 | |||
aeac96a4f7 | |||
88a75e2a99 | |||
e14760775b | |||
9e7e464ba5 | |||
060d4fd27f | |||
940578d062 | |||
9cf42d8b33 | |||
1d62d2924e | |||
e23bac47ba | |||
b5d38adfcc | |||
f30513b20b |
@ -1,6 +1,15 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
12.7.0 (2020/02/10)
|
||||||
|
--------------------
|
||||||
|
### ✨Improvements
|
||||||
|
* ノートの文字数制限の設定を復活
|
||||||
|
* デザインの調整
|
||||||
|
|
||||||
|
### 🐛Fixes
|
||||||
|
* 中国語で表示できない問題を修正
|
||||||
|
|
||||||
12.6.0 (2020/02/10)
|
12.6.0 (2020/02/10)
|
||||||
--------------------
|
--------------------
|
||||||
### ✨Improvements
|
### ✨Improvements
|
||||||
|
@ -25,7 +25,7 @@ const languages = [
|
|||||||
'ko-KR',
|
'ko-KR',
|
||||||
//'nl-NL',
|
//'nl-NL',
|
||||||
//'pl-PL',
|
//'pl-PL',
|
||||||
//'zh-CN',
|
'zh-CN',
|
||||||
//'zh-TW',
|
//'zh-TW',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -376,6 +376,7 @@ next: "次"
|
|||||||
retype: "再入力"
|
retype: "再入力"
|
||||||
noteOf: "{user}のノート"
|
noteOf: "{user}のノート"
|
||||||
inviteToGroup: "グループに招待"
|
inviteToGroup: "グループに招待"
|
||||||
|
maxNoteTextLength: "ノートの文字数制限"
|
||||||
|
|
||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Misskeyの使い方"
|
title: "Misskeyの使い方"
|
||||||
|
@ -65,8 +65,14 @@ import: "导入"
|
|||||||
export: "导出"
|
export: "导出"
|
||||||
files: "文件"
|
files: "文件"
|
||||||
download: "下载"
|
download: "下载"
|
||||||
|
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会消失。"
|
||||||
|
unfollowConfirm: "要取消对{name}的关注吗?"
|
||||||
|
exportRequested: "导出请求已提交。可能需要花一些时间。导出的文件将保存到网盘中。"
|
||||||
|
importRequested: "导入请求已提交。这可能需要花一点时间。"
|
||||||
lists: "列表"
|
lists: "列表"
|
||||||
noLists: "列表为空"
|
noLists: "列表为空"
|
||||||
|
note: "帖子"
|
||||||
|
notes: "帖子"
|
||||||
following: "关注中"
|
following: "关注中"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
followsYou: "关注了你"
|
followsYou: "关注了你"
|
||||||
@ -87,15 +93,18 @@ enterEmoji: "输入Emoji"
|
|||||||
renote: "转发"
|
renote: "转发"
|
||||||
unrenote: "取消转发"
|
unrenote: "取消转发"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
|
pinnedNote: "已置顶的帖子"
|
||||||
you: "您"
|
you: "您"
|
||||||
clickToShow: "点击以显示"
|
clickToShow: "点击以显示"
|
||||||
sensitive: "阅读注意"
|
sensitive: "阅读注意"
|
||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "反应"
|
reaction: "反应"
|
||||||
reactionSettingDescription: "快速选择回应中的自定义表情符号,以换行符分隔。"
|
reactionSettingDescription: "快速选择回应中的自定义表情符号,以换行符分隔。"
|
||||||
|
rememberNoteVisibility: "记录公开范围"
|
||||||
renameFile: "重命名文件"
|
renameFile: "重命名文件"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "阅读注意"
|
markAsSensitive: "阅读注意"
|
||||||
|
unmarkAsSensitive: "取消标记为敏感内容"
|
||||||
enterFileName: "请输入文件名"
|
enterFileName: "请输入文件名"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
unmute: "解除屏蔽"
|
unmute: "解除屏蔽"
|
||||||
@ -113,14 +122,20 @@ emojiName: "Emoji 名称"
|
|||||||
emojiUrl: "emoji 地址"
|
emojiUrl: "emoji 地址"
|
||||||
addEmoji: "添加Emoji"
|
addEmoji: "添加Emoji"
|
||||||
cacheRemoteFiles: "远程文件缓存"
|
cacheRemoteFiles: "远程文件缓存"
|
||||||
|
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||||
flagAsBot: "这个账户是Bot"
|
flagAsBot: "这个账户是Bot"
|
||||||
flagAsCat: "这个账户是Cat"
|
flagAsCat: "这个账户是Cat"
|
||||||
|
autoAcceptFollowed: "自动允许关注"
|
||||||
addAcount: "添加账户"
|
addAcount: "添加账户"
|
||||||
loginFailed: "登录失败"
|
loginFailed: "登录失败"
|
||||||
|
showOnRemote: "转到所在实例显示"
|
||||||
general: "常规设置"
|
general: "常规设置"
|
||||||
wallpaper: "壁纸"
|
wallpaper: "壁纸"
|
||||||
removeWallpaper: "移除壁纸"
|
removeWallpaper: "移除壁纸"
|
||||||
searchWith: "搜索:{q}"
|
searchWith: "搜索:{q}"
|
||||||
|
youHaveNoLists: "列表为空"
|
||||||
|
followConfirm: "你确定要关注{name}吗?"
|
||||||
|
proxyAccount: "代理账户"
|
||||||
host: "主机名"
|
host: "主机名"
|
||||||
selectUser: "选择用户"
|
selectUser: "选择用户"
|
||||||
recipient: "收件人"
|
recipient: "收件人"
|
||||||
@ -130,36 +145,51 @@ instances: "实例"
|
|||||||
latestRequestSentAt: "上次发送的请求"
|
latestRequestSentAt: "上次发送的请求"
|
||||||
latestRequestReceivedAt: "上次收到的请求"
|
latestRequestReceivedAt: "上次收到的请求"
|
||||||
storageUsage: "已用存储"
|
storageUsage: "已用存储"
|
||||||
|
charts: "图表"
|
||||||
perHour: "每小时"
|
perHour: "每小时"
|
||||||
perDay: "每天"
|
perDay: "每天"
|
||||||
operations: "操作"
|
operations: "操作"
|
||||||
software: "软件"
|
software: "软件"
|
||||||
version: "版本"
|
version: "版本"
|
||||||
metadata: "元数据"
|
metadata: "元数据"
|
||||||
|
withNFiles: "{n}个文件"
|
||||||
monitor: "监视器"
|
monitor: "监视器"
|
||||||
jobQueue: "作业队列"
|
jobQueue: "作业队列"
|
||||||
cpuAndMemory: "CPU使用量"
|
cpuAndMemory: "CPU使用量"
|
||||||
network: "网络"
|
network: "网络"
|
||||||
disk: "存储"
|
disk: "存储"
|
||||||
|
instanceInfo: "实例情报"
|
||||||
statistics: "统计"
|
statistics: "统计"
|
||||||
clearQueue: "清除队列"
|
clearQueue: "清除队列"
|
||||||
|
clearQueueConfirmTitle: "确定清除队列?"
|
||||||
clearCachedFiles: "清除缓存"
|
clearCachedFiles: "清除缓存"
|
||||||
|
clearCachedFilesConfirm: "确定要清除缓存文件?"
|
||||||
|
blockedInstances: "被阻拦的实例"
|
||||||
|
blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。"
|
||||||
muteAndBlock: "屏蔽/拉黑"
|
muteAndBlock: "屏蔽/拉黑"
|
||||||
mutedUsers: "禁言用户"
|
mutedUsers: "禁言用户"
|
||||||
blockedUsers: "已屏蔽用户"
|
blockedUsers: "已屏蔽用户"
|
||||||
noUsers: "无用户"
|
noUsers: "无用户"
|
||||||
editProfile: "编辑资料"
|
editProfile: "编辑资料"
|
||||||
|
noteDeleteConfirm: "要删除该帖子吗?"
|
||||||
|
pinLimitExceeded: "无法置顶更多了"
|
||||||
|
intro: "Misskey的部署结束啦!填写管理员账号吧!"
|
||||||
done: "完成"
|
done: "完成"
|
||||||
processing: "处理中"
|
processing: "处理中"
|
||||||
preview: "预览"
|
preview: "预览"
|
||||||
noCustomEmojis: "无自定义Emoji"
|
noCustomEmojis: "无自定义Emoji"
|
||||||
|
customEmojisOfRemote: "远程Emoji"
|
||||||
|
noJobs: "没有任务"
|
||||||
federating: "联合中"
|
federating: "联合中"
|
||||||
blocked: "已拦截"
|
blocked: "已拦截"
|
||||||
|
suspended: "停止推流"
|
||||||
all: "全部"
|
all: "全部"
|
||||||
subscribing: "已订阅"
|
subscribing: "已订阅"
|
||||||
|
publishing: "直播中"
|
||||||
notResponding: "没有响应"
|
notResponding: "没有响应"
|
||||||
instanceFollowing: "关注实例"
|
instanceFollowing: "关注实例"
|
||||||
instanceFollowers: "关注实例"
|
instanceFollowers: "关注实例"
|
||||||
|
instanceUsers: "实例用户"
|
||||||
changePassword: "修改密码"
|
changePassword: "修改密码"
|
||||||
security: "安全性"
|
security: "安全性"
|
||||||
retypedNotMatch: "两次输入不一致!"
|
retypedNotMatch: "两次输入不一致!"
|
||||||
@ -169,22 +199,31 @@ newPasswordRetype: "重新输入密码:"
|
|||||||
attachFile: "插入附件"
|
attachFile: "插入附件"
|
||||||
more: "更多!"
|
more: "更多!"
|
||||||
featured: "高亮"
|
featured: "高亮"
|
||||||
|
usernameOrUserId: "用户名或用户ID"
|
||||||
|
noSuchUser: "用户不存在"
|
||||||
lookup: "查询"
|
lookup: "查询"
|
||||||
|
announcements: "公告"
|
||||||
imageUrl: "图片URL"
|
imageUrl: "图片URL"
|
||||||
remove: "删除"
|
remove: "删除"
|
||||||
removed: "已删除"
|
removed: "已删除"
|
||||||
removeAreYouSure: "要删掉「{x}」吗?"
|
removeAreYouSure: "要删掉「{x}」吗?"
|
||||||
saved: "已保存"
|
saved: "已保存"
|
||||||
|
messaging: "聊天"
|
||||||
upload: "上传"
|
upload: "上传"
|
||||||
|
fromDrive: "从网盘中"
|
||||||
fromUrl: "从 URL"
|
fromUrl: "从 URL"
|
||||||
explore: "发现"
|
explore: "发现"
|
||||||
games: "Misskey游戏"
|
games: "Misskey游戏"
|
||||||
messageRead: "已读"
|
messageRead: "已读"
|
||||||
recentUsedEmojis: "最近使用的Emoji表情"
|
recentUsedEmojis: "最近使用的Emoji表情"
|
||||||
noMoreHistory: "没有更多的历史记录"
|
noMoreHistory: "没有更多的历史记录"
|
||||||
|
startMessaging: "开始聊天"
|
||||||
|
nUsersRead: "{n}人已读"
|
||||||
|
agreeTo: "{0}人同意"
|
||||||
tos: "服务条款"
|
tos: "服务条款"
|
||||||
start: "开始"
|
start: "开始"
|
||||||
home: "首页"
|
home: "首页"
|
||||||
|
remoteUserCaution: "由于是远程用户,信息不完整。"
|
||||||
activity: "活动"
|
activity: "活动"
|
||||||
images: "图片"
|
images: "图片"
|
||||||
birthday: "生日"
|
birthday: "生日"
|
||||||
@ -229,6 +268,7 @@ connectSerice: "已连接"
|
|||||||
disconnectSerice: "断开连接"
|
disconnectSerice: "断开连接"
|
||||||
enableLocalTimeline: "启用本地时间线功能"
|
enableLocalTimeline: "启用本地时间线功能"
|
||||||
enableGlobalTimeline: "启用全局时间线"
|
enableGlobalTimeline: "启用全局时间线"
|
||||||
|
disablingTimelinesInfo: "即使时间线功能被禁用,出于便利性的原因,管理员和数据图表也可以继续使用。"
|
||||||
registration: "注册"
|
registration: "注册"
|
||||||
enableRegistration: "允许新用户注册"
|
enableRegistration: "允许新用户注册"
|
||||||
invite: "邀请"
|
invite: "邀请"
|
||||||
@ -241,11 +281,13 @@ iconUrl: "图标URL"
|
|||||||
bannerUrl: "Banner URL"
|
bannerUrl: "Banner URL"
|
||||||
basicInfo: "基本信息"
|
basicInfo: "基本信息"
|
||||||
pinnedUsers: "置顶用户"
|
pinnedUsers: "置顶用户"
|
||||||
|
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
|
enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
|
||||||
recaptchaSiteKey: "网站密钥"
|
recaptchaSiteKey: "网站密钥"
|
||||||
recaptchaSecretKey: "reCAPTCHA 密钥"
|
recaptchaSecretKey: "reCAPTCHA 密钥"
|
||||||
name: "名称"
|
name: "名称"
|
||||||
|
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
||||||
serviceworker: "ServiceWorker"
|
serviceworker: "ServiceWorker"
|
||||||
enableServiceworker: "启用ServiceWorker"
|
enableServiceworker: "启用ServiceWorker"
|
||||||
caseSensitive: "区分大小写"
|
caseSensitive: "区分大小写"
|
||||||
@ -302,6 +344,14 @@ invites: "邀请"
|
|||||||
groupName: "群组名"
|
groupName: "群组名"
|
||||||
members: "成员"
|
members: "成员"
|
||||||
transfer: "转让"
|
transfer: "转让"
|
||||||
|
enable: "启用"
|
||||||
|
next: "下一个"
|
||||||
|
retype: "重新输入"
|
||||||
|
noteOf: "{user}的帖子"
|
||||||
|
inviteToGroup: "群组邀请"
|
||||||
|
_tutorial:
|
||||||
|
title: "Misskey的使用方法"
|
||||||
|
step1_1: "欢迎!"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此设备已被注册"
|
alreadyRegistered: "此设备已被注册"
|
||||||
registerDevice: "注册设备"
|
registerDevice: "注册设备"
|
||||||
@ -384,7 +434,12 @@ _visibility:
|
|||||||
_profile:
|
_profile:
|
||||||
name: "名称"
|
name: "名称"
|
||||||
username: "用户名"
|
username: "用户名"
|
||||||
|
description: "个人简介"
|
||||||
|
metadata: "额外信息"
|
||||||
|
metadataLabel: "标签"
|
||||||
|
metadataContent: "内容"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
|
allNotes: "所有帖子"
|
||||||
followingList: "关注中"
|
followingList: "关注中"
|
||||||
muteList: "屏蔽"
|
muteList: "屏蔽"
|
||||||
blockingList: "屏蔽"
|
blockingList: "屏蔽"
|
||||||
@ -447,9 +502,13 @@ _pages:
|
|||||||
blocks:
|
blocks:
|
||||||
text: "文本"
|
text: "文本"
|
||||||
image: "图片"
|
image: "图片"
|
||||||
|
if: "如果"
|
||||||
_if:
|
_if:
|
||||||
variable: "变量"
|
variable: "变量"
|
||||||
post: "投稿窗口"
|
post: "投稿窗口"
|
||||||
|
_post:
|
||||||
|
text: "内容"
|
||||||
|
textInput: "文本输入"
|
||||||
_textInput:
|
_textInput:
|
||||||
name: "变量名"
|
name: "变量名"
|
||||||
text: "标题"
|
text: "标题"
|
||||||
@ -482,12 +541,30 @@ _pages:
|
|||||||
dialog: "显示对话框"
|
dialog: "显示对话框"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "内容"
|
content: "内容"
|
||||||
|
resetRandom: "重置随机值"
|
||||||
|
pushEvent: "发送事件"
|
||||||
|
_pushEvent:
|
||||||
|
event: "事件名称"
|
||||||
|
message: "按下时显示的消息"
|
||||||
|
variable: "发送的变量"
|
||||||
|
no-variable: "空"
|
||||||
|
radioButton: "选择项"
|
||||||
_radioButton:
|
_radioButton:
|
||||||
name: "变量名"
|
name: "变量名"
|
||||||
title: "标题"
|
title: "标题"
|
||||||
|
values: "使用换行区分的选择项"
|
||||||
default: "默认值"
|
default: "默认值"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
|
flow: "控制"
|
||||||
|
logical: "逻辑运算"
|
||||||
|
operation: "计算"
|
||||||
|
comparison: "比较"
|
||||||
|
random: "随机"
|
||||||
|
value: "值"
|
||||||
|
fn: "函数"
|
||||||
|
text: "文本操作"
|
||||||
|
convert: "转换"
|
||||||
list: "列表"
|
list: "列表"
|
||||||
blocks:
|
blocks:
|
||||||
text: "文本"
|
text: "文本"
|
||||||
@ -638,12 +715,14 @@ _pages:
|
|||||||
_for:
|
_for:
|
||||||
arg1: "次数"
|
arg1: "次数"
|
||||||
arg2: "处理"
|
arg2: "处理"
|
||||||
|
thereIsEmptySlot: "槽函数{slot}为空!"
|
||||||
types:
|
types:
|
||||||
string: "文字"
|
string: "文字"
|
||||||
number: "数值"
|
number: "数值"
|
||||||
boolean: "Flag"
|
boolean: "Flag"
|
||||||
array: "列表"
|
array: "列表"
|
||||||
stringArray: "文本列表"
|
stringArray: "文本列表"
|
||||||
|
emptySlot: "空白槽函数"
|
||||||
enviromentVariables: "环境变量"
|
enviromentVariables: "环境变量"
|
||||||
pageVariables: "页面元素"
|
pageVariables: "页面元素"
|
||||||
argVariables: "输入变量"
|
argVariables: "输入变量"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.6.0",
|
"version": "12.7.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -838,7 +838,8 @@ export default Vue.extend({
|
|||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
|
|
||||||
> .divider {
|
> .divider {
|
||||||
margin: 8px 0;
|
margin: 8px auto;
|
||||||
|
width: calc(100% - 32px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ export default Vue.extend({
|
|||||||
this.setPosition();
|
this.setPosition();
|
||||||
|
|
||||||
//#region Construct Emoji DB
|
//#region Construct Emoji DB
|
||||||
const customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
|
const customEmojis = this.$store.state.instance.meta.emojis;
|
||||||
const emojiDefinitions: EmojiDef[] = [];
|
const emojiDefinitions: EmojiDef[] = [];
|
||||||
|
|
||||||
for (const x of customEmojis) {
|
for (const x of customEmojis) {
|
||||||
|
@ -140,7 +140,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
let local = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
|
let local = this.$store.state.instance.meta.emojis;
|
||||||
local = groupByX(local, (x: any) => x.category || '');
|
local = groupByX(local, (x: any) => x.category || '');
|
||||||
this.customEmojis = local;
|
this.customEmojis = local;
|
||||||
},
|
},
|
||||||
|
@ -55,38 +55,35 @@ export default Vue.extend({
|
|||||||
|
|
||||||
useOsDefaultEmojis(): boolean {
|
useOsDefaultEmojis(): boolean {
|
||||||
return this.$store.state.device.useOsDefaultEmojis && !this.isReaction;
|
return this.$store.state.device.useOsDefaultEmojis && !this.isReaction;
|
||||||
|
},
|
||||||
|
|
||||||
|
ce() {
|
||||||
|
let ce = [];
|
||||||
|
if (this.customEmojis) ce = ce.concat(this.customEmojis);
|
||||||
|
if (this.$store.state.instance.meta && this.$store.state.instance.meta.emojis) ce = ce.concat(this.$store.state.instance.meta.emojis);
|
||||||
|
return ce;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
customEmojis() {
|
ce: {
|
||||||
if (this.name) {
|
handler() {
|
||||||
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
if (this.name) {
|
||||||
if (customEmoji) {
|
const customEmoji = this.ce.find(x => x.name == this.name);
|
||||||
this.customEmoji = customEmoji;
|
if (customEmoji) {
|
||||||
this.url = this.$store.state.device.disableShowingAnimatedImages
|
this.customEmoji = customEmoji;
|
||||||
? getStaticImageUrl(customEmoji.url)
|
this.url = this.$store.state.device.disableShowingAnimatedImages
|
||||||
: customEmoji.url;
|
? getStaticImageUrl(customEmoji.url)
|
||||||
|
: customEmoji.url;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
immediate: true
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
if (this.name) {
|
if (!this.name) {
|
||||||
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
|
||||||
if (customEmoji) {
|
|
||||||
this.customEmoji = customEmoji;
|
|
||||||
this.url = this.$store.state.device.disableShowingAnimatedImages
|
|
||||||
? getStaticImageUrl(customEmoji.url)
|
|
||||||
: customEmoji.url;
|
|
||||||
} else {
|
|
||||||
//const emoji = lib[this.name];
|
|
||||||
//if (emoji) {
|
|
||||||
// this.char = emoji.char;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.char = this.emoji;
|
this.char = this.emoji;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<component :is="hasRoute ? 'router-link' : 'a'" class="xlcxczvw _link" :[attr]="hasRoute ? url.substr(local.length) : url" :rel="rel" :target="target"
|
<component :is="self ? 'router-link' : 'a'" class="xlcxczvw _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
|
||||||
@mouseover="onMouseover"
|
@mouseover="onMouseover"
|
||||||
@mouseleave="onMouseleave"
|
@mouseleave="onMouseleave"
|
||||||
:title="url"
|
:title="url"
|
||||||
@ -27,18 +27,12 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const isSelf = this.url.startsWith(local);
|
const self = this.url.startsWith(local);
|
||||||
const hasRoute = isSelf && (
|
|
||||||
(this.url.substr(local.length) === '/') ||
|
|
||||||
this.url.substr(local.length).startsWith('/@') ||
|
|
||||||
this.url.substr(local.length).startsWith('/notes/') ||
|
|
||||||
this.url.substr(local.length).startsWith('/tags/'));
|
|
||||||
return {
|
return {
|
||||||
local,
|
local,
|
||||||
self: isSelf,
|
self: self,
|
||||||
hasRoute: hasRoute,
|
attr: self ? 'to' : 'href',
|
||||||
attr: hasRoute ? 'to' : 'href',
|
target: self ? null : '_blank',
|
||||||
target: hasRoute ? null : '_blank',
|
|
||||||
showTimer: null,
|
showTimer: null,
|
||||||
hideTimer: null,
|
hideTimer: null,
|
||||||
preview: null,
|
preview: null,
|
||||||
|
@ -1,30 +1,47 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="yxspomdl">
|
<div class="yxspomdl">
|
||||||
<fa :icon="faSpinner" pulse fixed-width class="icon"/>
|
<div class="ring"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { faSpinner } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
faSpinner
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@keyframes ring {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.yxspomdl {
|
.yxspomdl {
|
||||||
padding: 32px;
|
padding: 32px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
> .icon {
|
> .ring {
|
||||||
font-size: 32px;
|
display: inline-block;
|
||||||
opacity: 0.5;
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .ring:after {
|
||||||
|
content: " ";
|
||||||
|
display: block;
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
margin: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: solid 6px;
|
||||||
|
border-color: var(--fg) transparent transparent transparent;
|
||||||
|
animation: ring 0.5s linear infinite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -234,7 +234,6 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'emoji': {
|
case 'emoji': {
|
||||||
const customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
|
|
||||||
return [createElement('mk-emoji', {
|
return [createElement('mk-emoji', {
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
attrs: {
|
attrs: {
|
||||||
@ -242,7 +241,7 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
name: token.node.props.name
|
name: token.node.props.name
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
customEmojis: this.customEmojis || customEmojis,
|
customEmojis: this.customEmojis,
|
||||||
normal: this.plain
|
normal: this.plain
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<button class="cancel _button" @click="cancel"><fa :icon="faTimes"/></button>
|
<button class="cancel _button" @click="cancel"><fa :icon="faTimes"/></button>
|
||||||
<div>
|
<div>
|
||||||
<span class="text-count" :class="{ over: trimmedLength(text) > 500 }">{{ 500 - trimmedLength(text) }}</span>
|
<span class="text-count" :class="{ over: trimmedLength(text) > max }">{{ max - trimmedLength(text) }}</span>
|
||||||
<button class="_button visibility" @click="setVisibility" ref="visibilityButton">
|
<button class="_button visibility" @click="setVisibility" ref="visibilityButton">
|
||||||
<span v-if="visibility === 'public'"><fa :icon="faGlobe"/></span>
|
<span v-if="visibility === 'public'"><fa :icon="faGlobe"/></span>
|
||||||
<span v-if="visibility === 'home'"><fa :icon="faHome"/></span>
|
<span v-if="visibility === 'home'"><fa :icon="faHome"/></span>
|
||||||
@ -172,8 +172,12 @@ export default Vue.extend({
|
|||||||
canPost(): boolean {
|
canPost(): boolean {
|
||||||
return !this.posting &&
|
return !this.posting &&
|
||||||
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
|
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
|
||||||
(length(this.text.trim()) <= 500) &&
|
(length(this.text.trim()) <= this.max) &&
|
||||||
(!this.poll || this.pollChoices.length >= 2);
|
(!this.poll || this.pollChoices.length >= 2);
|
||||||
|
},
|
||||||
|
|
||||||
|
max(): number {
|
||||||
|
return this.$store.state.instance.meta ? this.$store.state.instance.meta.maxNoteTextLength : 1000;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-emoji :emoji="reaction.startsWith(':') ? null : reaction" :name="reaction.startsWith(':') ? reaction.substr(1, reaction.length - 2) : null" :is-reaction="true" :custom-emojis="customEmojis" :normal="true" :no-style="noStyle"/>
|
<mk-emoji :emoji="reaction.startsWith(':') ? null : reaction" :name="reaction.startsWith(':') ? reaction.substr(1, reaction.length - 2) : null" :is-reaction="true" :normal="true" :no-style="noStyle"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -18,15 +18,5 @@ export default Vue.extend({
|
|||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
customEmojis: []
|
|
||||||
};
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
if (meta && meta.emojis) this.customEmojis = meta.emojis;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -82,7 +82,6 @@ export default Vue.extend({
|
|||||||
token: '',
|
token: '',
|
||||||
apiUrl,
|
apiUrl,
|
||||||
host: toUnicode(host),
|
host: toUnicode(host),
|
||||||
meta: null,
|
|
||||||
totpLogin: false,
|
totpLogin: false,
|
||||||
credential: null,
|
credential: null,
|
||||||
challengeData: null,
|
challengeData: null,
|
||||||
@ -91,11 +90,13 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
computed: {
|
||||||
this.$root.getMeta().then(meta => {
|
meta() {
|
||||||
this.meta = meta;
|
return this.$store.state.instance.meta;
|
||||||
});
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
if (this.autoSet) {
|
if (this.autoSet) {
|
||||||
this.$once('login', res => {
|
this.$once('login', res => {
|
||||||
localStorage.setItem('i', res.i);
|
localStorage.setItem('i', res.i);
|
||||||
|
@ -79,7 +79,6 @@ export default Vue.extend({
|
|||||||
usernameState: null,
|
usernameState: null,
|
||||||
passwordStrength: '',
|
passwordStrength: '',
|
||||||
passwordRetypeState: null,
|
passwordRetypeState: null,
|
||||||
meta: {},
|
|
||||||
submitting: false,
|
submitting: false,
|
||||||
ToSAgreement: false,
|
ToSAgreement: false,
|
||||||
faLock, faExclamationTriangle, faSpinner, faCheck
|
faLock, faExclamationTriangle, faSpinner, faCheck
|
||||||
@ -87,6 +86,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
|
meta() {
|
||||||
|
return this.$store.state.instance.meta;
|
||||||
|
},
|
||||||
|
|
||||||
shouldShowProfileUrl(): boolean {
|
shouldShowProfileUrl(): boolean {
|
||||||
return (this.username != '' &&
|
return (this.username != '' &&
|
||||||
this.usernameState != 'invalid-format' &&
|
this.usernameState != 'invalid-format' &&
|
||||||
@ -95,12 +98,6 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
this.meta = meta;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
const head = document.getElementsByTagName('head')[0];
|
const head = document.getElementsByTagName('head')[0];
|
||||||
const script = document.createElement('script');
|
const script = document.createElement('script');
|
||||||
|
@ -124,6 +124,7 @@ export default Vue.extend({
|
|||||||
&.primary {
|
&.primary {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
|
box-shadow: 0 6px 16px var(--accentShadow);
|
||||||
|
|
||||||
&:not(:disabled):hover {
|
&:not(:disabled):hover {
|
||||||
background: var(--jkhztclx);
|
background: var(--jkhztclx);
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else class="mk-url-preview" v-size="[{ max: 400 }, { max: 350 }]">
|
<div v-else class="mk-url-preview" v-size="[{ max: 400 }, { max: 350 }]">
|
||||||
<transition name="zoom" mode="out-in">
|
<transition name="zoom" mode="out-in">
|
||||||
<component :is="hasRoute ? 'router-link' : 'a'" :class="{ compact }" :[attr]="hasRoute ? url.substr(local.length) : url" rel="nofollow noopener" :target="target" :title="url" v-if="!fetching">
|
<component :is="self ? 'router-link' : 'a'" :class="{ compact }" :[attr]="self ? url.substr(local.length) : url" rel="nofollow noopener" :target="target" :title="url" v-if="!fetching">
|
||||||
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`">
|
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`">
|
||||||
<button class="_button" v-if="!playerEnabled && player.url" @click.prevent="playerEnabled = true" :title="$t('enable-player')"><fa :icon="faPlayCircle"/></button>
|
<button class="_button" v-if="!playerEnabled && player.url" @click.prevent="playerEnabled = true" :title="$t('enable-player')"><fa :icon="faPlayCircle"/></button>
|
||||||
</div>
|
</div>
|
||||||
@ -58,12 +58,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
const isSelf = this.url.startsWith(local);
|
const self = this.url.startsWith(local);
|
||||||
const hasRoute =
|
|
||||||
(this.url.substr(local.length) === '/') ||
|
|
||||||
this.url.substr(local.length).startsWith('/@') ||
|
|
||||||
this.url.substr(local.length).startsWith('/notes/') ||
|
|
||||||
this.url.substr(local.length).startsWith('/tags/');
|
|
||||||
return {
|
return {
|
||||||
local,
|
local,
|
||||||
fetching: true,
|
fetching: true,
|
||||||
@ -79,10 +74,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
tweetUrl: null,
|
tweetUrl: null,
|
||||||
playerEnabled: false,
|
playerEnabled: false,
|
||||||
self: isSelf,
|
self: self,
|
||||||
hasRoute: hasRoute,
|
attr: self ? 'to' : 'href',
|
||||||
attr: hasRoute ? 'to' : 'href',
|
target: self ? null : '_blank',
|
||||||
target: hasRoute ? null : '_blank',
|
|
||||||
faPlayCircle
|
faPlayCircle
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<component :is="hasRoute ? 'router-link' : 'a'" class="ieqqeuvs _link" :[attr]="hasRoute ? url.substr(local.length) : url" :rel="rel" :target="target"
|
<component :is="self ? 'router-link' : 'a'" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
|
||||||
@mouseover="onMouseover"
|
@mouseover="onMouseover"
|
||||||
@mouseleave="onMouseleave"
|
@mouseleave="onMouseleave"
|
||||||
>
|
>
|
||||||
@ -37,12 +37,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const isSelf = this.url.startsWith(local);
|
const self = this.url.startsWith(local);
|
||||||
const hasRoute = isSelf && (
|
|
||||||
(this.url.substr(local.length) === '/') ||
|
|
||||||
this.url.substr(local.length).startsWith('/@') ||
|
|
||||||
this.url.substr(local.length).startsWith('/notes/') ||
|
|
||||||
this.url.substr(local.length).startsWith('/tags/'));
|
|
||||||
return {
|
return {
|
||||||
local,
|
local,
|
||||||
schema: null as string | null,
|
schema: null as string | null,
|
||||||
@ -51,10 +46,9 @@ export default Vue.extend({
|
|||||||
pathname: null as string | null,
|
pathname: null as string | null,
|
||||||
query: null as string | null,
|
query: null as string | null,
|
||||||
hash: null as string | null,
|
hash: null as string | null,
|
||||||
self: isSelf,
|
self: self,
|
||||||
hasRoute: hasRoute,
|
attr: self ? 'to' : 'href',
|
||||||
attr: hasRoute ? 'to' : 'href',
|
target: self ? null : '_blank',
|
||||||
target: hasRoute ? null : '_blank',
|
|
||||||
showTimer: null,
|
showTimer: null,
|
||||||
hideTimer: null,
|
hideTimer: null,
|
||||||
preview: null,
|
preview: null,
|
||||||
|
@ -157,8 +157,6 @@ os.init(async () => {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
api: os.api,
|
api: os.api,
|
||||||
getMeta: os.getMeta,
|
|
||||||
getMetaSync: os.getMetaSync,
|
|
||||||
signout: os.signout,
|
signout: os.signout,
|
||||||
new(vm, props) {
|
new(vm, props) {
|
||||||
const x = new vm({
|
const x = new vm({
|
||||||
|
@ -17,16 +17,6 @@ let pending = 0;
|
|||||||
* Misskey Operating System
|
* Misskey Operating System
|
||||||
*/
|
*/
|
||||||
export default class MiOS extends EventEmitter {
|
export default class MiOS extends EventEmitter {
|
||||||
/**
|
|
||||||
* Misskeyの /meta で取得できるメタ情報
|
|
||||||
*/
|
|
||||||
private meta: {
|
|
||||||
data: { [x: string]: any };
|
|
||||||
chachedAt: Date;
|
|
||||||
};
|
|
||||||
|
|
||||||
private isMetaFetching = false;
|
|
||||||
|
|
||||||
public app: Vue;
|
public app: Vue;
|
||||||
|
|
||||||
public store: ReturnType<typeof initStore>;
|
public store: ReturnType<typeof initStore>;
|
||||||
@ -88,7 +78,7 @@ export default class MiOS extends EventEmitter {
|
|||||||
// When failure
|
// When failure
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
// Render the error screen
|
// Render the error screen
|
||||||
document.body.innerHTML = '<div id="err">Error</div>';
|
document.body.innerHTML = '<div id="err">Oops!</div>';
|
||||||
|
|
||||||
Progress.done();
|
Progress.done();
|
||||||
});
|
});
|
||||||
@ -107,9 +97,9 @@ export default class MiOS extends EventEmitter {
|
|||||||
// Finish init
|
// Finish init
|
||||||
callback();
|
callback();
|
||||||
|
|
||||||
// Init service worker
|
this.store.dispatch('instance/fetch').then(() => {
|
||||||
this.getMeta().then(data => {
|
// Init service worker
|
||||||
if (data.swPublickey) this.registerSw(data.swPublickey);
|
if (this.store.state.instance.meta.swPublickey) this.registerSw(this.store.state.instance.meta.swPublickey);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -350,49 +340,6 @@ export default class MiOS extends EventEmitter {
|
|||||||
|
|
||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Misskeyのメタ情報を取得します
|
|
||||||
*/
|
|
||||||
@autobind
|
|
||||||
public getMetaSync() {
|
|
||||||
return this.meta ? this.meta.data : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Misskeyのメタ情報を取得します
|
|
||||||
* @param force キャッシュを無視するか否か
|
|
||||||
*/
|
|
||||||
@autobind
|
|
||||||
public getMeta(force = false) {
|
|
||||||
return new Promise<{ [x: string]: any }>(async (res, rej) => {
|
|
||||||
if (this.isMetaFetching) {
|
|
||||||
this.once('_meta_fetched_', () => {
|
|
||||||
res(this.meta.data);
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const expire = 1000 * 60; // 1min
|
|
||||||
|
|
||||||
// forceが有効, meta情報を保持していない or 期限切れ
|
|
||||||
if (force || this.meta == null || Date.now() - this.meta.chachedAt.getTime() > expire) {
|
|
||||||
this.isMetaFetching = true;
|
|
||||||
const meta = await this.api('meta', {
|
|
||||||
detail: false
|
|
||||||
});
|
|
||||||
this.meta = {
|
|
||||||
data: meta,
|
|
||||||
chachedAt: new Date()
|
|
||||||
};
|
|
||||||
this.isMetaFetching = false;
|
|
||||||
this.emit('_meta_fetched_');
|
|
||||||
res(meta);
|
|
||||||
} else {
|
|
||||||
res(this.meta.data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,18 +84,19 @@ export default Vue.extend({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
version,
|
version,
|
||||||
meta: null,
|
|
||||||
stats: null,
|
stats: null,
|
||||||
serverInfo: null,
|
serverInfo: null,
|
||||||
faInfoCircle
|
faInfoCircle
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
computed: {
|
||||||
this.$root.getMeta().then(meta => {
|
meta() {
|
||||||
this.meta = meta;
|
return this.$store.state.instance.meta;
|
||||||
});
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
this.$root.api('stats').then(res => {
|
this.$root.api('stats').then(res => {
|
||||||
this.stats = res;
|
this.stats = res;
|
||||||
});
|
});
|
||||||
|
@ -115,13 +115,15 @@ export default Vue.extend({
|
|||||||
tagsLocal: [],
|
tagsLocal: [],
|
||||||
tagsRemote: [],
|
tagsRemote: [],
|
||||||
stats: null,
|
stats: null,
|
||||||
meta: null,
|
|
||||||
num: Vue.filter('number'),
|
num: Vue.filter('number'),
|
||||||
faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag, faRocket
|
faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag, faRocket
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
|
meta() {
|
||||||
|
return this.$store.state.instance.meta;
|
||||||
|
},
|
||||||
tagUsers(): any {
|
tagUsers(): any {
|
||||||
return {
|
return {
|
||||||
endpoint: 'hashtags/users',
|
endpoint: 'hashtags/users',
|
||||||
@ -159,9 +161,6 @@ export default Vue.extend({
|
|||||||
this.$root.api('stats').then(stats => {
|
this.$root.api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
this.meta = meta;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -83,15 +83,6 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then((meta: Record<string, any>) => {
|
|
||||||
if (!(
|
|
||||||
this.enableGlobalTimeline = !meta.disableGlobalTimeline || this.$store.state.i.isModerator || this.$store.state.i.isAdmin
|
|
||||||
) && this.src === 'global') this.src = 'local';
|
|
||||||
if (!(
|
|
||||||
this.enableLocalTimeline = !meta.disableLocalTimeline || this.$store.state.i.isModerator || this.$store.state.i.isAdmin
|
|
||||||
) && ['local', 'social'].includes(this.src)) this.src = 'home';
|
|
||||||
});
|
|
||||||
|
|
||||||
this.src = this.$store.state.deviceUser.tl.src;
|
this.src = this.$store.state.deviceUser.tl.src;
|
||||||
if (this.src === 'list') {
|
if (this.src === 'list') {
|
||||||
this.list = this.$store.state.deviceUser.tl.arg;
|
this.list = this.$store.state.deviceUser.tl.arg;
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="rsqzvsbo">
|
<div class="rsqzvsbo">
|
||||||
<div class="_panel about">
|
<div class="_panel about" v-if="meta">
|
||||||
<div class="banner" :style="{ backgroundImage: `url(${ banner })` }"></div>
|
<div class="banner" :style="{ backgroundImage: `url(${ meta.bannerUrl })` }"></div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<h1 class="name" v-html="name || host"></h1>
|
<h1 class="name" v-html="meta.name || host"></h1>
|
||||||
<div class="desc" v-html="description || $t('introMisskey')"></div>
|
<div class="desc" v-html="meta.description || $t('introMisskey')"></div>
|
||||||
<mk-button @click="signup()" style="display: inline-block; margin-right: 16px;" primary>{{ $t('signup') }}</mk-button>
|
<mk-button @click="signup()" style="display: inline-block; margin-right: 16px;" primary>{{ $t('signup') }}</mk-button>
|
||||||
<mk-button @click="signin()" style="display: inline-block;">{{ $t('login') }}</mk-button>
|
<mk-button @click="signin()" style="display: inline-block;">{{ $t('login') }}</mk-button>
|
||||||
</div>
|
</div>
|
||||||
@ -39,23 +39,16 @@ export default Vue.extend({
|
|||||||
noPaging: true,
|
noPaging: true,
|
||||||
},
|
},
|
||||||
host: toUnicode(host),
|
host: toUnicode(host),
|
||||||
meta: null,
|
|
||||||
name: null,
|
|
||||||
description: null,
|
|
||||||
banner: null,
|
|
||||||
announcements: [],
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
computed: {
|
||||||
this.$root.getMeta().then(meta => {
|
meta() {
|
||||||
this.meta = meta;
|
return this.$store.state.instance.meta;
|
||||||
this.name = meta.name;
|
},
|
||||||
this.description = meta.description;
|
},
|
||||||
this.announcements = meta.announcements;
|
|
||||||
this.banner = meta.bannerUrl;
|
|
||||||
});
|
|
||||||
|
|
||||||
|
created() {
|
||||||
this.$root.api('stats').then(stats => {
|
this.$root.api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
@ -20,15 +20,14 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
meta: null,
|
|
||||||
instanceName: getInstanceName(),
|
instanceName: getInstanceName(),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
computed: {
|
||||||
this.$root.getMeta().then(meta => {
|
meta() {
|
||||||
this.meta = meta;
|
return this.$store.state.instance.meta;
|
||||||
});
|
},
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
<div class="operations">
|
<div class="operations">
|
||||||
<span class="label">{{ $t('operations') }}</span>
|
<span class="label">{{ $t('operations') }}</span>
|
||||||
<mk-switch v-model="isSuspended" class="switch">{{ $t('stopActivityDelivery') }}</mk-switch>
|
<mk-switch v-model="isSuspended" class="switch">{{ $t('stopActivityDelivery') }}</mk-switch>
|
||||||
<mk-switch v-model="isBlocked" class="switch">{{ $t('blockThisInstance') }}</mk-switch>
|
<mk-switch :value="isBlocked" class="switch" @change="changeBlock">{{ $t('blockThisInstance') }}</mk-switch>
|
||||||
</div>
|
</div>
|
||||||
<details class="metadata">
|
<details class="metadata">
|
||||||
<summary class="label">{{ $t('metadata') }}</summary>
|
<summary class="label">{{ $t('metadata') }}</summary>
|
||||||
@ -147,9 +147,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
meta: null,
|
isSuspended: this.instance.isSuspended,
|
||||||
isSuspended: false,
|
|
||||||
isBlocked: false,
|
|
||||||
now: null,
|
now: null,
|
||||||
chart: null,
|
chart: null,
|
||||||
chartInstance: null,
|
chartInstance: null,
|
||||||
@ -184,6 +182,14 @@ export default Vue.extend({
|
|||||||
null;
|
null;
|
||||||
|
|
||||||
return stats;
|
return stats;
|
||||||
|
},
|
||||||
|
|
||||||
|
meta() {
|
||||||
|
return this.$store.state.instance.meta;
|
||||||
|
},
|
||||||
|
|
||||||
|
isBlocked() {
|
||||||
|
return this.meta && this.meta.blockedHosts.includes(this.instance.host);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -195,12 +201,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
isBlocked() {
|
|
||||||
this.$root.api('admin/update-meta', {
|
|
||||||
blockedHosts: this.isBlocked ? this.meta.blockedHosts.concat([this.instance.host]) : this.meta.blockedHosts.filter(x => x !== this.instance.host)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
chartSrc() {
|
chartSrc() {
|
||||||
this.renderChart();
|
this.renderChart();
|
||||||
},
|
},
|
||||||
@ -211,12 +211,6 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async created() {
|
async created() {
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
this.meta = meta;
|
|
||||||
this.isSuspended = this.instance.isSuspended;
|
|
||||||
this.isBlocked = this.meta.blockedHosts.includes(this.instance.host);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.now = new Date();
|
this.now = new Date();
|
||||||
|
|
||||||
const [perHour, perDay] = await Promise.all([
|
const [perHour, perDay] = await Promise.all([
|
||||||
@ -235,6 +229,12 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
changeBlock(e) {
|
||||||
|
this.$root.api('admin/update-meta', {
|
||||||
|
blockedHosts: this.isBlocked ? this.meta.blockedHosts.concat([this.instance.host]) : this.meta.blockedHosts.filter(x => x !== this.instance.host)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
setSrc(src) {
|
setSrc(src) {
|
||||||
this.chartSrc = src;
|
this.chartSrc = src;
|
||||||
},
|
},
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="_card info">
|
<section class="_card info">
|
||||||
|
<div class="_content">
|
||||||
|
<mk-input v-model="maxNoteTextLength" type="number" :save="() => save()" style="margin:0;"><template #icon><fa :icon="faPencilAlt"/></template>{{ $t('maxNoteTextLength') }}</mk-input>
|
||||||
|
</div>
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
<mk-switch v-model="enableLocalTimeline" @change="save()">{{ $t('enableLocalTimeline') }}</mk-switch>
|
<mk-switch v-model="enableLocalTimeline" @change="save()">{{ $t('enableLocalTimeline') }}</mk-switch>
|
||||||
<mk-switch v-model="enableGlobalTimeline" @change="save()">{{ $t('enableGlobalTimeline') }}</mk-switch>
|
<mk-switch v-model="enableGlobalTimeline" @change="save()">{{ $t('enableGlobalTimeline') }}</mk-switch>
|
||||||
@ -171,7 +174,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { faShareAlt, faGhost, faCog, faPlus, faCloud, faInfoCircle, faBan, faSave, faServer, faLink, faThumbtack, faUser, faShieldAlt, faKey, faBolt } from '@fortawesome/free-solid-svg-icons';
|
import { faPencilAlt, faShareAlt, faGhost, faCog, faPlus, faCloud, faInfoCircle, faBan, faSave, faServer, faLink, faThumbtack, faUser, faShieldAlt, faKey, faBolt } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faTrashAlt, faEnvelope } from '@fortawesome/free-regular-svg-icons';
|
import { faTrashAlt, faEnvelope } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
|
import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
|
||||||
import MkButton from '../../components/ui/button.vue';
|
import MkButton from '../../components/ui/button.vue';
|
||||||
@ -205,7 +208,6 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
version,
|
version,
|
||||||
url,
|
url,
|
||||||
meta: null,
|
|
||||||
stats: null,
|
stats: null,
|
||||||
serverInfo: null,
|
serverInfo: null,
|
||||||
proxyAccount: null,
|
proxyAccount: null,
|
||||||
@ -223,6 +225,7 @@ export default Vue.extend({
|
|||||||
tosUrl: null,
|
tosUrl: null,
|
||||||
bannerUrl: null,
|
bannerUrl: null,
|
||||||
iconUrl: null,
|
iconUrl: null,
|
||||||
|
maxNoteTextLength: 0,
|
||||||
enableRegistration: false,
|
enableRegistration: false,
|
||||||
enableLocalTimeline: false,
|
enableLocalTimeline: false,
|
||||||
enableGlobalTimeline: false,
|
enableGlobalTimeline: false,
|
||||||
@ -241,52 +244,56 @@ export default Vue.extend({
|
|||||||
enableDiscordIntegration: false,
|
enableDiscordIntegration: false,
|
||||||
discordClientId: null,
|
discordClientId: null,
|
||||||
discordClientSecret: null,
|
discordClientSecret: null,
|
||||||
faTwitter, faDiscord, faGithub, faShareAlt, faTrashAlt, faGhost, faCog, faPlus, faCloud, faInfoCircle, faBan, faSave, faServer, faLink, faEnvelope, faThumbtack, faUser, faShieldAlt, faKey, faBolt
|
faPencilAlt, faTwitter, faDiscord, faGithub, faShareAlt, faTrashAlt, faGhost, faCog, faPlus, faCloud, faInfoCircle, faBan, faSave, faServer, faLink, faEnvelope, faThumbtack, faUser, faShieldAlt, faKey, faBolt
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
computed: {
|
||||||
this.$root.getMeta().then(meta => {
|
meta() {
|
||||||
this.meta = meta;
|
return this.$store.state.instance.meta;
|
||||||
this.name = this.meta.name;
|
},
|
||||||
this.description = this.meta.description;
|
},
|
||||||
this.tosUrl = this.meta.tosUrl;
|
|
||||||
this.bannerUrl = this.meta.bannerUrl;
|
|
||||||
this.iconUrl = this.meta.iconUrl;
|
|
||||||
this.maintainerName = this.meta.maintainerName;
|
|
||||||
this.maintainerEmail = this.meta.maintainerEmail;
|
|
||||||
this.enableRegistration = !this.meta.disableRegistration;
|
|
||||||
this.enableLocalTimeline = !this.meta.disableLocalTimeline;
|
|
||||||
this.enableGlobalTimeline = !this.meta.disableGlobalTimeline;
|
|
||||||
this.enableRecaptcha = this.meta.enableRecaptcha;
|
|
||||||
this.recaptchaSiteKey = this.meta.recaptchaSiteKey;
|
|
||||||
this.recaptchaSecretKey = this.meta.recaptchaSecretKey;
|
|
||||||
this.proxyAccountId = this.meta.proxyAccountId;
|
|
||||||
this.cacheRemoteFiles = this.meta.cacheRemoteFiles;
|
|
||||||
this.proxyRemoteFiles = this.meta.proxyRemoteFiles;
|
|
||||||
this.localDriveCapacityMb = this.meta.driveCapacityPerLocalUserMb;
|
|
||||||
this.remoteDriveCapacityMb = this.meta.driveCapacityPerRemoteUserMb;
|
|
||||||
this.blockedHosts = this.meta.blockedHosts.join('\n');
|
|
||||||
this.pinnedUsers = this.meta.pinnedUsers.join('\n');
|
|
||||||
this.enableServiceWorker = this.meta.enableServiceWorker;
|
|
||||||
this.swPublicKey = this.meta.swPublickey;
|
|
||||||
this.swPrivateKey = this.meta.swPrivateKey;
|
|
||||||
this.enableTwitterIntegration = this.meta.enableTwitterIntegration;
|
|
||||||
this.twitterConsumerKey = this.meta.twitterConsumerKey;
|
|
||||||
this.twitterConsumerSecret = this.meta.twitterConsumerSecret;
|
|
||||||
this.enableGithubIntegration = this.meta.enableGithubIntegration;
|
|
||||||
this.githubClientId = this.meta.githubClientId;
|
|
||||||
this.githubClientSecret = this.meta.githubClientSecret;
|
|
||||||
this.enableDiscordIntegration = this.meta.enableDiscordIntegration;
|
|
||||||
this.discordClientId = this.meta.discordClientId;
|
|
||||||
this.discordClientSecret = this.meta.discordClientSecret;
|
|
||||||
|
|
||||||
if (this.proxyAccountId) {
|
created() {
|
||||||
this.$root.api('users/show', { userId: this.proxyAccountId }).then(proxyAccount => {
|
this.name = this.meta.name;
|
||||||
this.proxyAccount = proxyAccount;
|
this.description = this.meta.description;
|
||||||
});
|
this.tosUrl = this.meta.tosUrl;
|
||||||
}
|
this.bannerUrl = this.meta.bannerUrl;
|
||||||
});
|
this.iconUrl = this.meta.iconUrl;
|
||||||
|
this.maintainerName = this.meta.maintainerName;
|
||||||
|
this.maintainerEmail = this.meta.maintainerEmail;
|
||||||
|
this.maxNoteTextLength = this.meta.maxNoteTextLength;
|
||||||
|
this.enableRegistration = !this.meta.disableRegistration;
|
||||||
|
this.enableLocalTimeline = !this.meta.disableLocalTimeline;
|
||||||
|
this.enableGlobalTimeline = !this.meta.disableGlobalTimeline;
|
||||||
|
this.enableRecaptcha = this.meta.enableRecaptcha;
|
||||||
|
this.recaptchaSiteKey = this.meta.recaptchaSiteKey;
|
||||||
|
this.recaptchaSecretKey = this.meta.recaptchaSecretKey;
|
||||||
|
this.proxyAccountId = this.meta.proxyAccountId;
|
||||||
|
this.cacheRemoteFiles = this.meta.cacheRemoteFiles;
|
||||||
|
this.proxyRemoteFiles = this.meta.proxyRemoteFiles;
|
||||||
|
this.localDriveCapacityMb = this.meta.driveCapacityPerLocalUserMb;
|
||||||
|
this.remoteDriveCapacityMb = this.meta.driveCapacityPerRemoteUserMb;
|
||||||
|
this.blockedHosts = this.meta.blockedHosts.join('\n');
|
||||||
|
this.pinnedUsers = this.meta.pinnedUsers.join('\n');
|
||||||
|
this.enableServiceWorker = this.meta.enableServiceWorker;
|
||||||
|
this.swPublicKey = this.meta.swPublickey;
|
||||||
|
this.swPrivateKey = this.meta.swPrivateKey;
|
||||||
|
this.enableTwitterIntegration = this.meta.enableTwitterIntegration;
|
||||||
|
this.twitterConsumerKey = this.meta.twitterConsumerKey;
|
||||||
|
this.twitterConsumerSecret = this.meta.twitterConsumerSecret;
|
||||||
|
this.enableGithubIntegration = this.meta.enableGithubIntegration;
|
||||||
|
this.githubClientId = this.meta.githubClientId;
|
||||||
|
this.githubClientSecret = this.meta.githubClientSecret;
|
||||||
|
this.enableDiscordIntegration = this.meta.enableDiscordIntegration;
|
||||||
|
this.discordClientId = this.meta.discordClientId;
|
||||||
|
this.discordClientSecret = this.meta.discordClientSecret;
|
||||||
|
|
||||||
|
if (this.proxyAccountId) {
|
||||||
|
this.$root.api('users/show', { userId: this.proxyAccountId }).then(proxyAccount => {
|
||||||
|
this.proxyAccount = proxyAccount;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.$root.api('admin/server-info').then(res => {
|
this.$root.api('admin/server-info').then(res => {
|
||||||
this.serverInfo = res;
|
this.serverInfo = res;
|
||||||
@ -347,6 +354,7 @@ export default Vue.extend({
|
|||||||
iconUrl: this.iconUrl,
|
iconUrl: this.iconUrl,
|
||||||
maintainerName: this.maintainerName,
|
maintainerName: this.maintainerName,
|
||||||
maintainerEmail: this.maintainerEmail,
|
maintainerEmail: this.maintainerEmail,
|
||||||
|
maxNoteTextLength: this.maxNoteTextLength,
|
||||||
disableRegistration: !this.enableRegistration,
|
disableRegistration: !this.enableRegistration,
|
||||||
disableLocalTimeline: !this.enableLocalTimeline,
|
disableLocalTimeline: !this.enableLocalTimeline,
|
||||||
disableGlobalTimeline: !this.enableGlobalTimeline,
|
disableGlobalTimeline: !this.enableGlobalTimeline,
|
||||||
@ -373,6 +381,7 @@ export default Vue.extend({
|
|||||||
discordClientId: this.discordClientId,
|
discordClientId: this.discordClientId,
|
||||||
discordClientSecret: this.discordClientSecret,
|
discordClientSecret: this.discordClientSecret,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
this.$store.dispatch('instance/fetch');
|
||||||
if (withDialog) {
|
if (withDialog) {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
|
@ -271,12 +271,8 @@ export default Vue.extend({
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
color: #aaa;
|
|
||||||
transition: color 0.1s ease;
|
transition: color 0.1s ease;
|
||||||
|
color: var(--accent);
|
||||||
&:hover {
|
|
||||||
color: var(--accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
color: var(--accentDarken);
|
color: var(--accentDarken);
|
||||||
@ -338,7 +334,6 @@ export default Vue.extend({
|
|||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: #aaa;
|
|
||||||
transition: color 0.1s ease;
|
transition: color 0.1s ease;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
@ -231,7 +231,6 @@ export default Vue.extend({
|
|||||||
display: block;
|
display: block;
|
||||||
margin: 2px 0 0 0;
|
margin: 2px 0 0 0;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
color: var(--messagingRoomMessageInfo);
|
|
||||||
|
|
||||||
> .read {
|
> .read {
|
||||||
margin: 0 8px;
|
margin: 0 8px;
|
||||||
@ -288,6 +287,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> .balloon {
|
> .balloon {
|
||||||
background: $me-balloon-color;
|
background: $me-balloon-color;
|
||||||
|
box-shadow: 0 6px 16px var(--accentShadow);
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
|
||||||
&[data-no-text] {
|
&[data-no-text] {
|
||||||
|
@ -56,15 +56,17 @@ export default Vue.extend({
|
|||||||
computed: {
|
computed: {
|
||||||
integrations() {
|
integrations() {
|
||||||
return this.$store.state.i.integrations;
|
return this.$store.state.i.integrations;
|
||||||
}
|
},
|
||||||
|
|
||||||
|
meta() {
|
||||||
|
return this.$store.state.instance.meta;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.getMeta().then(meta => {
|
this.enableTwitterIntegration = this.meta.enableTwitterIntegration;
|
||||||
this.enableTwitterIntegration = meta.enableTwitterIntegration;
|
this.enableDiscordIntegration = this.meta.enableDiscordIntegration;
|
||||||
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
this.enableGithubIntegration = this.meta.enableGithubIntegration;
|
||||||
this.enableGithubIntegration = meta.enableGithubIntegration;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -41,13 +41,13 @@ const defaultDeviceSettings = {
|
|||||||
userData: {},
|
userData: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
function copy(data) {
|
function copy<T>(data: T): T {
|
||||||
return JSON.parse(JSON.stringify(data));
|
return JSON.parse(JSON.stringify(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
export default (os: MiOS) => new Vuex.Store({
|
export default (os: MiOS) => new Vuex.Store({
|
||||||
plugins: [createPersistedState({
|
plugins: [createPersistedState({
|
||||||
paths: ['i', 'device', 'deviceUser', 'settings']
|
paths: ['i', 'device', 'deviceUser', 'settings', 'instance']
|
||||||
})],
|
})],
|
||||||
|
|
||||||
state: {
|
state: {
|
||||||
@ -111,6 +111,30 @@ export default (os: MiOS) => new Vuex.Store({
|
|||||||
},
|
},
|
||||||
|
|
||||||
modules: {
|
modules: {
|
||||||
|
instance: {
|
||||||
|
namespaced: true,
|
||||||
|
|
||||||
|
state: {
|
||||||
|
meta: null
|
||||||
|
},
|
||||||
|
|
||||||
|
mutations: {
|
||||||
|
set(state, meta) {
|
||||||
|
state.meta = meta;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
async fetch(ctx) {
|
||||||
|
const meta = await os.api('meta', {
|
||||||
|
detail: false
|
||||||
|
});
|
||||||
|
|
||||||
|
ctx.commit('set', meta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
device: {
|
device: {
|
||||||
namespaced: true,
|
namespaced: true,
|
||||||
|
|
||||||
|
@ -89,6 +89,8 @@ body {
|
|||||||
width: 64px;
|
width: 64px;
|
||||||
height: 64px;
|
height: 64px;
|
||||||
animation: ini 0.6s infinite linear;
|
animation: ini 0.6s infinite linear;
|
||||||
|
color: var(--accent);
|
||||||
|
fill: currentColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,6 +198,7 @@ a {
|
|||||||
@extend ._button;
|
@extend ._button;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
|
box-shadow: 0 6px 16px var(--accentShadow);
|
||||||
|
|
||||||
&:not(:disabled):hover {
|
&:not(:disabled):hover {
|
||||||
background: var(--jkhztclx);
|
background: var(--jkhztclx);
|
||||||
@ -385,7 +388,7 @@ a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@keyframes blink {
|
@keyframes blink {
|
||||||
0% { opacity: 1; }
|
0% { opacity: 1; transform: scale(1); }
|
||||||
30% { opacity: 1; }
|
30% { opacity: 1; transform: scale(1); }
|
||||||
90% { opacity: 0; }
|
90% { opacity: 0; transform: scale(0.5); }
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
accent: '#86b300',
|
accent: '#86b300',
|
||||||
accentDarken: ':darken<10<@accent',
|
accentDarken: ':darken<10<@accent',
|
||||||
accentLighten: ':lighten<10<@accent',
|
accentLighten: ':lighten<10<@accent',
|
||||||
|
accentShadow: ':alpha<0.3<@accent',
|
||||||
focus: ':alpha<0.3<@accent',
|
focus: ':alpha<0.3<@accent',
|
||||||
bg: '#000',
|
bg: '#000',
|
||||||
fg: '#c7d1d8',
|
fg: '#c7d1d8',
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
accent: '#86b300',
|
accent: '#86b300',
|
||||||
accentDarken: ':darken<10<@accent',
|
accentDarken: ':darken<10<@accent',
|
||||||
accentLighten: ':lighten<10<@accent',
|
accentLighten: ':lighten<10<@accent',
|
||||||
|
accentShadow: ':alpha<0.4<@accent',
|
||||||
focus: ':alpha<0.3<@accent',
|
focus: ':alpha<0.3<@accent',
|
||||||
bg: '#fafafa',
|
bg: '#fafafa',
|
||||||
fg: '#5c6a73',
|
fg: '#5c6a73',
|
||||||
|
@ -55,6 +55,6 @@ html
|
|||||||
| Please turn on your JavaScript
|
| Please turn on your JavaScript
|
||||||
div#ini.
|
div#ini.
|
||||||
<svg viewBox="0 0 50 50">
|
<svg viewBox="0 0 50 50">
|
||||||
<path fill=#fb4e4e d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z" />
|
<path d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z" />
|
||||||
</svg>
|
</svg>
|
||||||
block content
|
block content
|
||||||
|
Reference in New Issue
Block a user