diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-10-14 20:55:59 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-10-14 20:55:59 +0900 |
| commit | 3ec6101b160d6ebbffda1ff6bf4873c49f3253b5 (patch) | |
| tree | 26d2b5fd91f6b55edbc6cfca7d5413bb030c02ce /src/client/components | |
| parent | :art: (diff) | |
| download | sharkey-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.vue | 70 | ||||
| -rw-r--r-- | src/client/components/index.ts | 2 |
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); } |