summaryrefslogtreecommitdiff
path: root/src/client/components
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-10-14 20:55:59 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-10-14 20:55:59 +0900
commit3ec6101b160d6ebbffda1ff6bf4873c49f3253b5 (patch)
tree26d2b5fd91f6b55edbc6cfca7d5413bb030c02ce /src/client/components
parent:art: (diff)
downloadsharkey-3ec6101b160d6ebbffda1ff6bf4873c49f3253b5.tar.gz
sharkey-3ec6101b160d6ebbffda1ff6bf4873c49f3253b5.tar.bz2
sharkey-3ec6101b160d6ebbffda1ff6bf4873c49f3253b5.zip
:art:
Diffstat (limited to 'src/client/components')
-rw-r--r--src/client/components/global/spacer.vue70
-rw-r--r--src/client/components/index.ts2
2 files changed, 72 insertions, 0 deletions
diff --git a/src/client/components/global/spacer.vue b/src/client/components/global/spacer.vue
new file mode 100644
index 0000000000..9037de466c
--- /dev/null
+++ b/src/client/components/global/spacer.vue
@@ -0,0 +1,70 @@
+<template>
+<div ref="root" :class="$style.root" :style="{ padding: margin + 'px' }">
+ <div ref="content" :class="$style.content">
+ <slot></slot>
+ </div>
+</div>
+</template>
+
+<script lang="ts">
+import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
+
+export default defineComponent({
+ props: {
+ contentMax: {
+ type: Number,
+ required: false,
+ default: null,
+ }
+ },
+
+ setup(props, context) {
+ let ro: ResizeObserver;
+ const root = ref<HTMLElement>(null);
+ const content = ref<HTMLElement>(null);
+ const margin = ref(0);
+ const adjust = (rect: { width: number; height: number; }) => {
+ if (rect.width > (props.contentMax || 500)) {
+ margin.value = 32;
+ } else {
+ margin.value = 12;
+ }
+ };
+
+ onMounted(() => {
+ ro = new ResizeObserver((entries) => {
+ adjust({
+ width: entries[0].borderBoxSize[0].inlineSize,
+ height: entries[0].borderBoxSize[0].blockSize,
+ });
+ });
+ ro.observe(root.value);
+
+ if (props.contentMax) {
+ content.value.style.maxWidth = `${props.contentMax}px`;
+ }
+ });
+
+ onUnmounted(() => {
+ ro.disconnect();
+ });
+
+ return {
+ root,
+ content,
+ margin,
+ };
+ },
+});
+</script>
+
+<style lang="scss" module>
+.root {
+ box-sizing: border-box;
+ width: 100%;
+}
+
+.content {
+ margin: 0 auto;
+}
+</style>
diff --git a/src/client/components/index.ts b/src/client/components/index.ts
index 8f071dfce1..ecf66ea0e8 100644
--- a/src/client/components/index.ts
+++ b/src/client/components/index.ts
@@ -14,6 +14,7 @@ import loading from './global/loading.vue';
import error from './global/error.vue';
import ad from './global/ad.vue';
import header from './global/header.vue';
+import spacer from './global/spacer.vue';
export default function(app: App) {
app.component('I18n', i18n);
@@ -30,4 +31,5 @@ export default function(app: App) {
app.component('MkError', error);
app.component('MkAd', ad);
app.component('MkHeader', header);
+ app.component('MkSpacer', spacer);
}