summaryrefslogtreecommitdiff
path: root/packages/frontend/src/widgets/WidgetAichan.vue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-10 06:08:40 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-01-10 06:08:40 +0900
commit618405c4d39753c1a9135fd0759aff2ecb3a94b3 (patch)
treeb0551494d3ffd37ee3e7f7ad75bc81f54d3fb249 /packages/frontend/src/widgets/WidgetAichan.vue
parentrefactor(client): use css modules (diff)
downloadmisskey-618405c4d39753c1a9135fd0759aff2ecb3a94b3.tar.gz
misskey-618405c4d39753c1a9135fd0759aff2ecb3a94b3.tar.bz2
misskey-618405c4d39753c1a9135fd0759aff2ecb3a94b3.zip
refactor(client): rename widget filename
Diffstat (limited to 'packages/frontend/src/widgets/WidgetAichan.vue')
-rw-r--r--packages/frontend/src/widgets/WidgetAichan.vue74
1 files changed, 74 insertions, 0 deletions
diff --git a/packages/frontend/src/widgets/WidgetAichan.vue b/packages/frontend/src/widgets/WidgetAichan.vue
new file mode 100644
index 0000000000..ab5b375ae4
--- /dev/null
+++ b/packages/frontend/src/widgets/WidgetAichan.vue
@@ -0,0 +1,74 @@
+<template>
+<MkContainer :naked="widgetProps.transparent" :show-header="false" class="mkw-aichan">
+ <iframe ref="live2d" class="dedjhjmo" src="https://misskey-dev.github.io/mascot-web/?scale=1.5&y=1.1&eyeY=100" @click="touched"></iframe>
+</MkContainer>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, onUnmounted, reactive, ref, shallowRef } from 'vue';
+import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget';
+import { GetFormResultType } from '@/scripts/form';
+
+const name = 'ai';
+
+const widgetPropsDef = {
+ transparent: {
+ type: 'boolean' as const,
+ default: false,
+ },
+};
+
+type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
+
+// 現時点ではvueの制限によりimportしたtypeをジェネリックに渡せない
+//const props = defineProps<WidgetComponentProps<WidgetProps>>();
+//const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
+const props = defineProps<{ widget?: Widget<WidgetProps>; }>();
+const emit = defineEmits<{ (ev: 'updateProps', props: WidgetProps); }>();
+
+const { widgetProps, configure } = useWidgetPropsManager(name,
+ widgetPropsDef,
+ props,
+ emit,
+);
+
+const live2d = shallowRef<HTMLIFrameElement>();
+
+const touched = () => {
+ //if (this.live2d) this.live2d.changeExpression('gurugurume');
+};
+
+const onMousemove = (ev: MouseEvent) => {
+ const iframeRect = live2d.value.getBoundingClientRect();
+ live2d.value.contentWindow.postMessage({
+ type: 'moveCursor',
+ body: {
+ x: ev.clientX - iframeRect.left,
+ y: ev.clientY - iframeRect.top,
+ },
+ }, '*');
+};
+
+onMounted(() => {
+ window.addEventListener('mousemove', onMousemove, { passive: true });
+});
+
+onUnmounted(() => {
+ window.removeEventListener('mousemove', onMousemove);
+});
+
+defineExpose<WidgetComponentExpose>({
+ name,
+ configure,
+ id: props.widget ? props.widget.id : null,
+});
+</script>
+
+<style lang="scss" scoped>
+.dedjhjmo {
+ width: 100%;
+ height: 350px;
+ border: none;
+ pointer-events: none;
+}
+</style>