Files
Frontend/src/views/HomeView.vue

196 lines
3.7 KiB
Vue
Raw Normal View History

2026-01-16 10:43:42 +01:00
<script setup lang="ts">
import { ref } from 'vue'
const url = ref<string>('')
const shortUrl = ref<string>('')
const handleShorten = (): void => {
// Logik hier einfügen
console.log('Shortening:', url.value)
}
const handleCopy = async (): Promise<void> => {
if (shortUrl.value) {
await navigator.clipboard.writeText(shortUrl.value)
alert('Copied to clipboard!')
}
}
</script>
<template>
<div class="page-layout">
<div class="content-wrapper">
<h1 class="logo">bolt-link</h1>
<div class="panel">
<div class="panel-header">
<span class="icon pi pi-link"></span>
<h2>Shorten your link</h2>
</div>
<div class="input-group">
<div class="row">
<input
v-model="url"
type="text"
placeholder="Paste your URL here..."
class="text-input"
/>
<button @click="handleShorten" class="btn-primary">
Shorten <span class="arrow pi pi-arrow-right"></span>
</button>
</div>
<div class="row">
<input
v-model="shortUrl"
type="text"
readonly
placeholder="Short URL appears here..."
class="text-input readonly"
/>
<button @click="handleCopy" class="btn-primary">
Copy <span class="copy-icon pi pi-copy"></span>
</button>
</div>
</div>
</div>
</div>
</div>
</template>
<style scoped>
/* Grundlayout: Zentriert alles auf der Seite */
.page-layout {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
width: 100%;
background-color: #05080f; /* Sehr dunkles Blau/Schwarz */
margin: 0;
font-family:
'Inter',
-apple-system,
sans-serif;
}
/* Container für Logo + Panel */
.content-wrapper {
display: flex;
flex-direction: column;
align-items: center;
2026-01-16 12:17:01 +01:00
gap: 1rem;
2026-01-16 10:43:42 +01:00
width: 100%;
max-width: 550px;
padding: 20px;
}
/* Logo Styling mit Glow */
.logo {
color: var(--primary-color);
font-size: 6rem;
font-weight: 900;
margin: 0;
letter-spacing: -2px;
text-shadow: 0 0 20px rgba(74, 222, 128, 0.5);
}
/* Das Panel */
.panel {
background-color: var(--panel-color);
border: 1px solid var(--border-color);
border-radius: 1.5rem;
padding: 2.5rem;
width: 100%;
filter: drop-shadow(0 0 0.75rem var(--primary-color));
}
.panel-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 1.5rem;
}
.panel-header h2 {
color: var(--text-light);
font-size: 1.25rem;
margin: 0;
font-weight: 600;
}
.icon {
font-size: 1.25rem;
}
/* Input & Button Rows */
.input-group {
display: flex;
flex-direction: column;
gap: 1rem;
}
.row {
display: flex;
gap: 0.75rem;
}
.text-input {
flex: 1;
background-color: var(--input-color);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 12px 16px;
color: var(--text-light);
font-size: 0.9rem;
outline: none;
transition: border-color 0.2s;
}
.text-input:focus {
border-color: var(--primary-color);
}
.text-input.readonly {
color: #64748b;
cursor: default;
}
/* Button Styling */
.btn-primary {
background-color: var(--primary-color);
color: var(--text-color-dark);
border: none;
border-radius: 8px;
padding: 0 20px;
font-weight: 700;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
white-space: nowrap;
transition:
transform 0.1s,
background-color 0.2s;
width: 7rem;
}
.btn-primary:hover {
background-color: #0fe0ac;
}
.btn-primary:active {
transform: scale(0.98);
}
.pi-arrow-right .pi-copy {
font-size: 1rem;
}
.pi-link {
font-size: 2rem;
color: var(--primary-color);
}
</style>