naive-ui/demo/utils/ComponentDemo.vue

166 lines
3.4 KiB
Vue
Raw Normal View History

2019-09-29 17:54:20 +08:00
<i18n>
{
2019-12-23 16:31:26 +08:00
"zh-CN": {
2019-09-29 17:54:20 +08:00
"show": "显示代码",
"hide": "收起代码",
"editOnGithub": "在 Github 上编辑"
2019-09-29 17:54:20 +08:00
},
2019-12-23 16:31:26 +08:00
"en-US": {
2019-09-29 17:54:20 +08:00
"show": "Show Code",
"hide": "Hide Code",
"editOnGithub": "Edit on Github"
2019-09-29 17:54:20 +08:00
}
}
</i18n>
2019-09-17 19:24:39 +08:00
<template>
2019-12-22 23:19:08 +08:00
<n-card
2020-03-04 03:01:15 +08:00
v-if="isShow"
2019-12-22 23:19:08 +08:00
class="demo-card"
:segmented="{
footer: true
2019-09-17 19:24:39 +08:00
}"
2019-12-22 23:19:08 +08:00
:content-style="contentStyle"
2019-09-17 19:24:39 +08:00
>
2019-12-22 23:19:08 +08:00
<template v-slot:header>
2019-11-17 00:57:30 +08:00
<slot name="title" />
2019-12-22 23:19:08 +08:00
</template>
2020-03-09 17:18:01 +08:00
2019-12-22 23:19:08 +08:00
<template v-slot:header-extra>
2020-05-31 11:56:00 +08:00
<n-tooltip
:delay="300"
:placement="'top'"
:show-arrow="true"
>
<template v-slot:activator>
<edit-on-github-button
style="padding: 0; margin-right: 6px;"
size="tiny"
:url="url"
/>
</template>
{{ $t('editOnGithub') }}
</n-tooltip>
<n-tooltip
:delay="300"
:placement="'top'"
:show-arrow="true"
:controller="controller"
>
<template v-slot:activator>
<n-button
style="padding: 0;"
size="tiny"
text
icon-depth="tertiary"
@click="toggleCodeDisplay"
>
<template v-slot:icon>
<code-outline />
</template>
</n-button>
</template>
{{ !showCode ? $t('show') : $t('hide') }}
</n-tooltip>
2019-12-22 23:19:08 +08:00
</template>
<slot name="content" />
<slot name="demo" />
2019-12-23 22:18:04 +08:00
<template v-if="showCode" v-slot:footer>
2019-09-27 15:56:33 +08:00
<n-scrollbar>
<slot name="code" />
</n-scrollbar>
2019-12-22 23:19:08 +08:00
</template>
</n-card>
2019-09-17 19:24:39 +08:00
</template>
<script>
import codeOutline from '../../src/_icons/code-outline'
2020-09-03 17:02:31 +08:00
import { modeRef } from '../use-dev-mode'
2019-09-17 19:24:39 +08:00
export default {
2019-10-24 18:04:31 +08:00
components: {
2020-03-19 13:26:06 +08:00
codeOutline
2019-10-24 18:04:31 +08:00
},
props: {
title: {
type: String,
required: true
},
demoFileName: {
type: String,
required: true
2020-09-03 23:40:38 +08:00
},
demoFileNameWithExtension: {
type: String,
required: true
}
},
2019-10-14 17:49:23 +08:00
inject: {
NDocumentation: {
default: null
}
},
2019-09-17 19:24:39 +08:00
data () {
return {
2019-09-20 00:22:55 +08:00
showCode: false,
2019-12-22 23:19:08 +08:00
contentStyle: null,
2020-03-04 03:01:15 +08:00
controller: {},
isShow: true,
2020-09-03 17:02:31 +08:00
isDebugDemo: false,
modeRef
2020-03-04 03:01:15 +08:00
}
},
computed: {
mode () {
2020-09-03 17:02:31 +08:00
return this.modeRef.value
2020-03-09 17:18:01 +08:00
},
2020-09-03 23:40:38 +08:00
// TODO: make it move to loader
url () {
2020-09-03 23:40:38 +08:00
const relativePath = this.NDocumentation.url.replace(
'index.demo-entry.md',
this.demoFileNameWithExtension
)
2020-03-16 13:01:13 +08:00
return relativePath
2019-09-17 19:24:39 +08:00
}
},
2019-09-20 00:22:55 +08:00
watch: {
2019-09-29 19:07:16 +08:00
showCode () {
2019-12-22 23:19:08 +08:00
this.contentStyle = {
transition: 'none'
}
2019-09-29 19:07:16 +08:00
this.$nextTick().then(() => {
this.controller.updatePosition()
2019-12-22 23:19:08 +08:00
this.contentStyle = null
2019-09-29 19:07:16 +08:00
})
2020-03-04 03:01:15 +08:00
},
mode () {
this.init()
2019-09-20 00:22:55 +08:00
}
},
created () {
2020-03-04 03:01:15 +08:00
this.init()
2019-09-20 00:22:55 +08:00
},
2019-09-17 19:24:39 +08:00
methods: {
2019-09-20 00:22:55 +08:00
toggleCodeDisplay () {
2019-09-17 19:24:39 +08:00
this.showCode = !this.showCode
2020-03-04 03:01:15 +08:00
},
init () {
const map = this.NDocumentation.anchorLinkMap
this.isDebugDemo = this.demoFileName && (~this.demoFileName.indexOf('debug') || ~this.demoFileName.indexOf('Debug'))
2020-09-03 17:02:31 +08:00
if (this.isDebugDemo) {
2020-03-04 03:01:15 +08:00
if (this.mode === 'debug') {
this.isShow = true
map.set(this.demoFileName, this.title)
2020-03-04 03:01:15 +08:00
} else {
this.isShow = false
map.delete(this.demoFileName)
2020-03-04 03:01:15 +08:00
}
} else {
map.set(this.demoFileName, this.title)
2020-03-04 03:01:15 +08:00
}
this.NDocumentation.anchorLinkMap = new Map(map)
2019-09-17 19:24:39 +08:00
}
}
}
</script>