├── app ├── favicon.ico ├── loading.tsx ├── (index) │ ├── (auth) │ │ ├── login │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ └── signup │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ ├── layout.tsx │ └── (home) │ │ ├── page.tsx │ │ └── components │ │ ├── cta.tsx │ │ └── features.tsx ├── dashboard │ ├── profile │ │ └── subscribe │ │ │ ├── thank-you │ │ │ └── page.tsx │ │ │ ├── page.tsx │ │ │ └── components │ │ │ └── payment.tsx │ ├── invoices │ │ ├── create │ │ │ ├── page.tsx │ │ │ └── components │ │ │ │ └── invoice-view.tsx │ │ └── history │ │ │ ├── page.tsx │ │ │ └── components │ │ │ └── data-table.tsx │ ├── getting-started │ │ └── page.tsx │ ├── bills │ │ └── history │ │ │ ├── page.tsx │ │ │ └── components │ │ │ ├── columns.tsx │ │ │ └── data-table.tsx │ ├── page.tsx │ ├── components │ │ ├── greeting.tsx │ │ ├── invoices.tsx │ │ ├── outstanding.tsx │ │ ├── revenue.tsx │ │ ├── recent-bills.tsx │ │ └── recent-invoices.tsx │ ├── templates │ │ └── page.tsx │ ├── plan-upgraded │ │ └── page.tsx │ └── layout.tsx ├── not-found.tsx ├── manifest.ts └── layout.tsx ├── public ├── logo-192.png ├── logo-512.png ├── og-image.png ├── startup.mp3 ├── bg-gradient.png ├── apple-touch-icon.png ├── dashboard-mobile-dark.png ├── dashboard-desktop-dark.png ├── dashboard-desktop-light.png ├── dashboard-mobile-light.png ├── apple-touch-icon-precomposed.png ├── template-data │ ├── previews │ │ ├── azure.png │ │ ├── quiet.png │ │ └── midnight.png │ └── icons │ │ ├── email-dark.png │ │ ├── email-light.png │ │ ├── phone-dark.png │ │ ├── phone-light.png │ │ ├── address-dark.png │ │ └── address-light.png ├── avatars │ ├── microbe-6.svg │ ├── microbe-5.svg │ ├── microbe-2.svg │ ├── microbe-4.svg │ ├── microbe-1.svg │ └── microbe-3.svg └── logo.svg ├── postcss.config.mjs ├── lib ├── utils.ts ├── types.ts └── constants.ts ├── components ├── ui │ ├── skeleton.tsx │ ├── visually-hidden.tsx │ ├── collapsible.tsx │ ├── loader.tsx │ ├── textarea.tsx │ ├── label.tsx │ ├── toaster.tsx │ ├── separator.tsx │ ├── input.tsx │ ├── layout.tsx │ ├── animated-shiny-text.tsx │ ├── icon-button.tsx │ ├── badge.tsx │ ├── password-input.tsx │ ├── tooltip.tsx │ ├── popover.tsx │ ├── avatar.tsx │ ├── grid-pattern.tsx │ ├── rainbow-button.tsx │ ├── typography.tsx │ ├── text-shimmer.tsx │ ├── card.tsx │ ├── button.tsx │ ├── tabs.tsx │ ├── table.tsx │ ├── breadcrumb.tsx │ ├── drawer.tsx │ ├── magic-card.tsx │ ├── dialog.tsx │ ├── sheet.tsx │ ├── form.tsx │ ├── command.tsx │ └── toast.tsx ├── theme-provider.tsx ├── offline.tsx ├── prefixed-input.tsx ├── splash.tsx ├── footer.tsx ├── theme-toggle.tsx ├── cookie-consent.tsx ├── protected-route.tsx ├── menu.tsx ├── user-menu.tsx ├── installer.tsx └── navigation.tsx ├── hooks ├── use-debounce.ts ├── use-mobile.ts ├── use-online-status.ts ├── use-invoice-pagination.ts ├── use-bill-pagination.ts └── use-toast.ts ├── next.config.ts ├── components.json ├── store ├── use-templates.ts ├── use-bill.ts ├── use-analytics.ts ├── use-user.ts ├── use-profile.ts ├── use-view.ts ├── use-pagination.ts ├── use-bill-pagination.ts └── use-invoice.ts ├── eslint.config.mjs ├── .gitignore ├── tsconfig.json ├── README.md ├── firebase.config.ts ├── package.json ├── templates └── index.ts └── tailwind.config.ts /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /public/logo-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/logo-192.png -------------------------------------------------------------------------------- /public/logo-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/logo-512.png -------------------------------------------------------------------------------- /public/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/og-image.png -------------------------------------------------------------------------------- /public/startup.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/startup.mp3 -------------------------------------------------------------------------------- /public/bg-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/bg-gradient.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/dashboard-mobile-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/dashboard-mobile-dark.png -------------------------------------------------------------------------------- /public/dashboard-desktop-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/dashboard-desktop-dark.png -------------------------------------------------------------------------------- /public/dashboard-desktop-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/dashboard-desktop-light.png -------------------------------------------------------------------------------- /public/dashboard-mobile-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/dashboard-mobile-light.png -------------------------------------------------------------------------------- /app/loading.tsx: -------------------------------------------------------------------------------- 1 | import Splash from '@/components/splash'; 2 | 3 | export default function Loading() { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /public/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /public/template-data/previews/azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/previews/azure.png -------------------------------------------------------------------------------- /public/template-data/previews/quiet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/previews/quiet.png -------------------------------------------------------------------------------- /public/template-data/icons/email-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/icons/email-dark.png -------------------------------------------------------------------------------- /public/template-data/icons/email-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/icons/email-light.png -------------------------------------------------------------------------------- /public/template-data/icons/phone-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/icons/phone-dark.png -------------------------------------------------------------------------------- /public/template-data/icons/phone-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/icons/phone-light.png -------------------------------------------------------------------------------- /public/template-data/previews/midnight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/previews/midnight.png -------------------------------------------------------------------------------- /public/template-data/icons/address-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/icons/address-dark.png -------------------------------------------------------------------------------- /public/template-data/icons/address-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samadhi1311/hyperbooks/HEAD/public/template-data/icons/address-light.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | 3 | function Skeleton({ className, ...props }: React.HTMLAttributes) { 4 | return
; 5 | } 6 | 7 | export { Skeleton }; 8 | -------------------------------------------------------------------------------- /app/(index)/(auth)/login/layout.tsx: -------------------------------------------------------------------------------- 1 | export const metadata = { 2 | title: 'Login | hyperbooks.', 3 | description: 'Log in to your account to access hyperbooks.', 4 | }; 5 | 6 | export default function LoginLayout({ children }: { children: React.ReactNode }) { 7 | return <>{children}; 8 | } 9 | -------------------------------------------------------------------------------- /app/(index)/(auth)/signup/layout.tsx: -------------------------------------------------------------------------------- 1 | export const metadata = { 2 | title: 'Sign up | hyperbooks.', 3 | description: 'Sign up for an account and start invoicing.', 4 | }; 5 | 6 | export default function SignUpLayout({ children }: { children: React.ReactNode }) { 7 | return <>{children}; 8 | } 9 | -------------------------------------------------------------------------------- /components/ui/visually-hidden.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import * as Hidden from '@radix-ui/react-visually-hidden'; 4 | 5 | function VisuallyHidden({ children }: { children: React.ReactNode }) { 6 | return {children}; 7 | } 8 | 9 | export { VisuallyHidden }; 10 | -------------------------------------------------------------------------------- /app/dashboard/profile/subscribe/thank-you/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | export default function ThankYou() { 4 | return ( 5 |
6 |

Thank you for your payment!

7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /app/(index)/layout.tsx: -------------------------------------------------------------------------------- 1 | import Navigation from '@/components/navigation'; 2 | import Footer from '@/components/footer'; 3 | 4 | export default function IndexLayout({ children }: Readonly<{ children: React.ReactNode }>) { 5 | return ( 6 | <> 7 | 8 | {children} 9 |