feat(ui): basic layout
Some checks failed
ci / ci (22, ubuntu-latest) (push) Has been cancelled

This commit is contained in:
2025-12-07 21:27:23 +01:00
parent bfb3bafab2
commit db91dfc8fd
18 changed files with 265 additions and 247 deletions

6
app/pages/dashboard.vue Normal file
View File

@@ -0,0 +1,6 @@
<template>dashboard</template>
<script setup lang="ts">
const { setPageName } = usePageTitle();
setPageName('Dashboard');
</script>

View File

@@ -1,76 +1,83 @@
<template>
<div>
<UPageHero
title="Nuxt Starter Template"
description="A production-ready starter template powered by Nuxt UI. Build beautiful, accessible, and performant applications in minutes, not hours."
:links="[{
label: 'Get started',
to: 'https://ui.nuxt.com/docs/getting-started/installation/nuxt',
target: '_blank',
trailingIcon: 'i-lucide-arrow-right',
size: 'xl'
}, {
label: 'Use this template',
to: 'https://github.com/nuxt-ui-templates/starter',
target: '_blank',
icon: 'i-simple-icons-github',
size: 'xl',
color: 'neutral',
variant: 'subtle'
}]"
title="Tímmál"
description="A privacy-first work time tracking application. Track time spent on tickets, generate reports, and streamline your activity report workflow."
:links="[
{
label: 'Get Started',
to: '/dashboard',
trailingIcon: 'i-lucide-arrow-right',
size: 'xl',
},
]"
/>
<UPageSection
id="features"
title="Everything you need to build modern Nuxt apps"
description="Start with a solid foundation. This template includes all the essentials for building production-ready applications with Nuxt UI's powerful component system."
:features="[{
icon: 'i-lucide-rocket',
title: 'Production-ready from day one',
description: 'Pre-configured with TypeScript, ESLint, Tailwind CSS, and all the best practices. Focus on building features, not setting up tooling.'
}, {
icon: 'i-lucide-palette',
title: 'Beautiful by default',
description: 'Leveraging Nuxt UI\'s design system with automatic dark mode, consistent spacing, and polished components that look great out of the box.'
}, {
icon: 'i-lucide-zap',
title: 'Lightning fast',
description: 'Optimized for performance with SSR/SSG support, automatic code splitting, and edge-ready deployment. Your users will love the speed.'
}, {
icon: 'i-lucide-blocks',
title: '100+ components included',
description: 'Access Nuxt UI\'s comprehensive component library. From forms to navigation, everything is accessible, responsive, and customizable.'
}, {
icon: 'i-lucide-code-2',
title: 'Developer experience first',
description: 'Auto-imports, hot module replacement, and TypeScript support. Write less boilerplate and ship more features.'
}, {
icon: 'i-lucide-shield-check',
title: 'Built for scale',
description: 'Enterprise-ready architecture with proper error handling, SEO optimization, and security best practices built-in.'
}]"
title="Track the time you spend on your tickets."
description="Built for developers and consultants who need to track billable hours across multiple projects and tasks. Seamlessly integrate with your existing workflow."
:features="[
{
icon: 'i-lucide-timer',
title: 'Smart Timer',
description:
'Start and stop timers on tasks with a single click. Timer persists across page refreshes and browser crashes, so you never lose tracking data.',
},
{
icon: 'i-lucide-calendar-clock',
title: 'Manual Entry',
description:
'Add time entries manually for forgotten work sessions. Automatic overlap detection ensures data integrity and prevents double-counting.',
},
{
icon: 'i-lucide-table',
title: 'Excel-Compatible Reports',
description:
'Generate time grid reports showing percentages of your workday (0.0-1.0). Copy directly into Excel for your CRA with tab-separated formatting.',
},
{
icon: 'i-lucide-shield',
title: 'Privacy-First',
description:
'OAuth authentication with Google or Microsoft. Your data stays yours with Pocketbase backend. No third-party tracking or analytics.',
},
{
icon: 'i-lucide-workflow',
title: 'Project Organization',
description:
'Group tasks by projects, track time per ticket, and view statistics. Tasks are sorted alphabetically within projects for easy navigation.',
},
{
icon: 'i-lucide-shield-check',
title: 'Automatic Validation & Data Integrity',
description:
'Prevents overlapping time entries, validates duration limits (max 24 hours), and ensures start times are before end times. Never submit invalid data to your reports.',
},
]"
/>
<UPageSection>
<UPageCTA
title="Ready to build your next Nuxt app?"
description="Join thousands of developers building with Nuxt and Nuxt UI. Get this template and start shipping today."
title="Ready to streamline your time tracking?"
description="Stop juggling spreadsheets and timers. Tímmál handles the complexity so you can focus on your work."
variant="subtle"
:links="[{
label: 'Start building',
to: 'https://ui.nuxt.com/docs/getting-started/installation/nuxt',
target: '_blank',
trailingIcon: 'i-lucide-arrow-right',
color: 'neutral'
}, {
label: 'View on GitHub',
to: 'https://github.com/nuxt-ui-templates/starter',
target: '_blank',
icon: 'i-simple-icons-github',
color: 'neutral',
variant: 'outline'
}]"
class="bg-"
:links="[
{
label: 'Start tracking',
to: '/dashboard',
trailingIcon: 'i-lucide-arrow-right',
color: 'neutral',
},
]"
/>
</UPageSection>
</div>
</template>
<script lang="ts" setup>
definePageMeta({
layout: 'unauthenticated',
});
</script>

6
app/pages/projects.vue Normal file
View File

@@ -0,0 +1,6 @@
<template>projects</template>
<script setup lang="ts">
const { setPageName } = usePageTitle();
setPageName('Projects');
</script>

6
app/pages/reports.vue Normal file
View File

@@ -0,0 +1,6 @@
<template>reports</template>
<script setup lang="ts">
const { setPageName } = usePageTitle();
setPageName('Reports');
</script>

6
app/pages/settings.vue Normal file
View File

@@ -0,0 +1,6 @@
<template>settings</template>
<script setup lang="ts">
const { setPageName } = usePageTitle();
setPageName('Settings');
</script>

11
app/pages/signin.vue Normal file
View File

@@ -0,0 +1,11 @@
<template>
<UPage>
<span> Signin </span>
</UPage>
</template>
<script lang="ts" setup>
definePageMeta({
layout: 'unauthenticated',
});
</script>

6
app/pages/tasks.vue Normal file
View File

@@ -0,0 +1,6 @@
<template>tasks</template>
<script setup lang="ts">
const { setPageName } = usePageTitle();
setPageName('Tasks');
</script>