summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-09-04 17:54:24 +0900
committerGitHub <noreply@github.com>2021-09-04 17:54:24 +0900
commit8407702b38ead9fab4aab6698b9e0be1457218a0 (patch)
treeb7ed8987d1bacc19a4e6b8a829bf92bc70ee5d76 /src
parentTune download (#2) (diff)
downloadmisskey-8407702b38ead9fab4aab6698b9e0be1457218a0.tar.gz
misskey-8407702b38ead9fab4aab6698b9e0be1457218a0.tar.bz2
misskey-8407702b38ead9fab4aab6698b9e0be1457218a0.zip
藍モード (#7687)
* wip * wip * シンボリックリンクやめた * install lib dependency * bring live2d assets from misskey-dev/assets * refactor * nanka iroiro * コミット忘れ * random motion * wip * run git submodule update --init * コミット忘れ * refactor * fix bug * Update misskey-assets * lint * lint * lint * 藍モード修正 (#7702) * lazy load live2d script * fix typo * lazy load also widget * hot link to cubism core * https://github.com/misskey-dev/misskey/pull/7702/files#r695623821 * fix lint * remove live2d stuff * use iframe * update * Update gulpfile.ts * update * Update .gitattributes * update Co-authored-by: tamaina <tamaina@hotmail.co.jp>
Diffstat (limited to 'src')
-rw-r--r--src/client/pages/settings/general.vue9
-rw-r--r--src/client/store.ts4
-rw-r--r--src/client/tsconfig.json3
-rw-r--r--src/client/ui/default.vue31
-rw-r--r--src/client/widgets/aichan.vue59
-rw-r--r--src/client/widgets/index.ts2
6 files changed, 106 insertions, 2 deletions
diff --git a/src/client/pages/settings/general.vue b/src/client/pages/settings/general.vue
index cfa8107d28..f8e8e6b24b 100644
--- a/src/client/pages/settings/general.vue
+++ b/src/client/pages/settings/general.vue
@@ -45,6 +45,10 @@
</FormSwitch>
</FormGroup>
+ <FormGroup>
+ <FormSwitch v-model:value="aiChanMode">{{ $ts.aiChanMode }}</FormSwitch>
+ </FormGroup>
+
<FormRadios v-model="fontSize">
<template #desc>{{ $ts.fontSize }}</template>
<option value="small"><span style="font-size: 14px;">Aa</span></option>
@@ -149,6 +153,7 @@ export default defineComponent({
enableInfiniteScroll: defaultStore.makeGetterSetter('enableInfiniteScroll'),
useReactionPickerForContextMenu: defaultStore.makeGetterSetter('useReactionPickerForContextMenu'),
squareAvatars: defaultStore.makeGetterSetter('squareAvatars'),
+ aiChanMode: defaultStore.makeGetterSetter('aiChanMode'),
},
watch: {
@@ -184,6 +189,10 @@ export default defineComponent({
this.reloadAsk();
},
+ aiChanMode() {
+ this.reloadAsk();
+ },
+
showGapBetweenNotesInTimeline() {
this.reloadAsk();
},
diff --git a/src/client/store.ts b/src/client/store.ts
index 4c4a7d93e9..e4b762873d 100644
--- a/src/client/store.ts
+++ b/src/client/store.ts
@@ -210,6 +210,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: ''
},
+ aiChanMode: {
+ where: 'device',
+ default: false
+ },
}));
// TODO: 他のタブと永続化されたstateを同期
diff --git a/src/client/tsconfig.json b/src/client/tsconfig.json
index ac7ef7ddfc..7a26047ddf 100644
--- a/src/client/tsconfig.json
+++ b/src/client/tsconfig.json
@@ -21,7 +21,8 @@
"baseUrl": ".",
"paths": {
"@/*": ["../*"],
- "@client/*": ["./*"]
+ "@client/*": ["./*"],
+ "@lib/*": ["../../lib/*"],
},
"typeRoots": [
"node_modules/@types",
diff --git a/src/client/ui/default.vue b/src/client/ui/default.vue
index 23b63114cc..eef693faef 100644
--- a/src/client/ui/default.vue
+++ b/src/client/ui/default.vue
@@ -54,12 +54,14 @@
<XWidgets v-if="widgetsShowing" class="tray"/>
</transition>
+ <iframe v-if="$store.state.aiChanMode" class="ivnzpscs" ref="live2d" src="https://misskey-dev.github.io/mascot-web/?scale=2&y=1.4"></iframe>
+
<XCommon/>
</div>
</template>
<script lang="ts">
-import { defineComponent, defineAsyncComponent } from 'vue';
+import { defineComponent, defineAsyncComponent, markRaw } from 'vue';
import { instanceName } from '@client/config';
import { StickySidebar } from '@client/scripts/sticky-sidebar';
import XSidebar from './default.sidebar.vue';
@@ -131,6 +133,19 @@ export default defineComponent({
this.isMobile = (window.innerWidth <= MOBILE_THRESHOLD);
this.isDesktop = (window.innerWidth >= DESKTOP_THRESHOLD);
}, { passive: true });
+
+ if (this.$store.state.aiChanMode) {
+ const iframeRect = this.$refs.live2d.getBoundingClientRect();
+ window.addEventListener('mousemove', ev => {
+ this.$refs.live2d.contentWindow.postMessage({
+ type: 'moveCursor',
+ body: {
+ x: ev.clientX - iframeRect.left,
+ y: ev.clientY - iframeRect.top,
+ }
+ }, '*');
+ }, { passive: true });
+ }
},
methods: {
@@ -201,6 +216,10 @@ export default defineComponent({
}
}], e);
},
+
+ onAiClick(ev) {
+ //if (this.live2d) this.live2d.click(ev);
+ }
}
});
</script>
@@ -458,5 +477,15 @@ export default defineComponent({
overflow: auto;
background: var(--bg);
}
+
+ > .ivnzpscs {
+ position: fixed;
+ bottom: 0;
+ right: 0;
+ width: 300px;
+ height: 600px;
+ border: none;
+ pointer-events: none;
+ }
}
</style>
diff --git a/src/client/widgets/aichan.vue b/src/client/widgets/aichan.vue
new file mode 100644
index 0000000000..06c49090a1
--- /dev/null
+++ b/src/client/widgets/aichan.vue
@@ -0,0 +1,59 @@
+<template>
+<MkContainer :naked="props.transparent" :show-header="false">
+ <iframe class="dedjhjmo" ref="live2d" @click="touched" src="https://misskey-dev.github.io/mascot-web/?scale=1.5&y=1.1&eyeY=100"></iframe>
+</MkContainer>
+</template>
+
+<script lang="ts">
+import { defineComponent, markRaw } from 'vue';
+import define from './define';
+import MkContainer from '@client/components/ui/container.vue';
+import * as os from '@client/os';
+
+const widget = define({
+ name: 'ai',
+ props: () => ({
+ transparent: {
+ type: 'boolean',
+ default: false,
+ },
+ })
+});
+
+export default defineComponent({
+ extends: widget,
+ components: {
+ MkContainer,
+ },
+ data() {
+ return {
+ };
+ },
+ mounted() {
+ window.addEventListener('mousemove', ev => {
+ const iframeRect = this.$refs.live2d.getBoundingClientRect();
+ this.$refs.live2d.contentWindow.postMessage({
+ type: 'moveCursor',
+ body: {
+ x: ev.clientX - iframeRect.left,
+ y: ev.clientY - iframeRect.top,
+ }
+ }, '*');
+ }, { passive: true });
+ },
+ methods: {
+ touched() {
+ //if (this.live2d) this.live2d.changeExpression('gurugurume');
+ }
+ }
+});
+</script>
+
+<style lang="scss" scoped>
+.dedjhjmo {
+ width: 100%;
+ height: 350px;
+ border: none;
+ pointer-events: none;
+}
+</style>
diff --git a/src/client/widgets/index.ts b/src/client/widgets/index.ts
index 38cb85494a..51a82af080 100644
--- a/src/client/widgets/index.ts
+++ b/src/client/widgets/index.ts
@@ -19,6 +19,7 @@ export default function(app: App) {
app.component('MkwJobQueue', defineAsyncComponent(() => import('./job-queue.vue')));
app.component('MkwButton', defineAsyncComponent(() => import('./button.vue')));
app.component('MkwAiscript', defineAsyncComponent(() => import('./aiscript.vue')));
+ app.component('MkwAichan', defineAsyncComponent(() => import('./aichan.vue')));
}
export const widgets = [
@@ -40,4 +41,5 @@ export const widgets = [
'jobQueue',
'button',
'aiscript',
+ 'aichan',
];