From 698c865b39f35ed6db7f13eb7f9f7085cd68858c Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sun, 14 Mar 2021 15:21:14 +0100 Subject: [PATCH] :sparkles: (stacked notes) implements overlay --- src/components/StackedNote.vue | 50 ++++++++++++++--- src/hooks/useNote.hook.ts | 16 +++++- src/hooks/useNoteOverlay.hook.ts | 27 +++++++++ src/hooks/useOverlay.hook.ts | 27 +++++++++ src/styles/app.scss | 3 +- src/views/Home.vue | 94 ++++++++++++++++++++------------ 6 files changed, 172 insertions(+), 45 deletions(-) create mode 100644 src/hooks/useNoteOverlay.hook.ts create mode 100644 src/hooks/useOverlay.hook.ts diff --git a/src/components/StackedNote.vue b/src/components/StackedNote.vue index ee0b977..57a965b 100644 --- a/src/components/StackedNote.vue +++ b/src/components/StackedNote.vue @@ -1,22 +1,35 @@ diff --git a/src/hooks/useNote.hook.ts b/src/hooks/useNote.hook.ts index 12972d4..f11b120 100644 --- a/src/hooks/useNote.hook.ts +++ b/src/hooks/useNote.hook.ts @@ -1,5 +1,5 @@ import { Ref, ref } from '@vue/reactivity' -import { nextTick, onUnmounted, watch } from '@vue/runtime-core' +import { computed, nextTick, onUnmounted, watch } from '@vue/runtime-core' import { useRoute, useRouter } from 'vue-router' import { noteEventBus } from '@/bus/noteBusEvent' @@ -26,6 +26,19 @@ export const useNote = (user: Ref, repo: Ref) => { const { readme, notFound, tree } = useRepo(user, repo) const { listenToClick } = useLinks('note-display') + const titles = computed(() => { + return stackedNotes.value.reduce((obj: Record, note) => { + if (!note) { + return obj + } + const filePath = tree.value.find((file) => file.sha === note)?.path ?? '' + const fileNames = filePath.split('.') + fileNames.pop() + obj[note] = fileNames.join('.') + + return obj + }, {}) + }) const unsubscribe = noteEventBus.addEventBusListener( ({ path, currentNoteSHA }) => { @@ -93,6 +106,7 @@ export const useNote = (user: Ref, repo: Ref) => { }) return { + titles, readme, notFound, stackedNotes diff --git a/src/hooks/useNoteOverlay.hook.ts b/src/hooks/useNoteOverlay.hook.ts new file mode 100644 index 0000000..0456c49 --- /dev/null +++ b/src/hooks/useNoteOverlay.hook.ts @@ -0,0 +1,27 @@ +import { computed, onMounted } from '@vue/runtime-core' + +import { useOverlay } from '@/hooks/useOverlay.hook' + +const BOOKMARK_WIDTH = 2 +const NOTE_WIDTH = 620 + +export const useNoteOverlay = (className: string, index: number) => { + const { x } = useOverlay() + const displayNoteOverlay = computed(() => x.value > index * NOTE_WIDTH) + + onMounted(() => { + const noteElement = document.querySelector( + `.${className}` + ) as HTMLElement | null + + if (!noteElement) { + return + } + + noteElement.style.left = `${(index + 1) * BOOKMARK_WIDTH}rem` + }) + + return { + displayNoteOverlay + } +} diff --git a/src/hooks/useOverlay.hook.ts b/src/hooks/useOverlay.hook.ts new file mode 100644 index 0000000..af62c3e --- /dev/null +++ b/src/hooks/useOverlay.hook.ts @@ -0,0 +1,27 @@ +import { onMounted, ref } from 'vue' + +import { useEventListener } from '@vueuse/core' + +export const useOverlay = () => { + const x = ref(0) + + onMounted(() => { + const element = document.querySelector('body') + + useEventListener( + element, + 'scroll', + (e) => { + const target = e.target as HTMLElement + x.value = target.scrollLeft + }, + { + passive: true, + capture: false + } + ) + }) + return { + x + } +} diff --git a/src/styles/app.scss b/src/styles/app.scss index ebf6f06..0034a62 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -4,12 +4,13 @@ html { overflow-y: auto; + overflow-x: auto; } body { font-family: 'Courier Prime', monospace; - text-align: center; height: 100vh; + // width: 5000px; } @media screen and (min-width: 769px) { diff --git a/src/views/Home.vue b/src/views/Home.vue index 5f5120f..2ac607d 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -27,35 +27,37 @@ -
-
-
+
+
+
Not found.
-
-
-

- - {{ repo }} - -

-

{{ user }}

-

-
- +
+
+
+

+ + {{ repo }} + +

+

{{ user }}

+

+
@@ -79,6 +81,7 @@ export default defineComponent({ }, setup(props) { const refProps = toRefs(props) + return { ...useNote(refProps.user, refProps.repo), ...useForm(), @@ -91,20 +94,43 @@ export default defineComponent({