From 384a5d048e55b53eda11361f7de0cd2bad95b34c Mon Sep 17 00:00:00 2001 From: Sayiddd Date: Thu, 2 Apr 2026 21:44:44 +0700 Subject: [PATCH 1/5] Added SidebarOverlay component Add sidebar component, keys, and composable --- src/auto-imports.d.ts | 2 + src/components.d.ts | 1 + src/components/SidebarOverlay.vue | 109 ++++++++++++++++++++++++++ src/composables/useInjectedSidebar.ts | 20 +++++ src/keys/sidebar.ts | 1 + src/layouts/default.vue | 19 ++++- 6 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 src/components/SidebarOverlay.vue create mode 100644 src/composables/useInjectedSidebar.ts create mode 100644 src/keys/sidebar.ts diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts index b63a954..08c7a0f 100644 --- a/src/auto-imports.d.ts +++ b/src/auto-imports.d.ts @@ -193,6 +193,7 @@ declare global { const useImage: typeof import('@vueuse/core')['useImage'] const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] const useInjectedScroll: typeof import('./composables/useInjectedScroll')['useInjectedScroll'] + const useInjectedSidebar: typeof import('./composables/useInjectedSidebar')['useInjectedSidebar'] const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] const useInterval: typeof import('@vueuse/core')['useInterval'] const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] @@ -508,6 +509,7 @@ declare module 'vue' { readonly useImage: UnwrapRef readonly useInfiniteScroll: UnwrapRef readonly useInjectedScroll: UnwrapRef + readonly useInjectedSidebar: UnwrapRef readonly useIntersectionObserver: UnwrapRef readonly useInterval: UnwrapRef readonly useIntervalFn: UnwrapRef diff --git a/src/components.d.ts b/src/components.d.ts index 38db0e7..96df8f8 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -30,6 +30,7 @@ declare module 'vue' { RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] ScrollIndicator: typeof import('./components/partials/ScrollIndicator.vue')['default'] + SidebarOverlay: typeof import('./components/SidebarOverlay.vue')['default'] SocialCard: typeof import('./components/partials/about/SocialCard.vue')['default'] SocialLink: typeof import('./components/partials/about/SocialLink.vue')['default'] ToggleButton: typeof import('./components/partials/ToggleButton.vue')['default'] diff --git a/src/components/SidebarOverlay.vue b/src/components/SidebarOverlay.vue new file mode 100644 index 0000000..0a539a5 --- /dev/null +++ b/src/components/SidebarOverlay.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/composables/useInjectedSidebar.ts b/src/composables/useInjectedSidebar.ts new file mode 100644 index 0000000..aa80062 --- /dev/null +++ b/src/composables/useInjectedSidebar.ts @@ -0,0 +1,20 @@ +import { isSidebarOpenKey } from '~/keys/sidebar' + +export function useInjectedSidebar() { + const isSidebarOpen = inject(isSidebarOpenKey) + + if (!isSidebarOpen) { + throw new Error('sidebar injection has not been provided by kei-chan') + } + + function toggle() { + if (typeof isSidebarOpen !== 'undefined') + isSidebarOpen.value = !isSidebarOpen.value + throw new Error('sidebar injection may has been provided by kei-chan but is undefined') + } + + return { + isSidebarOpen, + toggle, + } +} diff --git a/src/keys/sidebar.ts b/src/keys/sidebar.ts new file mode 100644 index 0000000..d4468d4 --- /dev/null +++ b/src/keys/sidebar.ts @@ -0,0 +1 @@ +export const isSidebarOpenKey: InjectionKey> = Symbol('kei-chan is injecting sidebar overlay') diff --git a/src/layouts/default.vue b/src/layouts/default.vue index a2388ca..8388110 100644 --- a/src/layouts/default.vue +++ b/src/layouts/default.vue @@ -1,6 +1,7 @@