diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2022-06-29 21:22:15 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2022-06-29 21:22:15 +0900 |
| commit | c9b3ab80ca9f1bfa6815fa73c5d885f1c1caa0b5 (patch) | |
| tree | 57aee4b0dcbd0f7164c402cd79efdec8a6a969cd /packages/client/src/components | |
| parent | chore(client): fix type def (diff) | |
| download | misskey-c9b3ab80ca9f1bfa6815fa73c5d885f1c1caa0b5.tar.gz misskey-c9b3ab80ca9f1bfa6815fa73c5d885f1c1caa0b5.tar.bz2 misskey-c9b3ab80ca9f1bfa6815fa73c5d885f1c1caa0b5.zip | |
feat(client): add tag cloud component
Diffstat (limited to 'packages/client/src/components')
| -rw-r--r-- | packages/client/src/components/tag-cloud.vue | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/packages/client/src/components/tag-cloud.vue b/packages/client/src/components/tag-cloud.vue new file mode 100644 index 0000000000..43ab49357b --- /dev/null +++ b/packages/client/src/components/tag-cloud.vue @@ -0,0 +1,80 @@ +<template> +<div class="root"> + <canvas :id="idForCanvas" ref="canvasEl" class="canvas" width="300" height="300"></canvas> + <div :id="idForTags" ref="tagsEl" class="tags"> + <ul> + <slot></slot> + </ul> + </div> +</div> +</template> + +<script lang="ts" setup> +import { onMounted, ref, watch, PropType, onBeforeUnmount } from 'vue'; +import tinycolor from 'tinycolor2'; + +const props = defineProps<{}>(); + +const loaded = !!window.TagCanvas; +const SAFE_FOR_HTML_ID = 'abcdefghijklmnopqrstuvwxyz'; +const computedStyle = getComputedStyle(document.documentElement); +const idForCanvas = Array.from(Array(16)).map(() => SAFE_FOR_HTML_ID[Math.floor(Math.random() * SAFE_FOR_HTML_ID.length)]).join(''); +const idForTags = Array.from(Array(16)).map(() => SAFE_FOR_HTML_ID[Math.floor(Math.random() * SAFE_FOR_HTML_ID.length)]).join(''); +let available = $ref(false); +let canvasEl = $ref<HTMLCanvasElement | null>(null); +let tagsEl = $ref<HTMLElement | null>(null); + +watch($$(available), () => { + window.TagCanvas.Start(idForCanvas, idForTags, { + textColour: '#ffffff', + outlineColour: tinycolor(computedStyle.getPropertyValue('--accent')).toHexString(), + outlineRadius: 10, + initial: [-0.030, -0.010], + frontSelect: true, + imageRadius: 8, + //dragControl: true, + dragThreshold: 3, + wheelZoom: false, + reverse: true, + depth: 0.5, + maxSpeed: 0.2, + minSpeed: 0.003, + stretchX: 0.8, + stretchY: 0.8, + }); +}); + +onMounted(() => { + if (loaded) { + available = true; + } else { + document.head.appendChild(Object.assign(document.createElement('script'), { + async: true, + src: '/client-assets/tagcanvas.min.js', + })).addEventListener('load', () => available = true); + } +}); + +onBeforeUnmount(() => { + window.TagCanvas.Delete(idForCanvas); +}); +</script> + +<style lang="scss" scoped> +.root { + position: relative; + overflow: clip; + display: grid; + place-items: center; + + > .canvas { + display: block; + } + + > .tags { + position: absolute; + top: 999px; + left: 999px; + } +} +</style> |