mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-30 07:53:09 +02:00
refactor(client): use css modules
This commit is contained in:
parent
d10e000883
commit
3f033d6ab7
5 changed files with 72 additions and 67 deletions
|
@ -52,7 +52,7 @@ watch(() => props.user.avatarBlurhash, () => {
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" module>
|
||||||
@keyframes earwiggleleft {
|
@keyframes earwiggleleft {
|
||||||
from { transform: rotate(37.6deg) skew(30deg); }
|
from { transform: rotate(37.6deg) skew(30deg); }
|
||||||
25% { transform: rotate(10deg) skew(30deg); }
|
25% { transform: rotate(10deg) skew(30deg); }
|
||||||
|
@ -68,9 +68,7 @@ watch(() => props.user.avatarBlurhash, () => {
|
||||||
75% { transform: rotate(0deg) skew(-30deg); }
|
75% { transform: rotate(0deg) skew(-30deg); }
|
||||||
to { transform: rotate(-37.6deg) skew(-30deg); }
|
to { transform: rotate(-37.6deg) skew(-30deg); }
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
|
|
||||||
<style lang="scss" module>
|
|
||||||
.root {
|
.root {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<XSidebar/>
|
<XSidebar/>
|
||||||
</div>
|
</div>
|
||||||
<div v-else ref="widgetsLeft" class="widgets left">
|
<div v-else ref="widgetsLeft" class="widgets left">
|
||||||
<XWidgets place="left" :classic="true" @mounted="attachSticky(widgetsLeft)"/>
|
<XWidgets place="left" :margin-top="'var(--margin)'" @mounted="attachSticky(widgetsLeft)"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<main class="main" :style="{ background: pageMetadata?.value?.bg }" @contextmenu.stop="onContextmenu">
|
<main class="main" :style="{ background: pageMetadata?.value?.bg }" @contextmenu.stop="onContextmenu">
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<div v-if="isDesktop" ref="widgetsRight" class="widgets right">
|
<div v-if="isDesktop" ref="widgetsRight" class="widgets right">
|
||||||
<XWidgets :place="showMenuOnTop ? 'right' : null" :classic="true" @mounted="attachSticky(widgetsRight)"/>
|
<XWidgets :place="showMenuOnTop ? 'right' : null" :margin-top="'var(--margin)'" @mounted="attachSticky(widgetsRight)"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ provide('shouldHeaderThin', showMenuOnTop);
|
||||||
provide('forceSpacerMin', true);
|
provide('forceSpacerMin', true);
|
||||||
|
|
||||||
function attachSticky(el) {
|
function attachSticky(el) {
|
||||||
const sticky = new StickySidebar(el, defaultStore.state.menuDisplay === 'top' ? 0 : 16, defaultStore.state.menuDisplay === 'top' ? 60 : 0); // TODO: ヘッダーの高さを60pxと決め打ちしているのを直す
|
const sticky = new StickySidebar(el, 0, defaultStore.state.menuDisplay === 'top' ? 60 : 0); // TODO: ヘッダーの高さを60pxと決め打ちしているのを直す
|
||||||
window.addEventListener('scroll', () => {
|
window.addEventListener('scroll', () => {
|
||||||
sticky.calc(window.scrollY);
|
sticky.calc(window.scrollY);
|
||||||
}, { passive: true });
|
}, { passive: true });
|
||||||
|
@ -248,7 +248,6 @@ onMounted(() => {
|
||||||
> .widgets {
|
> .widgets {
|
||||||
//--panelBorder: none;
|
//--panelBorder: none;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
margin-top: 16px;
|
|
||||||
|
|
||||||
@media (max-width: $widgets-hide-threshold) {
|
@media (max-width: $widgets-hide-threshold) {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
</MkStickyContainer>
|
</MkStickyContainer>
|
||||||
|
|
||||||
<div v-if="isDesktop" ref="widgetsEl" :class="$style.widgets">
|
<div v-if="isDesktop" ref="widgetsEl" :class="$style.widgets">
|
||||||
<XWidgets @mounted="attachSticky"/>
|
<XWidgets :margin-top="'var(--margin)'" @mounted="attachSticky"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button v-if="!isDesktop && !isMobile" :class="$style.widgetButton" class="_button" @click="widgetsShowing = true"><i class="ti ti-apps"></i></button>
|
<button v-if="!isDesktop && !isMobile" :class="$style.widgetButton" class="_button" @click="widgetsShowing = true"><i class="ti ti-apps"></i></button>
|
||||||
|
@ -26,7 +26,12 @@
|
||||||
<button :class="$style.navButton" class="_button post" @click="os.post()"><i :class="$style.navButtonIcon" class="ti ti-pencil"></i></button>
|
<button :class="$style.navButton" class="_button post" @click="os.post()"><i :class="$style.navButtonIcon" class="ti ti-pencil"></i></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Transition :name="$store.state.animation ? 'menuDrawer-back' : ''">
|
<Transition
|
||||||
|
:enter-active-class="$store.state.animation ? $style.transition_menuDrawerBg_enterActive : ''"
|
||||||
|
:leave-active-class="$store.state.animation ? $style.transition_menuDrawerBg_leaveActive : ''"
|
||||||
|
:enter-from-class="$store.state.animation ? $style.transition_menuDrawerBg_enterFrom : ''"
|
||||||
|
:leave-to-class="$store.state.animation ? $style.transition_menuDrawerBg_leaveTo : ''"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
v-if="drawerMenuShowing"
|
v-if="drawerMenuShowing"
|
||||||
:class="$style.menuDrawerBg"
|
:class="$style.menuDrawerBg"
|
||||||
|
@ -36,11 +41,21 @@
|
||||||
></div>
|
></div>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
||||||
<Transition :name="$store.state.animation ? 'menuDrawer' : ''">
|
<Transition
|
||||||
|
:enter-active-class="$store.state.animation ? $style.transition_menuDrawer_enterActive : ''"
|
||||||
|
:leave-active-class="$store.state.animation ? $style.transition_menuDrawer_leaveActive : ''"
|
||||||
|
:enter-from-class="$store.state.animation ? $style.transition_menuDrawer_enterFrom : ''"
|
||||||
|
:leave-to-class="$store.state.animation ? $style.transition_menuDrawer_leaveTo : ''"
|
||||||
|
>
|
||||||
<XDrawerMenu v-if="drawerMenuShowing" :class="$style.menuDrawer"/>
|
<XDrawerMenu v-if="drawerMenuShowing" :class="$style.menuDrawer"/>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
||||||
<Transition :name="$store.state.animation ? 'widgetsDrawer-back' : ''">
|
<Transition
|
||||||
|
:enter-active-class="$store.state.animation ? $style.transition_widgetsDrawerBg_enterActive : ''"
|
||||||
|
:leave-active-class="$store.state.animation ? $style.transition_widgetsDrawerBg_leaveActive : ''"
|
||||||
|
:enter-from-class="$store.state.animation ? $style.transition_widgetsDrawerBg_enterFrom : ''"
|
||||||
|
:leave-to-class="$store.state.animation ? $style.transition_widgetsDrawerBg_leaveTo : ''"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
v-if="widgetsShowing"
|
v-if="widgetsShowing"
|
||||||
:class="$style.widgetsDrawerBg"
|
:class="$style.widgetsDrawerBg"
|
||||||
|
@ -50,8 +65,15 @@
|
||||||
></div>
|
></div>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
||||||
<Transition :name="$store.state.animation ? 'widgetsDrawer' : ''">
|
<Transition
|
||||||
<XWidgets v-if="widgetsShowing" :class="$style.widgetsDrawer"/>
|
:enter-active-class="$store.state.animation ? $style.transition_widgetsDrawer_enterActive : ''"
|
||||||
|
:leave-active-class="$store.state.animation ? $style.transition_widgetsDrawer_leaveActive : ''"
|
||||||
|
:enter-from-class="$store.state.animation ? $style.transition_widgetsDrawer_enterFrom : ''"
|
||||||
|
:leave-to-class="$store.state.animation ? $style.transition_widgetsDrawer_leaveTo : ''"
|
||||||
|
>
|
||||||
|
<div v-if="widgetsShowing" :class="$style.widgetsDrawer">
|
||||||
|
<XWidgets/>
|
||||||
|
</div>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
||||||
<XCommon/>
|
<XCommon/>
|
||||||
|
@ -176,55 +198,53 @@ function top() {
|
||||||
const wallpaper = miLocalStorage.getItem('wallpaper') != null;
|
const wallpaper = miLocalStorage.getItem('wallpaper') != null;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" module>
|
||||||
.widgetsDrawer-enter-active,
|
$ui-font-size: 1em; // TODO: どこかに集約したい
|
||||||
.widgetsDrawer-leave-active {
|
$widgets-hide-threshold: 1090px;
|
||||||
opacity: 1;
|
|
||||||
transform: translateX(0);
|
|
||||||
transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
|
||||||
}
|
|
||||||
.widgetsDrawer-enter-from,
|
|
||||||
.widgetsDrawer-leave-active {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateX(240px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.widgetsDrawer-back-enter-active,
|
.transition_menuDrawerBg_enterActive,
|
||||||
.widgetsDrawer-back-leave-active {
|
.transition_menuDrawerBg_leaveActive {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
}
|
}
|
||||||
.widgetsDrawer-back-enter-from,
|
.transition_menuDrawerBg_enterFrom,
|
||||||
.widgetsDrawer-back-leave-active {
|
.transition_menuDrawerBg_leaveTo {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menuDrawer-enter-active,
|
.transition_menuDrawer_enterActive,
|
||||||
.menuDrawer-leave-active {
|
.transition_menuDrawer_leaveActive {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: translateX(0);
|
transform: translateX(0);
|
||||||
transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
}
|
}
|
||||||
.menuDrawer-enter-from,
|
.transition_menuDrawer_enterFrom,
|
||||||
.menuDrawer-leave-active {
|
.transition_menuDrawer_leaveTo {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateX(-240px);
|
transform: translateX(-240px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.menuDrawer-back-enter-active,
|
.transition_widgetsDrawerBg_enterActive,
|
||||||
.menuDrawer-back-leave-active {
|
.transition_widgetsDrawerBg_leaveActive {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
}
|
}
|
||||||
.menuDrawer-back-enter-from,
|
.transition_widgetsDrawerBg_enterFrom,
|
||||||
.menuDrawer-back-leave-active {
|
.transition_widgetsDrawerBg_leaveTo {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
|
|
||||||
<style lang="scss" module>
|
.transition_widgetsDrawer_enterActive,
|
||||||
$ui-font-size: 1em; // TODO: どこかに集約したい
|
.transition_widgetsDrawer_leaveActive {
|
||||||
$widgets-hide-threshold: 1090px;
|
opacity: 1;
|
||||||
|
transform: translateX(0);
|
||||||
|
transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
|
}
|
||||||
|
.transition_widgetsDrawer_enterFrom,
|
||||||
|
.transition_widgetsDrawer_leaveTo {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateX(240px);
|
||||||
|
}
|
||||||
|
|
||||||
.root {
|
.root {
|
||||||
min-height: 100dvh;
|
min-height: 100dvh;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="efzpzdvf" :class="{ universal: !classic, classic }">
|
<div :class="$style.root" :style="{ paddingTop: marginTop }">
|
||||||
<XWidgets :edit="editMode" :widgets="widgets" @add-widget="addWidget" @remove-widget="removeWidget" @update-widget="updateWidget" @update-widgets="updateWidgets" @exit="editMode = false"/>
|
<XWidgets :class="$style.widgets" :edit="editMode" :widgets="widgets" @add-widget="addWidget" @remove-widget="removeWidget" @update-widget="updateWidget" @update-widgets="updateWidgets" @exit="editMode = false"/>
|
||||||
|
|
||||||
<button v-if="editMode" class="_textButton" style="font-size: 0.9em;" @click="editMode = false"><i class="ti ti-check"></i> {{ i18n.ts.editWidgetsExit }}</button>
|
<button v-if="editMode" class="_textButton" style="font-size: 0.9em;" @click="editMode = false"><i class="ti ti-check"></i> {{ i18n.ts.editWidgetsExit }}</button>
|
||||||
<button v-else class="_textButton mk-widget-edit" style="font-size: 0.9em;" @click="editMode = true"><i class="ti ti-pencil"></i> {{ i18n.ts.editWidgets }}</button>
|
<button v-else class="_textButton mk-widget-edit" style="font-size: 0.9em;" @click="editMode = true"><i class="ti ti-pencil"></i> {{ i18n.ts.editWidgets }}</button>
|
||||||
|
@ -21,10 +21,10 @@ const props = withDefaults(defineProps<{
|
||||||
// left = place: leftだけを表示
|
// left = place: leftだけを表示
|
||||||
// right = rightとnullを表示
|
// right = rightとnullを表示
|
||||||
place?: 'left' | null | 'right';
|
place?: 'left' | null | 'right';
|
||||||
classic?: boolean;
|
marginTop?: string;
|
||||||
}>(), {
|
}>(), {
|
||||||
place: null,
|
place: null,
|
||||||
classic: false,
|
marginTop: '0',
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
|
@ -81,31 +81,15 @@ function updateWidgets(thisWidgets) {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" module>
|
||||||
.efzpzdvf {
|
.root {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
height: min-content;
|
height: min-content;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
&.universal {
|
.widgets {
|
||||||
padding-top: var(--margin);
|
width: 300px;
|
||||||
|
|
||||||
> * {
|
|
||||||
margin: var(--margin) 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> * {
|
|
||||||
width: 300px;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .add {
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -59,7 +59,11 @@ export default defineConfig(({ command, mode }) => {
|
||||||
css: {
|
css: {
|
||||||
modules: {
|
modules: {
|
||||||
generateScopedName: (name, filename, css) => {
|
generateScopedName: (name, filename, css) => {
|
||||||
return 'x' + toBase62(hash(`${filename} ${name}`)).substring(0, 4);
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
return 'x' + toBase62(hash(`${filename} ${name}`)).substring(0, 4);
|
||||||
|
} else {
|
||||||
|
return 'x' + toBase62(hash(`${filename} ${name}`)).substring(0, 4) + '-' + name;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue