🐛 Fix(custom): fix an issue eslint not worked as expected

This commit is contained in:
Kuingsmile
2025-12-30 13:20:28 +08:00
parent 4fb5a26270
commit b53eccce13
185 changed files with 8014 additions and 7627 deletions

View File

@@ -63,36 +63,36 @@ onBeforeMount(async () => {
<style scoped>
.image-container {
height: 100px;
width: 100%;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
position: relative;
display: flex;
justify-content: center;
align-items: center;
margin: 0 auto;
width: 100%;
height: 100px;
}
.image {
max-height: 100%;
max-width: 100%;
object-fit: contain;
display: block;
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.loading-placeholder {
display: flex;
align-items: center;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.loading-spinner {
width: 24px;
height: 24px;
border: 2px solid #e4e7ed;
border-top: 2px solid #409eff;
border-radius: 50%;
width: 24px;
height: 24px;
animation: spin 1s linear infinite;
}
@@ -100,6 +100,7 @@ onBeforeMount(async () => {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}

View File

@@ -52,7 +52,7 @@ async function getUrl() {
preSignedUrl.value = await window.electron.triggerRPC<any>(
IRPCActionType.MANAGE_GET_PRE_SIGNED_URL,
props.alias,
props.config
props.config,
)
isLoading.value = false
} catch (error) {
@@ -79,36 +79,36 @@ onMounted(getUrl)
<style scoped>
.image-container {
height: 100px;
width: 100%;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
position: relative;
display: flex;
justify-content: center;
align-items: center;
margin: 0 auto;
width: 100%;
height: 100px;
}
.image {
max-height: 100%;
max-width: 100%;
object-fit: contain;
display: block;
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.loading-placeholder {
display: flex;
align-items: center;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.loading-spinner {
width: 24px;
height: 24px;
border: 2px solid #e4e7ed;
border-top: 2px solid #409eff;
border-radius: 50%;
width: 24px;
height: 24px;
animation: spin 1s linear infinite;
}
@@ -116,6 +116,7 @@ onMounted(getUrl)
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}

View File

@@ -218,7 +218,7 @@
input-type="radio"
:radio-options="[
{ value: 'text', label: $t('pages.imageProcess.watermark.text') },
{ value: 'image', label: $t('pages.imageProcess.watermark.image') }
{ value: 'image', label: $t('pages.imageProcess.watermark.image') },
]"
@map-change="
(picbedType, value) => safeSetMapValue(waterMarkForm, 'watermarkType', picbedType, value, 'text')
@@ -455,7 +455,7 @@
:select-options="
Array.from(waterMarkPositionMap.entries()).map(([key, label]) => ({
value: key,
label
label,
}))
"
@map-change="
@@ -718,18 +718,18 @@ const tabs = computed(() => [
{
id: 'general',
label: t('pages.imageProcess.generalSettings'),
icon: Settings
icon: Settings,
},
{
id: 'watermark',
label: t('pages.imageProcess.watermarkSettings'),
icon: Image
icon: Image,
},
{
id: 'transform',
label: t('pages.imageProcess.transformSettings'),
icon: RotateCw
}
icon: RotateCw,
},
])
const waterMarkPositionMap = new Map([
@@ -741,7 +741,7 @@ const waterMarkPositionMap = new Map([
['northwest', t('pages.imageProcess.watermark.positionOptions.topLeft')],
['west', t('pages.imageProcess.watermark.positionOptions.left')],
['east', t('pages.imageProcess.watermark.positionOptions.right')],
['centre', t('pages.imageProcess.watermark.positionOptions.center')]
['centre', t('pages.imageProcess.watermark.positionOptions.center')],
])
const imageExtList = ['jpg', 'jpeg', 'png', 'webp', 'bmp', 'tiff', 'tif', 'svg', 'ico', 'avif', 'heif', 'heic']
@@ -766,7 +766,7 @@ const availableFormat = [
'tiff',
'tif',
'v',
'webp'
'webp',
]
const waterMarkForm = reactive<IBuildInWaterMarkOptions>({
@@ -791,7 +791,7 @@ const waterMarkForm = reactive<IBuildInWaterMarkOptions>({
watermarkPosition: 'southeast',
watermarkPositionMap: {},
watermarkImageOpacity: 255,
watermarkImageOpacityMap: {}
watermarkImageOpacityMap: {},
})
const compressForm = reactive<IBuildInCompressOptions>({
@@ -824,12 +824,12 @@ const compressForm = reactive<IBuildInCompressOptions>({
isFlop: false,
isFlopMap: {},
formatConvertObj: {},
formatConvertObjMap: {}
formatConvertObjMap: {},
})
const formatConvertObj = ref('{}')
const skipProcessForm = reactive({
skipProcessExtList: 'zip,rar,7z,tar,gz,tar.gz,tar.bz2,tar.xz'
skipProcessExtList: 'zip,rar,7z,tar,gz,tar.gz,tar.bz2,tar.xz',
})
// State for showing map settings for each field (now unused - kept for future reference)
@@ -851,7 +851,7 @@ function handleSaveConfig() {
let iformatConvertObj = {}
try {
iformatConvertObj = JSON.parse(formatConvertObj.value)
} catch (error) {}
} catch (_error) {}
const formatConvertObjEntries = Object.entries(iformatConvertObj)
const formatConvertObjEntriesFilter = formatConvertObjEntries.filter((item: any) => {
return imageExtList.includes(item[0]) && availableFormat.includes(item[1])
@@ -872,7 +872,7 @@ function handleSaveConfig() {
if (Object.keys(filteredObj).length > 0) {
processedFormatConvertObjMap[picbedType] = filteredObj
}
} catch (error) {
} catch (_error) {
// Skip invalid JSON strings
}
})
@@ -898,7 +898,7 @@ async function initData() {
} else {
formatConvertObj.value = compress.formatConvertObj ?? '{}'
}
} catch (error) {
} catch (_error) {
formatConvertObj.value = '{}'
}
}
@@ -946,11 +946,11 @@ onBeforeMount(async () => {
<style scoped>
.image-process-settings {
overflow-y: auto;
padding: 1.5rem;
min-height: 100vh;
background: var(--color-surface);
color: var(--color-text-primary);
overflow-y: auto;
background: var(--color-surface);
}
/* Header */
@@ -958,12 +958,12 @@ onBeforeMount(async () => {
display: flex;
justify-content: space-between;
align-items: center;
background: var(--color-surface);
margin-bottom: 1.5rem;
border: 1px solid var(--color-border);
border-radius: 12px;
padding: 1.5rem;
margin-bottom: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border: 1px solid var(--color-border);
background: var(--color-surface);
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
}
.header-content {
@@ -985,8 +985,8 @@ onBeforeMount(async () => {
.settings-header p {
margin: 0;
color: var(--color-text-secondary);
font-size: 0.875rem;
color: var(--color-text-secondary);
}
.header-actions {
@@ -997,29 +997,29 @@ onBeforeMount(async () => {
/* Tab Navigation */
.tab-navigation {
display: flex;
background: var(--color-background-primary);
margin-bottom: 1.5rem;
border: 1px solid var(--color-border);
border-radius: 12px;
padding: 0.25rem;
margin-bottom: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border: 1px solid var(--color-border);
background: var(--color-background-primary);
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
}
.tab-button {
display: flex;
justify-content: center;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1rem;
background: transparent;
border: none;
border-radius: 8px;
color: var(--color-text-secondary);
padding: 0.75rem 1rem;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
color: var(--color-text-secondary);
background: transparent;
transition: all 0.2s ease;
gap: 0.5rem;
cursor: pointer;
flex: 1;
justify-content: center;
}
.tab-button:hover {
@@ -1028,9 +1028,9 @@ onBeforeMount(async () => {
}
.tab-button.active {
background: #409eff;
color: white;
box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3);
background: #409eff;
box-shadow: 0 2px 4px rgb(64 158 255 / 30%);
}
/* Settings Content */
@@ -1046,24 +1046,24 @@ onBeforeMount(async () => {
}
.settings-section {
background: var(--color-background-primary);
border: 1px solid var(--color-border);
border-radius: 12px;
padding: 1.5rem;
background: var(--color-background-primary);
box-shadow: 0 2px 8px var(--color-border);
border: 1px solid var(--color-border);
}
.settings-section h2 {
margin: 0 0 0.5rem 0;
margin: 0 0 0.5rem;
font-size: 1.125rem;
font-weight: 600;
color: var(--color-text-primary);
}
.settings-section p {
margin: 0 0 1.5rem 0;
color: var(--color-text-secondary);
margin: 0 0 1.5rem;
font-size: 0.875rem;
color: var(--color-text-secondary);
}
/* Form Elements */
@@ -1075,7 +1075,7 @@ onBeforeMount(async () => {
margin-bottom: 0;
}
.form-group > label:not(.switch-label):not(.radio-option) {
.form-group > label:not(.switch-label, .radio-option) {
display: block;
margin-bottom: 0.5rem;
font-size: 0.875rem;
@@ -1085,89 +1085,87 @@ onBeforeMount(async () => {
.form-input,
.form-textarea {
width: 100%;
padding: 0.75rem;
border: 1px solid var(--color-border);
border-radius: 8px;
background: var(--color-background-primary);
color: var(--color-text-primary);
padding: 0.75rem;
width: 100%;
font-size: 0.875rem;
color: var(--color-text-primary);
background: var(--color-background-primary);
transition: all 0.2s ease;
box-sizing: border-box;
}
.form-input:focus,
.form-textarea:focus {
outline: none;
border-color: var(--color-blue-common);
box-shadow: 0 0 0 2px var(--el-color-primary-light-9, rgba(64, 158, 255, 0.2));
outline: none;
box-shadow: 0 0 0 2px var(--el-color-primary-light-9, rgb(64 158 255 / 20%));
}
.form-textarea {
resize: vertical;
min-height: 80px;
resize: vertical;
}
.form-range {
margin-bottom: 0.5rem;
border-radius: 3px;
width: 100%;
height: 6px;
border-radius: 3px;
background: #e4e7ed;
outline: none;
margin-bottom: 0.5rem;
-webkit-appearance: none;
appearance: none;
}
.form-range::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
border: 2px solid #ffffff;
border-radius: 50%;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--color-blue-common);
box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
appearance: none;
cursor: pointer;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
border: 2px solid #ffffff;
}
.form-range::-moz-range-thumb {
border: 2px solid #ffffff;
border-radius: 50%;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--color-blue-common);
box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
cursor: pointer;
border: 2px solid #ffffff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.range-value {
display: inline-block;
padding: 0.25rem 0.5rem;
background: var(--color-blue-common);
color: white;
margin-bottom: 0.5rem;
border-radius: 4px;
padding: 0.25rem 0.5rem;
min-width: 3rem;
font-size: 0.75rem;
font-weight: 500;
margin-bottom: 0.5rem;
min-width: 3rem;
text-align: center;
color: white;
background: var(--color-blue-common);
}
.form-color {
width: 60px;
height: 40px;
border: 1px solid var(--color-border);
border-radius: 6px;
padding: 0;
width: 60px;
height: 40px;
background: transparent;
cursor: pointer;
padding: 0;
}
.form-color:focus {
outline: none;
border-color: var(--color-blue-common);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
outline: none;
box-shadow: 0 0 0 2px rgb(64 158 255 / 20%);
}
.color-input-group {
@@ -1191,13 +1189,13 @@ onBeforeMount(async () => {
.switch-label {
display: flex;
align-items: center;
gap: 1rem;
cursor: pointer;
padding: 1rem;
border: 1px solid var(--color-border);
border-radius: 8px;
transition: all 0.2s ease;
padding: 1rem;
background: var(--color-background-primary);
transition: all 0.2s ease;
gap: 1rem;
cursor: pointer;
}
.switch-label:hover {
@@ -1211,25 +1209,25 @@ onBeforeMount(async () => {
.switch-slider {
position: relative;
border-radius: 12px;
width: 44px;
height: 24px;
background: var(--color-border-darker);
border-radius: 12px;
transition: all 0.3s ease;
flex-shrink: 0;
}
.switch-slider::before {
content: '';
position: absolute;
top: 2px;
left: 2px;
border-radius: 50%;
width: 20px;
height: 20px;
background: #ffffff;
border-radius: 50%;
box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
transition: all 0.3s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
content: '';
}
.switch-input:checked + .switch-slider {
@@ -1270,18 +1268,18 @@ onBeforeMount(async () => {
.radio-option {
display: flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
padding: 0.5rem 0.75rem;
border: 1px solid var(--color-border);
border-radius: 6px;
transition: all 0.2s ease;
padding: 0.5rem 0.75rem;
background: var(--color-background-primary);
transition: all 0.2s ease;
gap: 0.5rem;
cursor: pointer;
}
.radio-option:hover {
border-color: var(--color-blue-common);
background: rgba(64, 158, 255, 0.1);
background: rgb(64 158 255 / 10%);
}
.radio-input {
@@ -1289,13 +1287,13 @@ onBeforeMount(async () => {
}
.radio-indicator {
width: 16px;
height: 16px;
position: relative;
border: 2px solid var(--color-border);
border-radius: 50%;
transition: all 0.2s ease;
position: relative;
width: 16px;
height: 16px;
background: var(--color-background-primary);
transition: all 0.2s ease;
}
.radio-input:checked + .radio-indicator {
@@ -1304,21 +1302,21 @@ onBeforeMount(async () => {
}
.radio-input:checked + .radio-indicator::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
width: 8px;
height: 8px;
background: var(--color-blue-common);
border-radius: 50%;
content: '';
transform: translate(-50%, -50%);
}
.radio-label {
font-size: 0.875rem;
color: var(--color-text-primary);
font-weight: 500;
color: var(--color-text-primary);
}
/* Position Grid */
@@ -1330,74 +1328,74 @@ onBeforeMount(async () => {
}
.position-button {
padding: 0.75rem;
background: var(--color-background-primary);
border: 1px solid var(--color-border);
border-radius: 6px;
color: var(--color-text-secondary);
padding: 0.75rem;
font-size: 0.75rem;
cursor: pointer;
transition: all 0.2s ease;
text-align: center;
font-weight: 500;
text-align: center;
color: var(--color-text-secondary);
background: var(--color-background-primary);
transition: all 0.2s ease;
cursor: pointer;
}
.position-button:hover {
border-color: var(--color-blue-common);
color: var(--color-text-primary);
background: rgba(64, 158, 255, 0.1);
background: rgb(64 158 255 / 10%);
}
.position-button.active {
background: var(--color-blue-common);
border-color: var(--color-blue-common);
color: white;
box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3);
background: var(--color-blue-common);
box-shadow: 0 2px 4px rgb(64 158 255 / 30%);
}
/* Buttons */
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1rem;
border: 1px solid var(--color-border);
border-radius: 6px;
background: var(--color-background-primary);
color: var(--color-text-primary);
padding: 0.75rem 1rem;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
color: var(--color-text-primary);
background: var(--color-background-primary);
transition: all 0.2s ease;
gap: 0.5rem;
cursor: pointer;
}
.btn:hover {
background: var(--color-background-secondary);
border-color: var(--color-blue-common);
background: var(--color-background-secondary);
}
.btn-primary {
background: var(--color-blue-common);
border-color: var(--color-blue-common);
color: white;
background: var(--color-blue-common);
}
.btn-primary:hover {
background: var(--color-primary);
border-color: var(--color-primary);
background: var(--color-primary);
}
.btn-secondary {
background: var(--color-background-primary);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-background-primary);
}
.btn-secondary:hover {
background: var(--color-background-secondary);
border-color: var(--color-border-secondary);
color: var(--color-text-primary);
background: var(--color-background-secondary);
}
/* Small text */
@@ -1413,12 +1411,12 @@ small {
.watermark-settings,
.resize-settings {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid var(--color-border-secondary);
padding-top: 1rem;
}
/* Responsive Design */
@media (max-width: 768px) {
@media (width <= 768px) {
.image-process-settings {
padding: 1rem;
}
@@ -1468,17 +1466,17 @@ small {
:root.auto.dark .settings-header,
:root.auto.dark .tab-navigation,
:root.auto.dark .settings-section {
background: var(--color-background-tertiary);
border-color: var(--color-border);
background: var(--color-background-tertiary);
}
:root.dark .form-input,
:root.dark .form-textarea,
:root.auto.dark .form-input,
:root.auto.dark .form-textarea {
background: var(--color-surface);
border-color: var(--color-border);
color: var(--color-text-primary);
background: var(--color-surface);
}
:root.dark .switch-slider::before,
@@ -1488,24 +1486,25 @@ small {
:root.dark .btn-secondary,
:root.auto.dark .btn-secondary {
background: var(--color-surface);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-surface);
}
:root.dark .btn-secondary:hover,
:root.auto.dark .btn-secondary:hover {
background: var(--color-background-tertiary);
border-color: var(--color-border-hover);
color: var(--color-text-primary);
background: var(--color-background-tertiary);
}
:root.dark .switch-label,
:root.auto.dark .switch-label {
background: var(--color-surface);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-surface);
}
:root.dark .switch-title,
:root.auto.dark .switch-title {
color: var(--color-text-primary);
@@ -1518,9 +1517,9 @@ small {
:root.dark .position-button,
:root.auto.dark .position-button {
background: var(--color-surface);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-surface);
}
:root.dark .position-button:hover,
@@ -1532,15 +1531,15 @@ small {
:root.dark .position-button.active,
:root.auto.dark .position-button.active {
background: var(--color-primary);
border-color: var(--color-primary);
color: var(--color-text-inverse);
background: var(--color-primary);
}
:root.dark .radio-group,
:root.auto.dark .radio-group {
background: var(--color-background-tertiary);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-background-tertiary);
}
</style>

View File

@@ -54,15 +54,15 @@ async function getWebdavHeader(key: string) {
formatEndpoint(props.config.endpoint, props.config.sslEnabled || false),
`/${key.replace(/^\//, '')}`,
props.config.username,
props.config.password
props.config.password,
)
headers = {
Authorization: authHeader
Authorization: authHeader,
}
} else {
headers = {
Authorization:
'Basic ' + window.node.buffer.from(`${props.config.username}:${props.config.password}`).toString('base64')
'Basic ' + window.node.buffer.from(`${props.config.username}:${props.config.password}`).toString('base64'),
}
}
return headers
@@ -107,36 +107,36 @@ onMounted(fetchImage)
<style scoped>
.image-container {
height: 100px;
width: 100%;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
position: relative;
display: flex;
justify-content: center;
align-items: center;
margin: 0 auto;
width: 100%;
height: 100px;
}
.image {
max-height: 100%;
max-width: 100%;
object-fit: contain;
display: block;
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.loading-placeholder {
display: flex;
align-items: center;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.loading-spinner {
width: 24px;
height: 24px;
border: 2px solid #e4e7ed;
border-top: 2px solid #409eff;
border-radius: 50%;
width: 24px;
height: 24px;
animation: spin 1s linear infinite;
}
@@ -144,6 +144,7 @@ onMounted(fetchImage)
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}

View File

@@ -58,7 +58,7 @@ const showInputBoxVisible = ref(false)
const inputBoxOptions = reactive({
title: '',
placeholder: '',
multiLine: false
multiLine: false,
})
let removeInputBoxListenerCallback: () => void = () => {}
@@ -101,54 +101,51 @@ onBeforeUnmount(() => {
<script lang="ts">
export default {
name: 'InputBoxDialog'
name: 'InputBoxDialog',
}
</script>
<style scoped>
.inputbox-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
inset: 0;
z-index: 2000;
display: flex;
justify-content: center;
align-items: center;
background: rgb(0 0 0 / 50%);
}
.inputbox-container {
background: white;
border-radius: 0.75rem;
box-shadow:
0 20px 25px -5px rgba(0, 0, 0, 0.1),
0 10px 10px -5px rgba(0, 0, 0, 0.04);
max-width: 32rem;
width: 90%;
max-height: 80vh;
overflow: hidden;
border-radius: 0.75rem;
width: 90%;
max-width: 32rem;
max-height: 80vh;
background: white;
box-shadow:
0 20px 25px -5px rgb(0 0 0 / 10%),
0 10px 10px -5px rgb(0 0 0 / 4%);
}
:root.dark .inputbox-container,
:root.auto.dark .inputbox-container {
background: rgb(31 41 55);
border: 1px solid rgb(55 65 81);
background: rgb(31 41 55);
}
.inputbox-header {
padding: 1.5rem 1.5rem 0 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.5rem 1.5rem 0;
}
.inputbox-title {
margin: 0;
font-size: 1.25rem;
font-weight: 600;
color: rgb(17 24 39);
margin: 0;
}
:root.dark .inputbox-title,
@@ -157,22 +154,22 @@ export default {
}
.inputbox-close {
background: none;
display: flex;
justify-content: center;
align-items: center;
border: none;
color: rgb(107 114 128);
cursor: pointer;
border-radius: 0.25rem;
padding: 0.25rem;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 0.25rem;
color: rgb(107 114 128);
background: none;
cursor: pointer;
}
.inputbox-close:hover {
background: rgb(243 244 246);
color: rgb(17 24 39);
background: rgb(243 244 246);
}
:root.dark .inputbox-close,
@@ -182,8 +179,8 @@ export default {
:root.dark .inputbox-close:hover,
:root.auto.dark .inputbox-close:hover {
background: rgb(55 65 81);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
.inputbox-content {
@@ -191,21 +188,21 @@ export default {
}
.inputbox-input {
width: 100%;
padding: 0.75rem 1rem;
border: 1px solid rgb(209 213 219);
border-radius: 0.5rem;
background: white;
color: rgb(17 24 39);
padding: 0.75rem 1rem;
width: 100%;
font-size: 0.875rem;
font-family: inherit;
transition: all 0.2s ease;
color: rgb(17 24 39);
background: white;
outline: none;
transition: all 0.2s ease;
}
.inputbox-input:focus {
border-color: rgb(59 130 246);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
box-shadow: 0 0 0 3px rgb(59 130 246 / 10%);
}
.inputbox-input::placeholder {
@@ -213,23 +210,23 @@ export default {
}
.inputbox-textarea {
width: 100%;
border: 1px solid rgb(209 213 219);
border-radius: 0.375rem;
padding: 0.5rem 0.75rem;
background: white;
color: rgb(17 24 39);
width: 100%;
min-height: 4rem;
font-size: 0.875rem;
font-family: inherit;
transition: all 0.2s ease;
color: rgb(17 24 39);
background: white;
outline: none;
resize: vertical;
min-height: 4rem;
transition: all 0.2s ease;
}
.inputbox-textarea:focus {
border-color: rgb(59 130 246);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
box-shadow: 0 0 0 3px rgb(59 130 246 / 10%);
}
.inputbox-textarea::placeholder {
@@ -238,15 +235,15 @@ export default {
:root.dark .inputbox-input,
:root.auto.dark .inputbox-input {
background: rgb(55 65 81);
border-color: rgb(75 85 99);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
:root.dark .inputbox-input:focus,
:root.auto.dark .inputbox-input:focus {
border-color: rgb(59 130 246);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
box-shadow: 0 0 0 3px rgb(59 130 246 / 10%);
}
:root.dark .inputbox-input::placeholder,
@@ -256,15 +253,15 @@ export default {
:root.dark .inputbox-textarea,
:root.auto.dark .inputbox-textarea {
background: rgb(55 65 81);
border-color: rgb(75 85 99);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
:root.dark .inputbox-textarea:focus,
:root.auto.dark .inputbox-textarea:focus {
border-color: rgb(59 130 246);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
box-shadow: 0 0 0 3px rgb(59 130 246 / 10%);
}
:root.dark .inputbox-textarea::placeholder,
@@ -274,25 +271,25 @@ export default {
.inputbox-actions {
display: flex;
gap: 0.75rem;
padding: 0 1.5rem 1.5rem 1.5rem;
justify-content: flex-end;
padding: 0 1.5rem 1.5rem;
gap: 0.75rem;
}
.inputbox-btn {
padding: 0.5rem 1rem;
border: none;
border-radius: 0.375rem;
padding: 0.5rem 1rem;
min-width: 4rem;
font-size: 0.875rem;
font-weight: 500;
border: none;
cursor: pointer;
min-width: 4rem;
}
.cancel-btn {
background: rgb(243 244 246);
color: rgb(75 85 99);
border: 1px solid rgb(209 213 219);
color: rgb(75 85 99);
background: rgb(243 244 246);
}
.cancel-btn:hover {
@@ -301,9 +298,9 @@ export default {
:root.dark .cancel-btn,
:root.auto.dark .cancel-btn {
background: rgb(55 65 81);
color: rgb(209 213 219);
border-color: rgb(75 85 99);
color: rgb(209 213 219);
background: rgb(55 65 81);
}
:root.dark .cancel-btn:hover,
@@ -312,8 +309,8 @@ export default {
}
.confirm-btn.primary {
background: rgb(59 130 246);
color: white;
background: rgb(59 130 246);
}
.confirm-btn.primary:hover {

View File

@@ -171,7 +171,7 @@ import {
ListboxOption,
ListboxOptions,
TransitionChild,
TransitionRoot
TransitionRoot,
} from '@headlessui/vue'
import { pick } from 'lodash-es'
import {
@@ -186,7 +186,7 @@ import {
Info,
PlugIcon,
Settings,
UploadIcon
UploadIcon,
} from 'lucide-vue-next'
import QrcodeVue from 'qrcode.vue'
import pkg from 'root/package.json'
@@ -232,7 +232,7 @@ watch(
})
}
},
{ deep: true }
{ deep: true },
)
const visiblePicBeds = computed(() => picBedGlobal.value.filter(item => item.visible))
@@ -270,8 +270,8 @@ const navigationItems = computed(() => [
{
name: t('navigation.plugins'),
path: '/main-page/plugins',
icon: PlugIcon
}
icon: PlugIcon,
},
])
function openGithubPage() {
@@ -297,13 +297,13 @@ onBeforeUnmount(() => {
<style scoped>
.navigation {
display: flex;
flex-direction: column;
overflow: hidden;
border-right: 1px solid rgb(229 231 235);
width: 150px;
height: 100vh;
background: var(--color-background-secondary);
border-right: 1px solid rgb(229 231 235);
overflow: hidden;
transition: width 0.3s ease;
flex-direction: column;
}
.navigation.collapsed {
@@ -312,18 +312,18 @@ onBeforeUnmount(() => {
:root.dark .navigation,
:root.auto.dark .navigation {
background: var(--color-background-secondary);
border-right-color: var(--color-background-secondary);
background: var(--color-background-secondary);
}
.title-bar {
display: flex;
align-items: center;
justify-content: center;
padding: 1.25rem 1rem;
border-bottom: 1px solid var(--color-border);
background: var(--color-background-secondary);
position: relative;
display: flex;
justify-content: center;
align-items: center;
border-bottom: 1px solid var(--color-border);
padding: 1.25rem 1rem;
background: var(--color-background-secondary);
}
.navigation.collapsed .title-bar {
@@ -332,24 +332,24 @@ onBeforeUnmount(() => {
.collapse-button {
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
background: transparent;
border: none;
color: var(--color-text-primary);
cursor: pointer;
padding: 4px;
border-radius: 4px;
transition: all 0.2s ease;
right: 8px;
display: flex;
align-items: center;
justify-content: center;
align-items: center;
border: none;
border-radius: 4px;
padding: 4px;
color: var(--color-text-primary);
background: transparent;
transition: all 0.2s ease;
transform: translateY(-50%);
cursor: pointer;
}
.collapse-button:hover {
background: var(--color-surface-elevated);
color: var(--color-text-primary);
background: var(--color-surface-elevated);
}
.navigation.collapsed .collapse-button {
@@ -383,21 +383,21 @@ onBeforeUnmount(() => {
}
.app-version {
border: 1px solid var(--color-border);
border-radius: 12px;
padding: 3px 8px;
font-size: 10px;
font-weight: 500;
color: var(--color-text-secondary);
background: var(--color-surface-elevated);
padding: 3px 8px;
border-radius: 12px;
border: 1px solid var(--color-border);
}
.theme-section {
display: flex;
align-items: center;
justify-content: center;
padding: 0.75rem;
align-items: center;
border-bottom: 1px solid var(--color-border);
padding: 0.75rem;
}
:root.dark .theme-section,
@@ -406,29 +406,29 @@ onBeforeUnmount(() => {
}
.nav-menu {
flex: 1;
padding: 1rem 0;
overflow-y: auto;
padding: 1rem 0;
min-height: 0;
flex: 1;
}
.nav-item {
display: flex;
align-items: center;
justify-content: center;
gap: 0.75rem;
align-items: center;
padding: 0.75rem 1rem;
color: rgb(75 85 99);
text-decoration: none;
font-size: 0.875rem;
font-weight: 500;
text-decoration: none;
color: rgb(75 85 99);
transition: all 0.2s ease;
gap: 0.75rem;
cursor: pointer;
}
.navigation.collapsed .nav-item {
padding: 0.75rem 0.5rem;
justify-content: center;
padding: 0.75rem 0.5rem;
gap: 0;
}
@@ -442,82 +442,83 @@ onBeforeUnmount(() => {
}
.nav-item:hover {
background: rgb(243 244 246);
color: rgb(17 24 39);
background: rgb(243 244 246);
}
:root.dark .nav-item:hover,
:root.auto.dark .nav-item:hover {
background: rgb(55 65 81);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
.nav-item.router-link-active {
background: rgb(239 246 255);
color: rgb(99 102 241);
border-right: 3px solid rgb(99 102 241);
color: rgb(99 102 241);
background: rgb(239 246 255);
}
:root.dark .nav-item.router-link-active,
:root.auto.dark .nav-item.router-link-active {
background: rgb(30 58 138 / 0.2);
color: rgb(129 140 248);
border-right-color: rgb(129 140 248);
color: rgb(129 140 248);
background: rgb(30 58 138 / 20%);
}
.nav-icon-container {
position: relative;
display: flex;
align-items: center;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
flex-shrink: 0;
}
.sidebar-footer {
padding: 12px;
border-top: 1px solid var(--color-border);
padding: 12px;
}
.footer-button {
cursor: pointer;
position: fixed;
bottom: 4px;
left: 4px;
border: none;
border-radius: 6px;
padding: 8px;
color: var(--color-text-secondary);
background: transparent;
border: none;
padding: 8px;
border-radius: 6px;
cursor: pointer;
}
.footer-button:hover {
background: var(--color-surface-elevated);
color: var(--color-text-primary);
background: var(--color-surface-elevated);
}
.nav-submenu {
margin-top: 4px;
justify-content: center;
position: relative;
justify-content: center;
margin-top: 4px;
}
.submenu-trigger {
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 0.75rem;
align-items: center;
border: none;
padding: 0.75rem 1rem;
color: rgb(75 85 99);
text-decoration: none;
width: 100%;
font-size: 0.875rem;
font-weight: 500;
transition: all 0.2s ease;
text-decoration: none;
color: rgb(75 85 99);
background: transparent;
border: none;
width: 100%;
transition: all 0.2s ease;
gap: 0.75rem;
cursor: pointer;
position: relative;
}
:root.dark .submenu-trigger,
@@ -526,14 +527,14 @@ onBeforeUnmount(() => {
}
.submenu-trigger:hover {
background: rgb(243 244 246);
color: rgb(17 24 39);
background: rgb(243 244 246);
}
:root.dark .submenu-trigger:hover,
:root.auto.dark .submenu-trigger:hover {
background: rgb(55 65 81);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
.submenu-trigger .nav-icon-container {
@@ -556,9 +557,9 @@ onBeforeUnmount(() => {
}
.submenu-panel {
display: flex;
margin-top: 2px;
padding-left: 2.75rem;
display: flex;
flex-direction: column;
gap: 4px;
}
@@ -566,19 +567,19 @@ onBeforeUnmount(() => {
.submenu-item {
display: flex;
align-items: center;
border-radius: 6px;
padding: 0.5rem 1rem;
color: var(--color-text-secondary);
text-decoration: none;
font-size: 0.8125rem;
font-weight: 500;
border-radius: 6px;
text-decoration: none;
color: var(--color-text-secondary);
transition: all 0.2s ease;
cursor: pointer;
}
.submenu-item:hover {
background: var(--color-surface-elevated);
color: var(--color-text-primary);
background: var(--color-surface-elevated);
}
.collapsed-picbed {
@@ -586,54 +587,54 @@ onBeforeUnmount(() => {
}
.collapsed-picbed:hover {
background: rgb(243 244 246);
color: rgb(17 24 39);
background: rgb(243 244 246);
}
:root.dark .collapsed-picbed:hover,
:root.auto.dark .collapsed-picbed:hover {
background: rgb(55 65 81);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
.qr-dialog {
position: fixed;
inset: 0;
z-index: 50;
display: flex;
overflow-y: auto;
align-items: center;
justify-content: center;
align-items: center;
overflow-y: auto;
inset: 0;
}
.dialog-container {
position: fixed;
inset: 0;
z-index: 50;
overflow-y: auto;
display: flex;
min-height: 100vh;
align-items: center;
justify-content: center;
align-items: center;
overflow-y: auto;
padding: 16px;
min-height: 100vh;
inset: 0;
}
.dialog-panel {
overflow: hidden;
border: 1px solid var(--color-border);
border-radius: 16px;
width: 100%;
max-width: 500px;
background: var(--color-background-primary);
border-radius: 16px;
border: 1px solid var(--color-border);
box-shadow: var(--shadow-md);
overflow: hidden;
}
.dialog-title {
margin: 0;
padding: 20px 24px 0;
font-size: 18px;
font-weight: 600;
color: var(--color-text-primary);
margin: 0;
}
.dialog-content {
@@ -658,17 +659,17 @@ onBeforeUnmount(() => {
.listbox-button {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 12px 16px;
background: var(--color-surface);
align-items: center;
border: 1px solid var(--color-border);
border-radius: var(--border-radius);
padding: 12px 16px;
width: 100%;
font-size: 14px;
color: var(--color-text-primary);
cursor: pointer;
background: var(--color-surface);
transition: var(--transition);
cursor: pointer;
}
.listbox-button:hover {
@@ -690,27 +691,27 @@ onBeforeUnmount(() => {
.listbox-options {
position: absolute;
top: 100%;
left: 0;
right: 0;
left: 0;
z-index: 10;
overflow-y: auto;
margin-top: 4px;
background: var(--color-background-primary);
border: 1px solid var(--color-border);
border-radius: var(--border-radius);
box-shadow: var(--shadow-md);
max-height: 300px;
overflow-y: auto;
background: var(--color-background-primary);
box-shadow: var(--shadow-md);
}
.listbox-option {
display: flex;
align-items: center;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
font-size: 14px;
color: var(--color-text-primary);
cursor: pointer;
transition: var(--transition);
cursor: pointer;
}
.listbox-option.active {
@@ -718,24 +719,24 @@ onBeforeUnmount(() => {
}
.listbox-option.selected {
background: var(--color-accent);
color: white;
background: var(--color-accent);
}
.copy-button {
display: flex;
align-items: center;
gap: 8px;
margin-top: 12px;
padding: 10px 16px;
background: var(--color-accent);
color: white;
border: none;
border-radius: var(--border-radius);
padding: 10px 16px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
color: white;
background: var(--color-accent);
transition: var(--transition);
gap: 8px;
cursor: pointer;
}
.copy-button:hover {
@@ -749,34 +750,35 @@ onBeforeUnmount(() => {
}
.qr-code {
border-radius: var(--border-radius);
overflow: hidden;
border-radius: var(--border-radius);
box-shadow: var(--shadow-sm);
}
.dialog-actions {
padding: 0 24px 20px;
display: flex;
justify-content: flex-end;
padding: 0 24px 20px;
gap: 12px;
}
.cancel-button {
padding: 10px 20px;
background: var(--color-surface-elevated);
color: var(--color-text-primary);
border: 1px solid var(--color-border);
border-radius: var(--border-radius);
padding: 10px 20px;
font-size: 14px;
cursor: pointer;
color: var(--color-text-primary);
background: var(--color-surface-elevated);
transition: var(--transition);
cursor: pointer;
}
.cancel-button:hover {
background: var(--color-border);
}
/* Responsive Design */
@media (max-width: 768px) {
@media (width <= 768px) {
.navigation {
width: 60px;
}
@@ -804,8 +806,8 @@ onBeforeUnmount(() => {
}
::-webkit-scrollbar-thumb {
border-radius: 0;
background: var(--color-border);
border-radius: 0px;
}
::-webkit-scrollbar-thumb:hover {

View File

@@ -152,7 +152,7 @@ withDefaults(defineProps<Props>(), {
numberMax: 1000,
textPlaceholder: '',
selectOptions: () => [],
radioOptions: () => []
radioOptions: () => [],
})
const emit = defineEmits<{
@@ -164,7 +164,7 @@ const showSettings = ref(false)
const availablePicbeds = computed(() => {
return picBedGlobal.value.map(picbed => ({
type: picbed.type,
name: picbed.name
name: picbed.name,
}))
})
@@ -195,35 +195,35 @@ function handleMapChange(picbedType: string, value: any) {
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1rem;
border: 1px solid var(--color-border);
border-radius: 6px;
background: var(--color-background-primary);
color: var(--color-text-primary);
padding: 0.75rem 1rem;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
color: var(--color-text-primary);
background: var(--color-background-primary);
transition: all 0.2s ease;
gap: 0.5rem;
cursor: pointer;
line-height: 1;
}
.btn:hover {
background: var(--color-background-secondary);
border-color: var(--color-blue-common);
background: var(--color-background-secondary);
}
.btn-secondary {
background: var(--color-background-primary);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-background-primary);
}
.btn-secondary:hover {
background: var(--color-background-secondary);
border-color: var(--color-border-secondary);
color: var(--color-text-primary);
background: var(--color-background-secondary);
}
.btn-small {
@@ -235,15 +235,15 @@ function handleMapChange(picbedType: string, value: any) {
/* Settings panel */
.map-settings-panel {
margin-top: 1rem;
padding: 1rem;
border: 1px solid var(--color-border);
border-radius: 8px;
padding: 1rem;
background: var(--color-background-secondary);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
}
.map-settings-panel h4 {
margin: 0 0 1rem 0;
margin: 0 0 1rem;
font-size: 1rem;
font-weight: 600;
color: var(--color-text-primary);
@@ -258,27 +258,27 @@ function handleMapChange(picbedType: string, value: any) {
.picbed-setting-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.75rem;
align-items: center;
border: 1px solid var(--color-border);
border-radius: 6px;
padding: 0.75rem;
background: var(--color-background-primary);
transition: all 0.2s ease;
}
.picbed-setting-item:hover {
border-color: var(--color-blue-common);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
box-shadow: 0 2px 4px rgb(0 0 0 / 10%);
}
.picbed-name {
margin: 0;
min-width: 0;
font-size: 0.875rem;
font-weight: 500;
color: var(--color-text-primary);
margin: 0;
flex: 1;
min-width: 0;
}
/* Switch component */
@@ -290,8 +290,8 @@ function handleMapChange(picbedType: string, value: any) {
}
.switch-label.small {
padding: 0;
margin: 0;
padding: 0;
}
.switch-input {
@@ -300,25 +300,25 @@ function handleMapChange(picbedType: string, value: any) {
.switch-slider {
position: relative;
border-radius: 12px;
width: 44px;
height: 24px;
background: var(--color-border-darker);
border-radius: 12px;
transition: all 0.3s ease;
flex-shrink: 0;
}
.switch-slider::before {
content: '';
position: absolute;
top: 2px;
left: 2px;
border-radius: 50%;
width: 20px;
height: 20px;
background: #ffffff;
border-radius: 50%;
box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
transition: all 0.3s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
content: '';
}
.switch-input:checked + .switch-slider {
@@ -335,60 +335,58 @@ function handleMapChange(picbedType: string, value: any) {
.form-color {
border: 1px solid var(--color-border);
border-radius: 6px;
background: var(--color-background-primary);
color: var(--color-text-primary);
transition: all 0.2s ease;
background: var(--color-background-primary);
outline: none;
transition: all 0.2s ease;
}
.form-input:focus,
.form-color:focus {
border-color: var(--color-blue-common);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
box-shadow: 0 0 0 2px rgb(64 158 255 / 20%);
}
.form-input.small {
width: 100px;
padding: 0.375rem 0.5rem;
width: 100px;
font-size: 0.875rem;
}
.form-range.small {
border-radius: 3px;
width: 100px;
height: 6px;
-webkit-appearance: none;
appearance: none;
background: var(--color-border-darker);
border-radius: 3px;
appearance: none;
}
.form-range.small::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
border: 2px solid #ffffff;
border-radius: 50%;
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--color-blue-common);
box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
appearance: none;
cursor: pointer;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
border: 2px solid #ffffff;
}
.form-range.small::-moz-range-thumb {
border: 2px solid #ffffff;
border-radius: 50%;
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--color-blue-common);
box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
cursor: pointer;
border: 2px solid #ffffff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.form-color.small {
padding: 0;
width: 40px;
height: 32px;
cursor: pointer;
padding: 0;
}
/* Range input container */
@@ -399,15 +397,15 @@ function handleMapChange(picbedType: string, value: any) {
}
.range-value {
border-radius: 4px;
padding: 0.125rem 0.25rem;
min-width: 50px;
font-size: 0.875rem;
color: var(--color-text-secondary);
text-align: center;
padding: 0.125rem 0.25rem;
background: var(--color-blue-common);
color: white;
border-radius: 4px;
font-weight: 500;
text-align: center;
color: var(--color-text-secondary);
color: white;
background: var(--color-blue-common);
}
/* Color input group */
@@ -431,19 +429,19 @@ function handleMapChange(picbedType: string, value: any) {
.radio-option.small {
display: flex;
align-items: center;
gap: 0.25rem;
cursor: pointer;
padding: 0.25rem 0.5rem;
border: 1px solid var(--color-border);
border-radius: 4px;
transition: all 0.2s ease;
background: var(--color-background-primary);
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
background: var(--color-background-primary);
transition: all 0.2s ease;
gap: 0.25rem;
cursor: pointer;
}
.radio-option.small:hover {
border-color: var(--color-blue-common);
background: rgba(64, 158, 255, 0.1);
background: rgb(64 158 255 / 10%);
}
.radio-input {
@@ -451,13 +449,13 @@ function handleMapChange(picbedType: string, value: any) {
}
.radio-indicator {
width: 14px;
height: 14px;
position: relative;
border: 2px solid var(--color-border);
border-radius: 50%;
transition: all 0.2s ease;
position: relative;
width: 14px;
height: 14px;
background: var(--color-background-primary);
transition: all 0.2s ease;
flex-shrink: 0;
}
@@ -466,21 +464,21 @@ function handleMapChange(picbedType: string, value: any) {
}
.radio-input:checked + .radio-indicator::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
width: 6px;
height: 6px;
background: var(--color-blue-common);
border-radius: 50%;
content: '';
transform: translate(-50%, -50%);
}
.radio-label {
font-size: inherit;
color: var(--color-text-primary);
font-weight: 500;
color: var(--color-text-primary);
}
/* Select styling */
@@ -498,7 +496,7 @@ select.form-input:focus {
}
/* Responsive design */
@media (max-width: 768px) {
@media (width <= 768px) {
.picbed-setting-item {
flex-direction: column;
align-items: flex-start;
@@ -529,30 +527,30 @@ select.form-input:focus {
/* Dark mode styles */
:root.dark .map-settings-panel,
:root.auto.dark .map-settings-panel {
background: var(--color-background-tertiary);
border-color: var(--color-border);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
background: var(--color-background-tertiary);
box-shadow: 0 2px 8px rgb(0 0 0 / 30%);
}
:root.dark .picbed-setting-item,
:root.auto.dark .picbed-setting-item {
background: var(--color-surface);
border-color: var(--color-border);
background: var(--color-surface);
}
:root.dark .picbed-setting-item:hover,
:root.auto.dark .picbed-setting-item:hover {
border-color: var(--color-primary);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
box-shadow: 0 2px 4px rgb(0 0 0 / 30%);
}
:root.dark .form-input,
:root.dark .form-color,
:root.auto.dark .form-input,
:root.auto.dark .form-color {
background: var(--color-surface);
border-color: var(--color-border);
color: var(--color-text-primary);
background: var(--color-surface);
}
:root.dark .form-input:focus,
@@ -560,21 +558,21 @@ select.form-input:focus {
:root.auto.dark .form-input:focus,
:root.auto.dark .form-color:focus {
border-color: var(--color-primary);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.3);
box-shadow: 0 0 0 2px rgb(64 158 255 / 30%);
}
:root.dark .btn-secondary,
:root.auto.dark .btn-secondary {
background: var(--color-surface);
border-color: var(--color-border);
color: var(--color-text-secondary);
background: var(--color-surface);
}
:root.dark .btn-secondary:hover,
:root.auto.dark .btn-secondary:hover {
background: var(--color-background-tertiary);
border-color: var(--color-border-hover);
color: var(--color-text-primary);
background: var(--color-background-tertiary);
}
:root.dark .switch-slider::before,
@@ -584,20 +582,20 @@ select.form-input:focus {
:root.dark .radio-option.small,
:root.auto.dark .radio-option.small {
background: var(--color-surface);
border-color: var(--color-border);
background: var(--color-surface);
}
:root.dark .radio-option.small:hover,
:root.auto.dark .radio-option.small:hover {
border-color: var(--color-primary);
background: rgba(64, 158, 255, 0.2);
background: rgb(64 158 255 / 20%);
}
:root.dark .radio-indicator,
:root.auto.dark .radio-indicator {
background: var(--color-surface);
border-color: var(--color-border);
background: var(--color-surface);
}
:root.dark .radio-input:checked + .radio-indicator,

View File

@@ -19,7 +19,7 @@ const props = defineProps<IProps>()
<script lang="ts">
export default {
name: 'ToolboxHandler'
name: 'ToolboxHandler',
}
</script>

View File

@@ -40,7 +40,7 @@ const icon = computed(() => {
</script>
<script lang="ts">
export default {
name: 'ToolboxStatusIcon'
name: 'ToolboxStatusIcon',
}
</script>
<style lang="stylus">

View File

@@ -144,7 +144,7 @@ interface IProps {
const props = withDefaults(defineProps<IProps>(), {
colorMode: undefined,
mode: 'picbed',
showTooltips: true
showTooltips: true,
})
const $route = useRoute()
@@ -154,7 +154,7 @@ const { t } = useI18n()
const configList = ref<IPicGoPluginConfig[]>([])
const ruleForm = reactive<IStringKeyMap>({})
const validationErrors = reactive<IStringKeyMap>({})
const visibleTooltips = reactive<{ [key: string]: boolean }>({})
const visibleTooltips = reactive<Record<string, boolean>>({})
// Watch for config changes
watch(
@@ -164,8 +164,8 @@ watch(
},
{
deep: true,
immediate: true
}
immediate: true,
},
)
function handleConfigChange(val: any) {
@@ -256,7 +256,7 @@ async function validate(): Promise<IStringKeyMap | false> {
function transformMarkdownToHTML(markdown: string) {
try {
return marked.parse(markdown)
} catch (e) {
} catch (_e) {
return markdown
}
}
@@ -341,7 +341,7 @@ function updateRuleForm(key: string, value: any) {
defineExpose({
updateRuleForm,
validate,
getConfigType
getConfigType,
})
</script>
@@ -394,18 +394,18 @@ defineExpose({
.info-icon {
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: var(--color-text-secondary);
transition: var(--transition-fast);
align-items: center;
border-radius: 50%;
padding: 2px;
color: var(--color-text-secondary);
transition: var(--transition-fast);
cursor: pointer;
}
.info-icon:hover {
color: var(--color-accent);
background: rgba(0, 122, 255, 0.1);
background: rgb(0 122 255 / 10%);
}
.tooltip-content {
@@ -413,35 +413,35 @@ defineExpose({
top: 100%;
left: 0;
z-index: 1000;
min-width: 200px;
max-width: 300px;
padding: 0.75rem;
background: var(--color-surface-elevated);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
padding: 0.75rem;
min-width: 200px;
max-width: 300px;
font-size: 0.75rem;
line-height: 1.4;
color: var(--color-text-primary);
background: var(--color-surface-elevated);
box-shadow: var(--shadow-lg);
line-height: 1.4;
}
/* Input Styles */
.form-input {
width: 100%;
padding: 0.75rem 1rem;
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background: var(--color-surface-elevated);
color: var(--color-text-primary);
padding: 0.75rem 1rem;
width: 100%;
font-size: 0.875rem;
font-family: inherit;
color: var(--color-text-primary);
background: var(--color-surface-elevated);
transition: var(--transition-fast);
}
.form-input:focus {
outline: none;
border-color: var(--color-accent);
box-shadow: 0 0 0 2px rgba(0, 122, 255, 0.2);
outline: none;
box-shadow: 0 0 0 2px rgb(0 122 255 / 20%);
}
.form-input::placeholder {
@@ -453,7 +453,7 @@ defineExpose({
}
.form-input.error:focus {
box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.2);
box-shadow: 0 0 0 2px rgb(239 68 68 / 20%);
}
/* Select Styles */
@@ -462,23 +462,23 @@ defineExpose({
}
.form-select {
width: 100%;
padding: 0.75rem 2.5rem 0.75rem 1rem;
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background: var(--color-surface-elevated);
color: var(--color-text-primary);
padding: 0.75rem 2.5rem 0.75rem 1rem;
width: 100%;
font-size: 0.875rem;
font-family: inherit;
color: var(--color-text-primary);
background: var(--color-surface-elevated);
transition: var(--transition-fast);
appearance: none;
cursor: pointer;
}
.form-select:focus {
outline: none;
border-color: var(--color-accent);
box-shadow: 0 0 0 2px rgba(0, 122, 255, 0.2);
outline: none;
box-shadow: 0 0 0 2px rgb(0 122 255 / 20%);
}
.form-select.error {
@@ -486,17 +486,17 @@ defineExpose({
}
.form-select.error:focus {
box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.2);
box-shadow: 0 0 0 2px rgb(239 68 68 / 20%);
}
.select-arrow {
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
right: 1rem;
color: var(--color-text-secondary);
pointer-events: none;
transition: var(--transition-fast);
transform: translateY(-50%);
pointer-events: none;
}
.select-wrapper:hover .select-arrow,
@@ -539,32 +539,32 @@ defineExpose({
.checkbox-custom {
position: relative;
width: 1.25rem;
height: 1.25rem;
border: 2px solid var(--color-border);
border-radius: var(--radius-sm);
width: 1.25rem;
height: 1.25rem;
background: var(--color-surface-elevated);
transition: var(--transition-fast);
flex-shrink: 0;
}
.checkbox-custom::after {
content: '';
position: absolute;
top: 0;
left: 3px;
top: 0px;
width: 6px;
height: 10px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
width: 6px;
height: 10px;
opacity: 0;
transition: var(--transition-fast);
content: '';
transform: rotate(45deg);
}
.checkbox-input:checked + .checkbox-custom {
background: var(--color-accent);
border-color: var(--color-accent);
background: var(--color-accent);
}
.checkbox-input:checked + .checkbox-custom::after {
@@ -572,7 +572,7 @@ defineExpose({
}
.checkbox-input:focus + .checkbox-custom {
box-shadow: 0 0 0 2px rgba(0, 122, 255, 0.2);
box-shadow: 0 0 0 2px rgb(0 122 255 / 20%);
}
.checkbox-text {
@@ -597,10 +597,10 @@ defineExpose({
.switch-slider {
position: relative;
border-radius: 0.75rem;
width: 3rem;
height: 1.5rem;
background: var(--color-border);
border-radius: 0.75rem;
transition: var(--transition-fast);
flex-shrink: 0;
}
@@ -609,12 +609,12 @@ defineExpose({
position: absolute;
top: 2px;
left: 2px;
border-radius: 50%;
width: 1.25rem;
height: 1.25rem;
background: white;
border-radius: 50%;
transition: var(--transition-fast);
box-shadow: var(--shadow-sm);
transition: var(--transition-fast);
}
.switch-input:checked + .switch-slider {
@@ -626,7 +626,7 @@ defineExpose({
}
.switch-input:focus + .switch-slider {
box-shadow: 0 0 0 2px rgba(0, 122, 255, 0.2);
box-shadow: 0 0 0 2px rgb(0 122 255 / 20%);
}
.switch-text {
@@ -640,16 +640,16 @@ defineExpose({
/* Error Message */
.error-message {
margin-top: 0.25rem;
font-size: 0.75rem;
color: var(--color-error, #ef4444);
margin-top: 0.25rem;
}
/* White theme adjustments */
.white .form-input,
.white .form-select {
border-color: #dddddd;
background: white;
border-color: #ddd;
}
.white .form-input:focus,
@@ -658,21 +658,21 @@ defineExpose({
}
.white .checkbox-custom {
border-color: #dddddd;
background: white;
border-color: #ddd;
}
.white .switch-slider {
background: #ddd;
background: #dddddd;
}
.white .tooltip-content {
border-color: #dddddd;
background: white;
border-color: #ddd;
}
/* Responsive Design */
@media (max-width: 768px) {
@media (width <= 768px) {
.config-form {
gap: 1.25rem;
}
@@ -697,14 +697,14 @@ defineExpose({
:root.auto.dark .form-input,
:root.dark .form-select,
:root.auto.dark .form-select {
background: var(--color-surface-elevated);
border-color: var(--color-border);
background: var(--color-surface-elevated);
}
:root.dark .checkbox-custom,
:root.auto.dark .checkbox-custom {
background: var(--color-surface-elevated);
border-color: var(--color-border);
background: var(--color-surface-elevated);
}
:root.dark .switch-slider,
@@ -714,8 +714,8 @@ defineExpose({
:root.dark .tooltip-content,
:root.auto.dark .tooltip-content {
background: var(--color-surface-elevated);
border-color: var(--color-border);
background: var(--color-surface-elevated);
}
/* Focus styles for accessibility */

View File

@@ -55,8 +55,8 @@ const props = withDefaults(
pageMode: false,
keyField: 'id',
itemPadding: 0,
viewMode: 'grid'
}
viewMode: 'grid',
},
)
const containerRef = ref<HTMLElement | null>(null)
@@ -69,7 +69,7 @@ watch(
() => props.items,
v => {
itemsRef.value = v
}
},
)
const localViewMode = ref<'list' | 'grid'>(props.viewMode)
@@ -77,7 +77,7 @@ watch(
() => props.viewMode,
v => {
localViewMode.value = v
}
},
)
const sortedBreakpoints = computed<Breakpoint[]>(() => [...props.gridBreakpoints].sort((a, b) => a.min - b.min))
@@ -105,16 +105,16 @@ const { gridCalculations, visibleIndexes, viewportOffset, updateScrollTop, scrol
itemHeight: props.itemHeight,
containerHeight,
gridItems: effectiveCols,
bufferFactor: props.bufferFactor
bufferFactor: props.bufferFactor,
})
const contentStyles = computed(() => ({
height: `${gridCalculations.value.totalHeight}px`
height: `${gridCalculations.value.totalHeight}px`,
}))
const viewportStyle = computed(() => {
const base: Record<string, string> = {
transform: `translateY(${viewportOffset.value}px)`
transform: `translateY(${viewportOffset.value}px)`,
}
if (isGridMode.value) {
base['--items-per-row'] = String(effectiveCols.value)
@@ -173,7 +173,7 @@ onMounted(() => {
const el = containerRef.value
if (!el) return
ro = new ResizeObserver(updateContainerMetrics)
ro.observe(el)
ro.observe(el as unknown as Element)
if (props.pageMode) {
ro.observe(document.documentElement)
window.addEventListener('scroll', handlePageScroll, { passive: true })
@@ -252,11 +252,11 @@ defineExpose({ scrollTo, scrollToTop, scrollToBottom, setViewMode, toggleViewMod
}
.virtual-scroller-viewport.is-grid {
width: 100%;
display: grid;
width: 100%;
grid-template-columns: repeat(var(--items-per-row, 1), minmax(0, 1fr));
grid-auto-rows: var(--row-height, 1px);
gap: var(--item-gap, 0px);
gap: var(--item-gap, 0);
}
.virtual-scroller-viewport.is-list .virtual-scroller-item {

View File

@@ -61,7 +61,7 @@ const props = withDefaults(defineProps<Props>(), {
cancelButtonText: 'Cancel',
showClose: true,
center: false,
type: undefined
type: undefined,
})
const emit = defineEmits<Emits>()
@@ -104,54 +104,51 @@ const onCancel = () => {
<script lang="ts">
export default {
name: 'ConfirmMessageBox'
name: 'ConfirmMessageBox',
}
</script>
<style scoped>
.messagebox-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
inset: 0;
z-index: 2000;
display: flex;
justify-content: center;
align-items: center;
background: rgb(0 0 0 / 50%);
}
.messagebox-container {
background: white;
border-radius: 0.75rem;
box-shadow:
0 20px 25px -5px rgba(0, 0, 0, 0.1),
0 10px 10px -5px rgba(0, 0, 0, 0.04);
max-width: 32rem;
width: 90%;
max-height: 80vh;
overflow: hidden;
border-radius: 0.75rem;
width: 90%;
max-width: 32rem;
max-height: 80vh;
background: white;
box-shadow:
0 20px 25px -5px rgb(0 0 0 / 10%),
0 10px 10px -5px rgb(0 0 0 / 4%);
}
:root.dark .messagebox-container,
:root.auto.dark .messagebox-container {
background: rgb(31 41 55);
border: 1px solid rgb(55 65 81);
background: rgb(31 41 55);
}
.messagebox-header {
padding: 1.5rem 1.5rem 0 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.5rem 1.5rem 0;
}
.messagebox-title {
margin: 0;
font-size: 1.25rem;
font-weight: 600;
color: rgb(17 24 39);
margin: 0;
}
:root.dark .messagebox-title,
@@ -160,23 +157,23 @@ export default {
}
.messagebox-close {
background: none;
display: flex;
justify-content: center;
align-items: center;
border: none;
font-size: 1.5rem;
color: rgb(107 114 128);
cursor: pointer;
border-radius: 0.25rem;
padding: 0;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 0.25rem;
font-size: 1.5rem;
color: rgb(107 114 128);
background: none;
cursor: pointer;
}
.messagebox-close:hover {
background: rgb(243 244 246);
color: rgb(17 24 39);
background: rgb(243 244 246);
}
:root.dark .messagebox-close,
@@ -186,15 +183,15 @@ export default {
:root.dark .messagebox-close:hover,
:root.auto.dark .messagebox-close:hover {
background: rgb(55 65 81);
color: rgb(243 244 246);
background: rgb(55 65 81);
}
.messagebox-content {
padding: 1rem 1.5rem;
display: flex;
gap: 1rem;
align-items: flex-start;
padding: 1rem 1.5rem;
gap: 1rem;
}
.messagebox-icon {
@@ -223,9 +220,9 @@ export default {
}
.messagebox-message p {
margin: 0;
color: rgb(107 114 128);
line-height: 1.6;
margin: 0;
}
:root.dark .messagebox-message p,
@@ -235,9 +232,9 @@ export default {
.messagebox-actions {
display: flex;
gap: 0.75rem;
padding: 0 1.5rem 1.5rem 1.5rem;
justify-content: flex-end;
padding: 0 1.5rem 1.5rem;
gap: 0.75rem;
}
.messagebox-actions.center {
@@ -245,19 +242,19 @@ export default {
}
.messagebox-btn {
padding: 0.5rem 1rem;
border: none;
border-radius: 0.375rem;
padding: 0.5rem 1rem;
min-width: 4rem;
font-size: 0.875rem;
font-weight: 500;
border: none;
cursor: pointer;
min-width: 4rem;
}
.cancel-btn {
background: rgb(243 244 246);
color: rgb(75 85 99);
border: 1px solid rgb(209 213 219);
color: rgb(75 85 99);
background: rgb(243 244 246);
}
.cancel-btn:hover {
@@ -266,9 +263,9 @@ export default {
:root.dark .cancel-btn,
:root.auto.dark .cancel-btn {
background: rgb(55 65 81);
color: rgb(209 213 219);
border-color: rgb(75 85 99);
color: rgb(209 213 219);
background: rgb(55 65 81);
}
:root.dark .cancel-btn:hover,
@@ -277,8 +274,8 @@ export default {
}
.confirm-btn.primary {
background: rgb(59 130 246);
color: white;
background: rgb(59 130 246);
}
.confirm-btn.primary:hover {
@@ -286,8 +283,8 @@ export default {
}
.confirm-btn.danger {
background: rgb(239 68 68);
color: white;
background: rgb(239 68 68);
}
.confirm-btn.danger:hover {
@@ -295,8 +292,8 @@ export default {
}
.confirm-btn.success {
background: rgb(34 197 94);
color: white;
background: rgb(34 197 94);
}
.confirm-btn.success:hover {

View File

@@ -72,7 +72,7 @@ const addMessage = (options: MessageOptions) => {
const message: MessageItem = {
id,
...options,
showClose
showClose,
}
if (duration > 0) {
@@ -108,13 +108,13 @@ defineExpose({
warning,
info,
addMessage,
removeMessage
removeMessage,
})
</script>
<script lang="ts">
export default {
name: 'MessageToast'
name: 'MessageToast',
}
</script>
@@ -130,25 +130,25 @@ export default {
.message-toast {
display: flex;
align-items: flex-start;
gap: 0.75rem;
padding: 0.75rem 1rem;
margin-bottom: 0.5rem;
border-radius: 0.5rem;
box-shadow:
0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -1px rgba(0, 0, 0, 0.06);
max-width: 24rem;
min-width: 20rem;
pointer-events: all;
background: white;
border: 1px solid rgb(229 231 235);
word-wrap: break-word;
border-radius: 0.5rem;
padding: 0.75rem 1rem;
min-width: 20rem;
max-width: 24rem;
background: white;
box-shadow:
0 4px 6px -1px rgb(0 0 0 / 10%),
0 2px 4px -1px rgb(0 0 0 / 6%);
gap: 0.75rem;
pointer-events: all;
overflow-wrap: break-word;
}
:root.dark .message-toast,
:root.auto.dark .message-toast {
background: rgb(31 41 55);
border-color: rgb(55 65 81);
background: rgb(31 41 55);
}
.message-info {
@@ -189,15 +189,14 @@ export default {
}
.message-content {
flex: 1;
color: rgb(75 85 99);
min-width: 0;
font-size: 0.875rem;
color: rgb(75 85 99);
flex: 1;
line-height: 1.25rem;
word-wrap: break-word;
word-break: break-word;
overflow-wrap: break-word;
hyphens: auto;
min-width: 0;
}
:root.dark .message-content,
@@ -206,22 +205,22 @@ export default {
}
.message-close {
background: none;
border: none;
color: rgb(107 114 128);
cursor: pointer;
padding: 0.25rem;
border-radius: 0.25rem;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
align-items: center;
margin-top: 0.125rem;
border: none;
border-radius: 0.25rem;
padding: 0.25rem;
color: rgb(107 114 128);
background: none;
cursor: pointer;
flex-shrink: 0;
}
.message-close:hover {
background: rgb(243 244 246);
color: rgb(75 85 99);
background: rgb(243 244 246);
}
:root.dark .message-close,
@@ -231,8 +230,8 @@ export default {
:root.dark .message-close:hover,
:root.auto.dark .message-close:hover {
background: rgb(55 65 81);
color: rgb(209 213 219);
background: rgb(55 65 81);
}
/* Transition animations */

View File

@@ -21,24 +21,24 @@ const themeOptions = computed(() => [
value: 'light',
label: t('settings.theme.light'),
icon: Sun,
description: t('settings.theme.lightDesc')
description: t('settings.theme.lightDesc'),
},
{
value: 'dark',
label: t('settings.theme.dark'),
icon: Moon,
description: t('settings.theme.darkDesc')
description: t('settings.theme.darkDesc'),
},
{
value: 'auto',
label: t('settings.theme.auto'),
icon: Monitor,
description: t('settings.theme.autoDesc')
}
description: t('settings.theme.autoDesc'),
},
])
const currentThemeOption = computed(
() => themeOptions.value.find(option => option.value === currentTheme.value) || themeOptions.value[0]
() => themeOptions.value.find(option => option.value === currentTheme.value) || themeOptions.value[0],
)
const toggleTheme = () => {
@@ -65,26 +65,26 @@ const toggleTheme = () => {
.theme-toggle-btn {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
border: 1px solid var(--color-border);
background: rgba(255, 255, 255, 0.1);
color: var(--color-text-secondary);
border-radius: var(--radius-md);
cursor: pointer;
padding: 0.5rem 0.75rem;
font-size: 0.875rem;
color: var(--color-text-secondary);
background: rgb(255 255 255 / 10%);
transition: all 0.2s ease;
gap: 0.5rem;
cursor: pointer;
}
.theme-toggle-btn.collapsed {
justify-content: center;
padding: 0.5rem;
gap: 0;
justify-content: center;
}
.theme-toggle-btn:hover {
background: var(--color-surface-elevated);
color: var(--color-text-primary);
background: var(--color-surface-elevated);
}
.theme-label {
@@ -92,15 +92,15 @@ const toggleTheme = () => {
}
/* Mobile responsive */
@media (max-width: 768px) {
@media (width <= 768px) {
.theme-label {
display: none;
}
.theme-toggle-btn {
justify-content: center;
padding: 0.5rem;
gap: 0;
justify-content: center;
}
}
</style>

View File

@@ -89,21 +89,21 @@ onBeforeUnmount(() => {
.title-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
left: 0;
z-index: 1000;
border-bottom: 1px solid var(--color-border);
height: 32px;
background: var(--color-background-secondary);
border-bottom: 1px solid var(--color-border);
z-index: 1000;
-webkit-app-region: drag;
}
.title-bar-content {
display: flex;
align-items: center;
justify-content: space-between;
height: 100%;
align-items: center;
padding: 0 16px;
height: 100%;
}
.title-left {
@@ -132,11 +132,11 @@ onBeforeUnmount(() => {
}
.app-version {
border-radius: 4px;
padding: 2px 6px;
font-size: 12px;
color: var(--color-text-secondary);
background: var(--color-border);
padding: 2px 6px;
border-radius: 4px;
}
.title-center {
@@ -155,24 +155,24 @@ onBeforeUnmount(() => {
}
.progress-bar {
flex: 1;
overflow: hidden;
border-radius: 2px;
height: 4px;
background: var(--color-border);
border-radius: 2px;
overflow: hidden;
flex: 1;
}
.progress-fill {
border-radius: 2px;
height: 100%;
background: var(--color-success);
border-radius: 2px;
transition: width 0.3s ease;
}
.progress-text {
min-width: 35px;
font-size: 11px;
color: var(--color-text-secondary);
min-width: 35px;
}
.title-right {
@@ -189,21 +189,21 @@ onBeforeUnmount(() => {
.control-button {
display: flex;
align-items: center;
justify-content: center;
align-items: center;
border: none;
border-radius: 4px;
width: 28px;
height: 20px;
border: none;
background: transparent;
border-radius: 4px;
color: var(--color-text-secondary);
cursor: pointer;
background: transparent;
transition: var(--transition);
cursor: pointer;
}
.control-button:hover {
background: var(--color-surface-elevated);
color: var(--color-text-primary);
background: var(--color-surface-elevated);
}
.pin-button.active {
@@ -212,7 +212,7 @@ onBeforeUnmount(() => {
}
.close-button:hover {
background: var(--color-danger);
color: white;
background: var(--color-danger);
}
</style>

View File

@@ -37,7 +37,7 @@ const confirmOptions = reactive<ConfirmOptions>({
confirmButtonText: 'Confirm',
cancelButtonText: 'Cancel',
showClose: true,
center: false
center: false,
})
let confirmResolve: ((value: boolean) => void) | null = null
@@ -67,7 +67,7 @@ const showConfirm = (options: ConfirmOptions): Promise<boolean> => {
cancelButtonText: 'Cancel',
showClose: true,
center: false,
...options
...options,
})
confirmResolve = resolve
confirmVisible.value = true
@@ -82,20 +82,20 @@ onMounted(() => {
success: messageRef.value.success,
error: messageRef.value.error,
warning: messageRef.value.warning,
info: messageRef.value.info
info: messageRef.value.info,
})
}
// Initialize confirm service
const { setConfirmService } = useConfirm()
setConfirmService({
confirm: showConfirm
confirm: showConfirm,
})
})
</script>
<script lang="ts">
export default {
name: 'UIServiceProvider'
name: 'UIServiceProvider',
}
</script>