Merge branch 'dev' into preview
This commit is contained in:
commit
ba857d8e36
9 changed files with 176 additions and 28 deletions
132
CODE_OF_CONDUCT.md
Normal file
132
CODE_OF_CONDUCT.md
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||
identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
- Demonstrating empathy and kindness toward other people
|
||||
- Being respectful of differing opinions, viewpoints, and experiences
|
||||
- Giving and gracefully accepting constructive feedback
|
||||
- Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
- Focusing on what is best not just for us as individuals, but for the overall
|
||||
community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
- The use of sexualized language or imagery, and sexual attention or advances of
|
||||
any kind
|
||||
- Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information, such as a physical or email address,
|
||||
without their explicit permission
|
||||
- Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official email address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
<chi@miantiao.me>.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of
|
||||
actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||
community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.1, available at
|
||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
Community Impact Guidelines were inspired by
|
||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||
[https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
|
|
@ -67,8 +67,10 @@ Site Token: SinkCool
|
|||
|
||||
We welcome your contributions and PRs.
|
||||
|
||||
- [ ] Browser Extension
|
||||
- [ ] Raycast Extension
|
||||
- [x] Browser Extension
|
||||
- [Sink Tool](https://github.com/zhuzhuyule/sink-extension)
|
||||
- [x] Raycast Extension
|
||||
- [Raycast-Sink](https://github.com/foru17/raycast-sink)
|
||||
- [ ] Apple Shortcuts
|
||||
- [ ] Enhanced Link Management (with Cloudflare D1)
|
||||
- [ ] Analytics Enhancements (Support for merging filter conditions)
|
||||
|
|
@ -78,6 +80,8 @@ We welcome your contributions and PRs.
|
|||
|
||||
## 🏗️ Deployment
|
||||
|
||||
> Video tutorial: <https://www.youtube.com/watch?v=MkU23U2VE9E>
|
||||
|
||||
1. [Fork](https://github.com/ccbikai/Sink/fork) the repository to your GitHub account.
|
||||
2. Create a [Cloudflare Pages](https://developers.cloudflare.com/pages/) project.
|
||||
3. Select the `Sink` repository and the `Nuxt.js` preset.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
export default defineAppConfig({
|
||||
title: 'Sink',
|
||||
twitter: 'https://x.com/0xKaiBi',
|
||||
github: 'https://github.com/ccbikai/sink',
|
||||
email: 'sink.cool@miantiao.me',
|
||||
telegram: 'https://t.me/htmlzone',
|
||||
mastodon: 'https://c.im/@mt',
|
||||
blog: 'https://mt.ci',
|
||||
description: 'A Simple / Speedy / Secure Link Shortener with Analytics, 100% run on Cloudflare.',
|
||||
image: 'https://sink.cool/banner.png',
|
||||
previewTTL: 24 * 3600, // 24h
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ defineProps({
|
|||
required: true,
|
||||
},
|
||||
})
|
||||
const { title } = useAppConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -14,7 +15,7 @@ defineProps({
|
|||
<BreadcrumbList>
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbLink href="/">
|
||||
Sink
|
||||
{{ title }}
|
||||
</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
<BreadcrumbSeparator />
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { AreaChart } from 'lucide-vue-next'
|
|||
import { GitHubIcon } from 'vue3-simple-icons'
|
||||
import heroImg from '@/assets/images/hero.svg?raw'
|
||||
|
||||
const { title, description } = useAppConfig()
|
||||
const { title, description, github } = useAppConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -36,7 +36,7 @@ const { title, description } = useAppConfig()
|
|||
size="lg"
|
||||
type="outline"
|
||||
rel="noopener"
|
||||
href="https://github.com/ccbikai/sink"
|
||||
:href="github"
|
||||
title="Github"
|
||||
class="flex items-center justify-center gap-1"
|
||||
target="_blank"
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
<script setup>
|
||||
import { XIcon } from 'vue3-simple-icons'
|
||||
import { ArrowRight } from 'lucide-vue-next'
|
||||
|
||||
const { twitter } = useAppConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<a
|
||||
href="https://x.com/0xKaiBi"
|
||||
:href="twitter"
|
||||
target="_blank"
|
||||
title="X(Twitter)"
|
||||
class="inline-flex items-center px-3 py-1 mx-auto my-4 space-x-1 text-sm font-medium rounded-lg bg-muted"
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
<script setup>
|
||||
import { BloggerIcon, GitHubIcon, GmailIcon, MastodonIcon, TelegramIcon, XIcon } from 'vue3-simple-icons'
|
||||
|
||||
const email = ref(null)
|
||||
onMounted(() => {
|
||||
email.value.href = email.value.href.replace('$', '@')
|
||||
})
|
||||
const { title, email, telegram, blog, twitter, mastodon, github } = useAppConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -13,8 +10,8 @@ onMounted(() => {
|
|||
<a
|
||||
href="/"
|
||||
class="text-xl font-black leading-none text-gray-900 select-none dark:text-gray-100 logo"
|
||||
title="Sink"
|
||||
>Sink</a>
|
||||
:title="title"
|
||||
>{{ title }}</a>
|
||||
<a
|
||||
class="mt-4 text-sm text-gray-500 sm:ml-4 sm:pl-4 sm:border-l sm:border-gray-200 sm:mt-0"
|
||||
href="https://html.zone"
|
||||
|
|
@ -27,8 +24,8 @@ onMounted(() => {
|
|||
class="inline-flex justify-center mt-4 space-x-5 sm:ml-auto sm:mt-0 sm:justify-start"
|
||||
>
|
||||
<a
|
||||
ref="email"
|
||||
href="mailto:sink.cool$miantiao.me"
|
||||
v-if="email"
|
||||
:href="`mailto:${email}`"
|
||||
title="Email"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
>
|
||||
|
|
@ -38,7 +35,8 @@ onMounted(() => {
|
|||
/>
|
||||
</a>
|
||||
<a
|
||||
href="https://t.me/htmlzone"
|
||||
v-if="telegram"
|
||||
:href="telegram"
|
||||
target="_blank"
|
||||
title="Telegram"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
|
|
@ -49,7 +47,8 @@ onMounted(() => {
|
|||
/>
|
||||
</a>
|
||||
<a
|
||||
href="https://mt.ci"
|
||||
v-if="blog"
|
||||
:href="blog"
|
||||
target="_blank"
|
||||
title="Blog"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
|
|
@ -61,7 +60,8 @@ onMounted(() => {
|
|||
</a>
|
||||
|
||||
<a
|
||||
href="https://x.com/0xKaiBi"
|
||||
v-if="twitter"
|
||||
:href="twitter"
|
||||
target="_blank"
|
||||
title="Twitter"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
|
|
@ -73,7 +73,8 @@ onMounted(() => {
|
|||
</a>
|
||||
|
||||
<a
|
||||
href="https://miantiao.me/@chi"
|
||||
v-if="mastodon"
|
||||
:href="mastodon"
|
||||
target="_blank"
|
||||
title="Mastodon"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
|
|
@ -85,7 +86,8 @@ onMounted(() => {
|
|||
</a>
|
||||
|
||||
<a
|
||||
href="https://github.com/ccbikai"
|
||||
v-if="github"
|
||||
:href="github"
|
||||
target="_blank"
|
||||
title="GitHub"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import { GitHubIcon } from 'vue3-simple-icons'
|
|||
import SwitchTheme from '../SwitchTheme.vue'
|
||||
|
||||
const showMenu = ref(false)
|
||||
const { title, github } = useAppConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -15,7 +16,7 @@ const showMenu = ref(false)
|
|||
<div class="flex items-center justify-start w-1/4 h-full pr-4">
|
||||
<a
|
||||
href="/"
|
||||
title="Sink"
|
||||
:title="title"
|
||||
class="flex items-center py-4 space-x-2 text-xl font-black text-gray-900 dark:text-gray-100 md:py-0"
|
||||
>
|
||||
<span
|
||||
|
|
@ -23,11 +24,11 @@ const showMenu = ref(false)
|
|||
>
|
||||
<img
|
||||
src="/sink.png"
|
||||
alt="Sink"
|
||||
:alt="title"
|
||||
class="w-full h-full rounded-full"
|
||||
>
|
||||
</span>
|
||||
<span class="mx-2">Sink</span>
|
||||
<span class="mx-2">{{ title }}</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
|
@ -41,7 +42,7 @@ const showMenu = ref(false)
|
|||
>
|
||||
<a
|
||||
href="/"
|
||||
title="Sink"
|
||||
:title="title"
|
||||
class="inline-flex items-center w-auto h-16 px-4 text-xl font-black leading-none text-gray-900 dark:text-gray-100 md:hidden"
|
||||
>
|
||||
<span
|
||||
|
|
@ -49,11 +50,11 @@ const showMenu = ref(false)
|
|||
>
|
||||
<img
|
||||
src="/sink.png"
|
||||
alt="Sink"
|
||||
:alt="title"
|
||||
class="w-full h-full rounded-full"
|
||||
>
|
||||
</span>
|
||||
<span class="mx-2">Sink</span>
|
||||
<span class="mx-2">{{ title }}</span>
|
||||
</a>
|
||||
<div class="w-full mx-4" />
|
||||
<div
|
||||
|
|
@ -62,10 +63,10 @@ const showMenu = ref(false)
|
|||
<a
|
||||
class="w-full px-6 py-2 mr-0 text-gray-700 cursor-pointer dark:text-gray-300 md:px-3 md:mr-2 lg:mr-3 md:w-auto"
|
||||
href="/dashboard"
|
||||
title="Sink Dashboard"
|
||||
:title="`${title} Dashboard`"
|
||||
>Dashboard</a>
|
||||
<a
|
||||
href="https://github.com/ccbikai/sink"
|
||||
:href="github"
|
||||
target="_blank"
|
||||
title="Github"
|
||||
class="inline-flex items-center w-full px-6 py-3 text-sm font-medium leading-4 text-white bg-gray-900 md:px-3 md:w-auto md:rounded-full hover:bg-gray-800 focus:outline-none md:focus:ring-2 focus:ring-0 focus:ring-offset-2 focus:ring-gray-800"
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { parsePath, withQuery } from 'ufo'
|
|||
import type { LinkSchema } from '@/schemas/link'
|
||||
|
||||
export default eventHandler(async (event) => {
|
||||
const { pathname: slug } = parsePath(event.path.slice(1)) // remove leading slash
|
||||
const { pathname: slug } = parsePath(event.path.replace(/^\/|\/$/g, '')) // remove leading and trailing slashes
|
||||
const { slugRegex, reserveSlug } = useAppConfig(event)
|
||||
const { homeURL, linkCacheTtl, redirectWithQuery } = useRuntimeConfig(event)
|
||||
const { cloudflare } = event.context
|
||||
|
|
|
|||
Loading…
Reference in a new issue