jscdn.ink/dist/components/header.js

195 lines
4.5 KiB
JavaScript
Raw Normal View History

2023-11-14 19:14:01 +08:00
import { html, css, Component, classMap } from 'wkit'
2023-11-15 18:34:34 +08:00
import { watch } from 'wkitd'
2023-11-14 19:14:01 +08:00
import fetch from '/lib/fetch.js'
class Header extends Component {
static styles = css`
2023-11-15 18:34:34 +08:00
::selection {
background: var(--color-plain-a);
}
2023-11-14 19:14:01 +08:00
.common-header {
flex-shrink: 0;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
width: 100%;
height: 240px;
background: var(--color-red-1);
color: #fff;
.wrapper {
display: flex;
width: 1024px;
justify-content: space-between;
align-items: center;
}
.navibar {
height: 36px;
margin-top: 24px;
.logo {
font-weight: bold;
font-size: 26px;
& img {
display: block;
height: 36px;
}
}
.navi {
display: flex;
align-items: center;
font-size: 16px;
& router-link {
margin: 0 16px;
padding: 3px 6px;
border-radius: 4px;
transition: background 0.2s ease-in-out;
2023-11-15 18:34:34 +08:00
&:hover,
&.active {
2023-11-14 19:14:01 +08:00
background: rgba(255, 255, 255, 0.3);
}
}
}
}
.banner {
width: 640px;
text-align: center;
}
.search {
display: none;
width: 520px;
color: #fff;
--bg-color: rgba(0, 0, 0, 0.3);
}
&.search-show {
height: 320px;
.search {
display: inline-block;
2023-11-15 18:34:34 +08:00
--wc-input-border-color: none;
2023-11-14 19:14:01 +08:00
}
}
&::after {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 48px;
font-size: 16px;
background: rgba(0, 0, 0, 0.1);
content: '免费、快速、开放的 CDN 服务';
}
}
@media screen and (max-width: 1024px) {
.common-header {
.navibar {
width: 100%;
padding: 0 32px;
}
.wrapper {
width: 100%;
}
}
}
`
2023-11-15 18:34:34 +08:00
#search(ev) {
let id = this.$store.searchInput
2023-11-14 19:14:01 +08:00
if (id) {
2023-11-15 18:34:34 +08:00
fetch('/package/search/' + encodeURIComponent(id))
.then(r => {
let dict = { versions: [], id }
let last = null
for (let it of r.data) {
let tmp = it.split('/')
let v = tmp.shift()
let n = tmp.join('/')
if (last === v) {
dict[last].push(n)
} else {
last = v
dict.versions.push(last)
dict[last] = [n]
}
2023-11-14 19:14:01 +08:00
}
2023-11-15 18:34:34 +08:00
dict.version = last
this.$store.result = dict
})
.catch(err => {
this.$store.result = { version: '', versions: [], id: '' }
})
2023-11-14 19:14:01 +08:00
} else {
2023-11-15 18:34:34 +08:00
this.$store.result = { version: '', versions: [], id: '' }
2023-11-14 19:14:01 +08:00
}
}
2023-11-15 18:34:34 +08:00
#handleInput(ev) {
this.$store.searchInput = ev.target.value
}
mounted() {
watch('$store.searchInput', val => {
this.#search()
})
watch('$route', route => {
if (route.path === '/' && !route.query.name) {
this.$store.searchInput = ''
}
})
}
2023-11-14 19:14:01 +08:00
render() {
return html`
<div
2023-11-15 18:34:34 +08:00
class=${classMap({
'common-header': true,
'search-show': this.$store.searchShow
})}
2023-11-14 19:14:01 +08:00
>
<header class="navibar">
<div class="wrapper">
<a class="logo"><img src="/assets/logo.svg" /></a>
<nav class="navi">
<router-link :to=${{ path: '/' }}> </router-link>
<router-link :to=${{ path: '/request' }}> </router-link>
<router-link :to=${{ path: '/about' }}> </router-link>
</nav>
</div>
</header>
<cite class="banner">
<p>
我们的目标是提供这样一个仓库让它尽可能全面收录优秀的支持ESM访问的开源库并免费为之提供
CDN加速服务使之有更好的访问速度和稳定的环境
</p>
<p>同时我们也提供自主提交开源库的收录(前提是在npm上发布的)</p>
</cite>
<wc-input
class="search"
no-border
placeholder="请输入开源库的名字~~"
clearable
2023-11-15 18:34:34 +08:00
value=${this.$store.searchInput}
@submit=${this.#handleInput}
@change=${this.#handleInput}
2023-11-14 19:14:01 +08:00
></wc-input>
</div>
`
}
}
Header.reg('header')