commit
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,6 +6,9 @@
|
|||||||
.cache
|
.cache
|
||||||
dist
|
dist
|
||||||
|
|
||||||
|
# Continue
|
||||||
|
.continue
|
||||||
|
|
||||||
# Node dependencies
|
# Node dependencies
|
||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,33 @@
|
|||||||
@import "@nuxt/ui";
|
@import "@nuxt/ui";
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--font-sans: "Space Grotesk", sans-serif;
|
/*--font-sans: "Space Grotesk", sans-serif;*/
|
||||||
|
--font-sans : "Geist";
|
||||||
|
|
||||||
|
/* Main UI color, for now*/
|
||||||
|
--ui-primary: var(--color-blue-600);
|
||||||
|
--ui-bg-accented: oklch(54.6% 0.245 262.881 / 20%);
|
||||||
|
--ui-bg-elevated: oklch(54.6% 0.245 262.881 / 40%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.geist {
|
||||||
|
font-family: "Geist";
|
||||||
|
}
|
||||||
|
.geist-mono {
|
||||||
|
font-family: "Geist Mono";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.light {
|
||||||
|
--ui-bg: var(--color-neutral-200);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--ui-bg: var(--color-black);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.inter {
|
.inter {
|
||||||
font-family: "Inter";
|
font-family: "Inter";
|
||||||
}
|
}
|
||||||
32
app/components/main_header.vue
Normal file
32
app/components/main_header.vue
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
ui_colors: {
|
||||||
|
type: Array,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: "Home"
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<UHeader :toggle="false" class="bg-zinc-950 mb-4">
|
||||||
|
<template #title>
|
||||||
|
<h2 class="font-bold">{{props.title}}</h2>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<UColorModeButton />
|
||||||
|
<UDropdownMenu :items="props.ui_colors">
|
||||||
|
<UButton icon="lucide:palette" variant="ghost" color="neutral" />
|
||||||
|
</UDropdownMenu>
|
||||||
|
</template>
|
||||||
|
</UHeader>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
27
app/composables/set_colors.ts
Normal file
27
app/composables/set_colors.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
export function set_color(color: string) {
|
||||||
|
|
||||||
|
}
|
||||||
|
export const ui_colors_dropdown = ref([
|
||||||
|
{
|
||||||
|
label: "Blue",
|
||||||
|
class: "",
|
||||||
|
onselect: () => set_color("blue")
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Red",
|
||||||
|
onselect: () => set_color("red")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Green",
|
||||||
|
onselect: () => set_color("green")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Pink",
|
||||||
|
onselect: () => set_color("pink")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Purple",
|
||||||
|
onselect: () => set_color("purple")
|
||||||
|
}
|
||||||
|
])
|
||||||
@@ -1,47 +1,118 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
function set_color(color: string) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const ui_colors_dropdown = ref([
|
|
||||||
{
|
|
||||||
label: "Blue",
|
|
||||||
class: "",
|
|
||||||
onselect: () => set_color("blue")
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Red",
|
|
||||||
onselect: () => set_color("red")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Green",
|
|
||||||
onselect: () => set_color("green")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Pink",
|
|
||||||
onselect: () => set_color("pink")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Purple",
|
|
||||||
onselect: () => set_color("purple")
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<UHeader title="">
|
<MainHeader :ui_colors="ui_colors_dropdown"/>
|
||||||
<template #right>
|
<div class="justify-center flex flex-col mt-4 mb-4 w-full">
|
||||||
<UColorModeButton />
|
<h1 class="inter font-bold text-center mt-3 mb-3 text-white white-glow text-5xl md:text-7xl rgb-text">Youtube to MP3</h1>
|
||||||
<UDropdownMenu :items="ui_colors_dropdown">
|
|
||||||
<UButton icon="lucide:palette" variant="ghost" color="neutral" />
|
<div class="w-full flex self-center justify-center">
|
||||||
</UDropdownMenu>
|
<UInput
|
||||||
</template>
|
class="self-center w-1/3 geist-mono mt-3 mb-3"
|
||||||
</UHeader>
|
:ui="{ base: 'rounded-2xl h-15 text-toned', trailing: 'p-0' }"
|
||||||
<div class="justify-center flex flex-col">
|
placeholder="Search for a YouTube video..." >
|
||||||
<h1 class="inter text-8xl font-bold text-center">Youtube to MP3</h1>
|
<template #trailing>
|
||||||
<UInput class="self-center" size="xl"></UInput>
|
<UButton class="self-end rounded-r-2xl h-15 px-3" icon="lucide:search" />
|
||||||
|
</template>
|
||||||
|
</UInput>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
<div class="w-full max-w-md mx-auto mt-8 p-6 bg-zinc-950 rounded-xl">
|
||||||
|
|
||||||
|
<div class="video-container">
|
||||||
|
<iframe
|
||||||
|
class="w-full"
|
||||||
|
height="315"
|
||||||
|
src="https://www.youtube.com/embed/vkNHMqQqCtk?si=Jnd3Vx17iDKw-v3f"
|
||||||
|
title="YouTube video player" frameborder="0"
|
||||||
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||||
|
referrerpolicy="strict-origin-when-cross-origin"
|
||||||
|
allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<UFormField id="videoUrl" class="w-full mt-3 mb-4" label="Video URL:" >
|
||||||
|
<UInput type="text" value="https://www.youtube.com/watch?v=dQw4w9WgXcQ" class="w-full" />
|
||||||
|
</UFormField>
|
||||||
|
<UFormField id="outputFile" class="w-full mt-4 mb-3" label="Output File Name:">
|
||||||
|
<UInput type="text" value="my_audio.mp3" class="w-full" />
|
||||||
|
</UFormField>
|
||||||
|
<div class="text-center">
|
||||||
|
<UButton class="mt-4 rounded-md px-6 py-3 text-white" >Convert to MP3</UButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.rgb-text {
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
var(--color-red-500),
|
||||||
|
var(--color-yellow-500),
|
||||||
|
var(--color-lime-500),
|
||||||
|
var(--color-cyan-500),
|
||||||
|
var(--color-blue-500),
|
||||||
|
var(--color-pink-500),
|
||||||
|
var(--color-red-500)
|
||||||
|
);
|
||||||
|
background-size: 400% 100%;
|
||||||
|
animation: rgb 10s linear infinite;
|
||||||
|
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
|
||||||
|
/* optional glow */
|
||||||
|
/*filter: drop-shadow(0 0 10px rgba(255,255,255,.4));*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rgb {
|
||||||
|
to {
|
||||||
|
background-position: 400% 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.white-glow {
|
||||||
|
filter: drop-shadow(0 0 10px rgba(255,255,255,.2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*.rgb-input {
|
||||||
|
position: relative;
|
||||||
|
padding: 2px;
|
||||||
|
background: #111;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
z-index: 0;
|
||||||
|
@apply: rounded-lg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rgb-input::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
inset: 2px;
|
||||||
|
border-radius: inherit;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
red,
|
||||||
|
yellow,
|
||||||
|
lime,
|
||||||
|
cyan,
|
||||||
|
blue,
|
||||||
|
magenta,
|
||||||
|
red
|
||||||
|
);
|
||||||
|
background-size: 400%;
|
||||||
|
animation: rgb 8s linear infinite;
|
||||||
|
filter: blur(2px);
|
||||||
|
z-index: -1;
|
||||||
|
@apply: rounded-lg;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -20,5 +20,8 @@
|
|||||||
"tailwindcss": "^4.1.18",
|
"tailwindcss": "^4.1.18",
|
||||||
"vue": "^3.5.26",
|
"vue": "^3.5.26",
|
||||||
"vue-router": "^4.6.4"
|
"vue-router": "^4.6.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@iconify-json/lucide": "^1.2.84"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
pnpm-lock.yaml
generated
11
pnpm-lock.yaml
generated
@@ -38,6 +38,10 @@ importers:
|
|||||||
vue-router:
|
vue-router:
|
||||||
specifier: ^4.6.4
|
specifier: ^4.6.4
|
||||||
version: 4.6.4(vue@3.5.26(typescript@5.9.3))
|
version: 4.6.4(vue@3.5.26(typescript@5.9.3))
|
||||||
|
devDependencies:
|
||||||
|
'@iconify-json/lucide':
|
||||||
|
specifier: ^1.2.84
|
||||||
|
version: 1.2.84
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -536,6 +540,9 @@ packages:
|
|||||||
'@floating-ui/vue@1.1.9':
|
'@floating-ui/vue@1.1.9':
|
||||||
resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==}
|
resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==}
|
||||||
|
|
||||||
|
'@iconify-json/lucide@1.2.84':
|
||||||
|
resolution: {integrity: sha512-m45MY1aW2swSK6Neb3J2qdZ+BxZ1VTdN7UeoXENwyMACG9bqGHWYJYxWoFzwoSnCfYLyKWTcBhesBgMd5IrUzQ==}
|
||||||
|
|
||||||
'@iconify/collections@1.0.638':
|
'@iconify/collections@1.0.638':
|
||||||
resolution: {integrity: sha512-QP163IfZcCxwEghlKGzVZzYS2VZtdBkyc16LbqQ5s92VgL5oZ/9iQKBwLAPZihJxQb2gWtFQir5Fp25Rfs9YFw==}
|
resolution: {integrity: sha512-QP163IfZcCxwEghlKGzVZzYS2VZtdBkyc16LbqQ5s92VgL5oZ/9iQKBwLAPZihJxQb2gWtFQir5Fp25Rfs9YFw==}
|
||||||
|
|
||||||
@@ -4806,6 +4813,10 @@ snapshots:
|
|||||||
- '@vue/composition-api'
|
- '@vue/composition-api'
|
||||||
- vue
|
- vue
|
||||||
|
|
||||||
|
'@iconify-json/lucide@1.2.84':
|
||||||
|
dependencies:
|
||||||
|
'@iconify/types': 2.0.0
|
||||||
|
|
||||||
'@iconify/collections@1.0.638':
|
'@iconify/collections@1.0.638':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@iconify/types': 2.0.0
|
'@iconify/types': 2.0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user