Skip to content

Commit

Permalink
add: UniWidgets
Browse files Browse the repository at this point in the history
  • Loading branch information
HoshinoSuzumi committed Jun 8, 2023
1 parent c455da5 commit bb8cbec
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {defineComponent} from 'vue'
import {Icon} from "@iconify/vue2";
export default defineComponent({
name: "SettingsArea",
name: "Area",
components: {Icon},
props: {
title: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import {defineComponent} from 'vue'
export default defineComponent({
name: "SettingsItemDivider",
name: "Divider",
props: {
forItem: {
type: Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {defineComponent} from 'vue'
import {Icon} from "@iconify/vue2";
export default defineComponent({
name: "SettingsItem",
name: "Item",
components: {Icon},
props: {
title: {
Expand Down
68 changes: 0 additions & 68 deletions components/settings/form/SettingsFormInput.vue

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import {defineComponent} from 'vue'
export default defineComponent({
name: "SettingsButton",
name: "Button",
props: {
ghost: {
type: Boolean,
Expand All @@ -12,6 +12,10 @@ export default defineComponent({
type: Boolean,
default: false
},
mini: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
Expand Down Expand Up @@ -45,7 +49,8 @@ export default defineComponent({
:class="{
'text-red-500 dark:text-red-400/80': danger,
'text-gray-500/60 dark:text-slate-500/40 bg-gray-200 hover:bg-gray-200 dark:!bg-slate-900 dark:hover:!bg-slate-900': disabled,
'!text-red-500/40 dark:!text-red-400/20': disabled && danger
'!text-red-500/40 dark:!text-red-400/20': disabled && danger,
'!px-2 !py-0.5': mini
}"
:disabled="disabled"
@click="handleClick">
Expand Down
125 changes: 125 additions & 0 deletions components/uni/Input.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<script>
import {defineComponent} from 'vue'
import {Icon} from "@iconify/vue2";
import {copyTextToClipboard} from "~/libs/common";
export default defineComponent({
name: "Input",
components: {Icon},
props: {
value: {
type: String | Number,
default: ''
},
type: {
type: String,
default: 'text'
},
label: {
type: String,
default: ''
},
placeholder: {
type: String,
default: ''
},
disabled: {
type: Boolean,
default: false
},
pattern: {
type: RegExp,
default: null
},
copyable: {
type: Boolean,
default: false
},
},
data() {
return {
inputFieldId: `input-${Math.random().toString(16).slice(2, 9)}`,
isValid: true,
copyTip: false,
}
},
mounted() {
this.isValid = this.validator(this.value)
},
methods: {
validator(str) {
return this.pattern ? this.pattern.test(str) : true
},
handleInput(e) {
this.eventValue = e.target.value
// this.$refs.input.value = this.eventValue
this.isValid = this.validator(this.eventValue)
if (this.isValid) {
this.$emit('input', this.eventValue)
}
},
copyHandler() {
copyTextToClipboard(this.value, ret => {
this.copyTip = true
setTimeout(() => {
this.copyTip = false
}, 1000)
})
},
clearHandler() {
this.$emit('input', '')
}
},
})
</script>

<template>
<div class="relative">
<label v-if="label" :for="inputFieldId"
class="block w-fit text-gray-700 dark:text-slate-300 text-sm font-bold font-['Nunito'] mb-1">{{
label
}}</label>
<input class="p-2 pr-8 rounded-md border border-gray-300 focus:border-gray-400 dark:border-slate-800 dark:focus:border-slate-700 dark:bg-slate-800
dark:text-slate-300 focus:outline-none focus:ring-4 focus:ring-gray-200 w-full h-full input-field
dark:focus:ring-slate-800 focus:ring-opacity-50 dark:focus:ring-opacity-50 transition"
:class="{
'text-gray-500/60 dark:text-slate-500/60 bg-gray-200/40 dark:!bg-slate-800/40': disabled,
'!border-red-500': !isValid,
}"
@input="handleInput"
@change="$emit('change', $event.target.value)"
:id="inputFieldId"
:value="value" :type="type"
:disabled="disabled" ref="input"
:placeholder="placeholder"/>
<div class="absolute inset-y-0 right-2 my-auto w-fit flex flex-row items-center space-x-1 overflow-hidden"
:class="{
'top-6': label
}">
<button class="text-slate-500 w-6 h-6 flex justify-center items-center btn-copy border-transparent"
:class="{'text-emerald-500': copyTip}"
tabindex="-1" type="button" @mousedown="copyHandler"
v-show="copyable && value">
<Icon :icon="copyTip ? 'tabler:check' : 'tabler:copy'" class="text-lg opacity-50"/>
</button>
<button class="text-slate-500 opacity-50 btn-clear !-mr-6" tabindex="-1" type="button"
@mousedown="clearHandler">
<Icon icon="tabler:clear-all" class="text-xl"/>
</button>
</div>
</div>
</template>

<style scoped>
.input-field + div > button {
@apply transition-all;
}
.input-field:focus + div > button.btn-copy {
@apply shadow-sm bg-white rounded-md border border-slate-300;
}
.input-field:focus + div > button.btn-clear {
@apply !-mr-0;
}
</style>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {defineComponent} from 'vue'
import {Icon} from "@iconify/vue2";
export default defineComponent({
name: "SettingsLink",
name: "Link",
components: {Icon},
props: {
href: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {defineComponent} from 'vue'
import {Icon} from "@iconify/vue2";
export default defineComponent({
name: "SettingsFormSelect",
name: "Select",
components: {Icon},
props: {
options: {
Expand Down
59 changes: 50 additions & 9 deletions pages/settings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ export default defineComponent({
server_endpoint: '',
server_status: 'checking...',
server_version: '',
input_val: ''
}
},
computed: {
Expand Down Expand Up @@ -134,12 +136,12 @@ export default defineComponent({
icon="tabler:layout">
<SettingsItem :title="$t('settings.appearance.language.label').toString()">
<template #actions>
<SettingsFormSelect :options="languageOptions" v-model="language"/>
<UniSelect :options="languageOptions" v-model="language"/>
</template>
</SettingsItem>
<SettingsItem :title="$t('settings.appearance.color_mode.label').toString()">
<template #actions>
<SettingsFormSelect :options="colorModeOptions" v-model="darkMode"/>
<UniSelect :options="colorModeOptions" v-model="darkMode"/>
</template>
</SettingsItem>
</SettingsArea>
Expand All @@ -150,24 +152,24 @@ export default defineComponent({
:title="$t('settings.about.version.label').toString()"
:subtitle="$config.version">
<template #actions>
<SettingsButton ghost>{{ $t('settings.about.version.check_update_logs').toString() }}</SettingsButton>
<UniButton ghost>{{ $t('settings.about.version.check_update_logs').toString() }}</UniButton>
</template>
</SettingsItem>
<SettingsItem
:title="$t('settings.about.follow_us.label').toString()"
:subtitle="$t('settings.about.follow_us.subtitle').toString()">
<template #actions>
<SettingsLink href="https://github.com/UniiemStudio/CTFever" external>GitHub</SettingsLink>
<SettingsLink href="https://t.me/boxmoe" external>Telegram</SettingsLink>
<UniLink href="https://github.com/UniiemStudio/CTFever" external>GitHub</UniLink>
<UniLink href="https://t.me/boxmoe" external>Telegram</UniLink>
</template>
</SettingsItem>
<SettingsItem
:title="$t('settings.about.donate.label').toString()"
:subtitle="$t('settings.about.donate.subtitle').toString()">
<template #actions>
<SettingsLink href="https://afdian.net/a/hoshino_suzumi" external>
<UniLink href="https://afdian.net/a/hoshino_suzumi" external>
{{ $t('settings.about.donate.link.afdian').toString() }}
</SettingsLink>
</UniLink>
</template>
</SettingsItem>
</SettingsArea>
Expand All @@ -192,9 +194,48 @@ export default defineComponent({
:title="$t('settings.danger_zone.wipe.label').toString()"
:subtitle="$t('settings.danger_zone.wipe.subtitle').toString()">
<template #actions>
<SettingsButton @click="handleWipe" danger>
<UniButton @click="handleWipe" danger>
{{ $t('settings.danger_zone.wipe.btn').toString() }}
</SettingsButton>
</UniButton>
</template>
</SettingsItem>
</SettingsArea>
<SettingsDivider/>
<SettingsArea
title="组件展柜"
icon="tabler:components">
<SettingsItem
title="Buttons">
<template #actions>
<UniButton ghost>ghost</UniButton>
<UniButton ghost disabled>ghost</UniButton>
<UniButton>normal</UniButton>
<UniButton danger>danger</UniButton>
<UniButton disabled>normal</UniButton>
<UniButton danger disabled>danger</UniButton>
<UniButton mini>mini</UniButton>
<UniButton mini disabled>mini</UniButton>
</template>
</SettingsItem>
<SettingsItem
title="Links">
<template #actions>
<UniLink href="https://github.com" external>External</UniLink>
<UniLink href="https://github.com">Normal</UniLink>
</template>
</SettingsItem>
<SettingsItem
title="Inputs">
<template #actions>
<UniInput v-model="input_val" label="With label"/>
<UniInput v-model="input_val" placeholder="input..." copyable/>
<UniInput v-model="input_val" placeholder="input..." disabled/>
</template>
</SettingsItem>
<SettingsItem
title="Select">
<template #actions>
<UniSelect value="zh" :options="languageOptions"/>
</template>
</SettingsItem>
</SettingsArea>
Expand Down

0 comments on commit bb8cbec

Please sign in to comment.