@digilogiclabs/create-saas-app 1.10.6 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +331 -350
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/create.js +2 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/generators/template-generator.d.ts.map +1 -1
- package/dist/generators/template-generator.js +14 -2
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/templates/web/ui-auth/template/.claude +21 -0
- package/dist/templates/web/ui-auth/template/context.md +105 -0
- package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
- package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
- package/dist/templates/web/ui-auth-payments-ai/template/.claude +21 -0
- package/dist/templates/web/ui-auth-payments-ai/template/.env.example +15 -0
- package/dist/templates/web/ui-auth-payments-ai/template/README.md +207 -0
- package/dist/templates/web/ui-auth-payments-ai/template/context.md +169 -0
- package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
- package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
- package/dist/templates/web/ui-auth-payments-ai/template/package.json +55 -0
- package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +380 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +640 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
- package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +28 -20
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
- package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
- package/package.json +1 -1
- package/src/templates/web/ui-auth/template/.claude +21 -0
- package/src/templates/web/ui-auth/template/context.md +105 -0
- package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
- package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
- package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
- package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
- package/src/templates/web/ui-auth-payments-ai/template/.claude +21 -0
- package/src/templates/web/ui-auth-payments-ai/template/.env.example +15 -0
- package/src/templates/web/ui-auth-payments-ai/template/README.md +207 -0
- package/src/templates/web/ui-auth-payments-ai/template/context.md +169 -0
- package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
- package/src/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
- package/src/templates/web/ui-auth-payments-ai/template/package.json +55 -0
- package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +380 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +640 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
- package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +28 -20
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
- package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
- package/dist/cli/commands/add.d.ts +0 -6
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js +0 -39
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -4
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -20
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -6
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -68
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -61
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/prompts/index.d.ts +0 -2
- package/dist/cli/prompts/index.d.ts.map +0 -1
- package/dist/cli/prompts/index.js +0 -18
- package/dist/cli/prompts/index.js.map +0 -1
- package/dist/cli/prompts/project-setup.d.ts +0 -5
- package/dist/cli/prompts/project-setup.d.ts.map +0 -1
- package/dist/cli/prompts/project-setup.js +0 -251
- package/dist/cli/prompts/project-setup.js.map +0 -1
- package/dist/cli/utils/git.d.ts +0 -9
- package/dist/cli/utils/git.d.ts.map +0 -1
- package/dist/cli/utils/git.js +0 -77
- package/dist/cli/utils/git.js.map +0 -1
- package/dist/cli/utils/index.d.ts +0 -5
- package/dist/cli/utils/index.d.ts.map +0 -1
- package/dist/cli/utils/index.js +0 -21
- package/dist/cli/utils/index.js.map +0 -1
- package/dist/cli/utils/logger.d.ts +0 -16
- package/dist/cli/utils/logger.d.ts.map +0 -1
- package/dist/cli/utils/logger.js +0 -55
- package/dist/cli/utils/logger.js.map +0 -1
- package/dist/cli/utils/package-manager.d.ts +0 -8
- package/dist/cli/utils/package-manager.d.ts.map +0 -1
- package/dist/cli/utils/package-manager.js +0 -92
- package/dist/cli/utils/package-manager.js.map +0 -1
- package/dist/cli/utils/spinner.d.ts +0 -7
- package/dist/cli/utils/spinner.d.ts.map +0 -1
- package/dist/cli/utils/spinner.js +0 -48
- package/dist/cli/utils/spinner.js.map +0 -1
- package/dist/cli/validators/dependencies.d.ts +0 -15
- package/dist/cli/validators/dependencies.d.ts.map +0 -1
- package/dist/cli/validators/dependencies.js +0 -108
- package/dist/cli/validators/dependencies.js.map +0 -1
- package/dist/cli/validators/index.d.ts +0 -3
- package/dist/cli/validators/index.d.ts.map +0 -1
- package/dist/cli/validators/index.js +0 -19
- package/dist/cli/validators/index.js.map +0 -1
- package/dist/cli/validators/project-name.d.ts +0 -5
- package/dist/cli/validators/project-name.d.ts.map +0 -1
- package/dist/cli/validators/project-name.js +0 -151
- package/dist/cli/validators/project-name.js.map +0 -1
- package/dist/generators/file-processor.d.ts +0 -28
- package/dist/generators/file-processor.d.ts.map +0 -1
- package/dist/generators/file-processor.js +0 -224
- package/dist/generators/file-processor.js.map +0 -1
- package/dist/generators/index.d.ts +0 -4
- package/dist/generators/index.d.ts.map +0 -1
- package/dist/generators/index.js +0 -20
- package/dist/generators/index.js.map +0 -1
- package/dist/generators/package-installer.d.ts +0 -29
- package/dist/generators/package-installer.d.ts.map +0 -1
- package/dist/generators/package-installer.js +0 -167
- package/dist/generators/package-installer.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config'
|
|
2
|
+
import react from '@vitejs/plugin-react'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [react()],
|
|
7
|
+
test: {
|
|
8
|
+
environment: 'jsdom',
|
|
9
|
+
setupFiles: ['./src/test/setup.ts'],
|
|
10
|
+
globals: true,
|
|
11
|
+
},
|
|
12
|
+
resolve: {
|
|
13
|
+
alias: {
|
|
14
|
+
'@': path.resolve(__dirname, './src'),
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
})
|
|
@@ -52,6 +52,14 @@ export default function Home() {
|
|
|
52
52
|
const projectName = "{{projectName}}"
|
|
53
53
|
const projectDescription = "{{description}}"
|
|
54
54
|
|
|
55
|
+
// Static glassmorphism classes to avoid template literal corruption
|
|
56
|
+
const glassCard = "bg-white/10 backdrop-blur-lg border border-white/20"
|
|
57
|
+
const glassCardRounded = "bg-white/10 backdrop-blur-lg border border-white/20 rounded-2xl"
|
|
58
|
+
const glassCardWithHover = "bg-white/10 backdrop-blur-lg border border-white/20 rounded-2xl hover:scale-105 transition-all duration-300"
|
|
59
|
+
const glassAccentIcon = "bg-white/10 backdrop-blur-lg border border-white/20 rounded-xl flex items-center justify-center hover:shadow-lg hover:shadow-purple-500/25 transition-all duration-300"
|
|
60
|
+
const glassBackground = "bg-gradient-to-br from-purple-900/20 via-blue-900/20 to-teal-900/20"
|
|
61
|
+
const glassBackgroundAccent = "bg-gradient-to-br from-purple-500/10 via-blue-500/10 to-teal-500/10"
|
|
62
|
+
|
|
55
63
|
const gridConfig = {
|
|
56
64
|
columns_1_2: { base: 1, md: 2 },
|
|
57
65
|
columns_1_3: { base: 1, md: 3 },
|
|
@@ -115,11 +123,11 @@ export default function Home() {
|
|
|
115
123
|
icon: CheckCircle
|
|
116
124
|
},
|
|
117
125
|
title: {
|
|
118
|
-
text:
|
|
126
|
+
text: "Welcome to " + projectName,
|
|
119
127
|
highlight: projectName,
|
|
120
128
|
size: "xl" as const
|
|
121
129
|
},
|
|
122
|
-
description:
|
|
130
|
+
description: projectDescription + ". Stream your favorite music with crystal-clear quality, offline downloads, and seamless playback across all your devices."
|
|
123
131
|
}
|
|
124
132
|
|
|
125
133
|
const handleSignOut = async () => {
|
|
@@ -151,9 +159,9 @@ export default function Home() {
|
|
|
151
159
|
hapticOnTrigger={true}
|
|
152
160
|
networkAware={true}
|
|
153
161
|
>
|
|
154
|
-
<main className={
|
|
162
|
+
<main className={"min-h-screen " + glass.background.primary + " relative overflow-hidden"}>
|
|
155
163
|
{/* Glassmorphism background overlay */}
|
|
156
|
-
<div className={
|
|
164
|
+
<div className={"absolute inset-0 " + glass.background.accent + " opacity-30"} />
|
|
157
165
|
<div className="relative z-10">
|
|
158
166
|
<MobileContainer className="py-8">
|
|
159
167
|
{/* Simple Auth Status */}
|
|
@@ -208,7 +216,7 @@ export default function Home() {
|
|
|
208
216
|
|
|
209
217
|
{/* Search Bar with Glassmorphism */}
|
|
210
218
|
<div className="max-w-2xl mx-auto mb-12">
|
|
211
|
-
<div className={
|
|
219
|
+
<div className={glass.card + " " + glass.border + " p-1 rounded-2xl " + animations.hover.lift}>
|
|
212
220
|
<AudioSearch
|
|
213
221
|
placeholder="Search for tracks, artists, or albums..."
|
|
214
222
|
onSearch={(query) => console.log('Searching:', query)}
|
|
@@ -224,7 +232,7 @@ export default function Home() {
|
|
|
224
232
|
{/* Main Content */}
|
|
225
233
|
<div className="lg:col-span-3 space-y-8">
|
|
226
234
|
{/* Now Playing Card with Enhanced Glassmorphism */}
|
|
227
|
-
<div className={
|
|
235
|
+
<div className={glass.card + " " + glass.border + " rounded-3xl p-6 mb-8 " + animations.hover.lift + " " + animations.transition.smooth}>
|
|
228
236
|
<NowPlayingCard
|
|
229
237
|
track={currentTrack || demoPlaylist[0]}
|
|
230
238
|
isPlaying={isPlaying}
|
|
@@ -236,7 +244,7 @@ export default function Home() {
|
|
|
236
244
|
|
|
237
245
|
{/* Featured Playlists with Staggered Animation */}
|
|
238
246
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
|
|
239
|
-
<div className={
|
|
247
|
+
<div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.short}>
|
|
240
248
|
<PlaylistCard
|
|
241
249
|
title="Today's Top Hits"
|
|
242
250
|
description="The most played songs today"
|
|
@@ -246,7 +254,7 @@ export default function Home() {
|
|
|
246
254
|
className="bg-transparent border-none"
|
|
247
255
|
/>
|
|
248
256
|
</div>
|
|
249
|
-
<div className={
|
|
257
|
+
<div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.medium}>
|
|
250
258
|
<PlaylistCard
|
|
251
259
|
title="Chill Vibes"
|
|
252
260
|
description="Relaxing music for focus and creativity"
|
|
@@ -256,7 +264,7 @@ export default function Home() {
|
|
|
256
264
|
className="bg-transparent border-none"
|
|
257
265
|
/>
|
|
258
266
|
</div>
|
|
259
|
-
<div className={
|
|
267
|
+
<div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.long}>
|
|
260
268
|
<PlaylistCard
|
|
261
269
|
title="Electronic Pulse"
|
|
262
270
|
description="High-energy electronic and dance music"
|
|
@@ -269,7 +277,7 @@ export default function Home() {
|
|
|
269
277
|
</div>
|
|
270
278
|
|
|
271
279
|
{/* Track List with Glassmorphism */}
|
|
272
|
-
<div className={
|
|
280
|
+
<div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.transition.smooth}>
|
|
273
281
|
<TrackList
|
|
274
282
|
tracks={demoPlaylist}
|
|
275
283
|
currentTrackId={currentTrack?.id}
|
|
@@ -288,7 +296,7 @@ export default function Home() {
|
|
|
288
296
|
|
|
289
297
|
{/* Sidebar with Glassmorphism */}
|
|
290
298
|
<div className="lg:col-span-1">
|
|
291
|
-
<div className={
|
|
299
|
+
<div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.lift + " " + animations.transition.smooth}>
|
|
292
300
|
<PlaylistSidebar
|
|
293
301
|
playlists={[
|
|
294
302
|
{ id: '1', name: 'Liked Songs', trackCount: 47 },
|
|
@@ -306,8 +314,8 @@ export default function Home() {
|
|
|
306
314
|
|
|
307
315
|
{/* Features Overview with Enhanced Glassmorphism */}
|
|
308
316
|
<ResponsiveGrid columns={gridConfig.columns_1_sm2_md4} gap="lg" className="mb-16">
|
|
309
|
-
<div className={
|
|
310
|
-
<div className={
|
|
317
|
+
<div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.short}>
|
|
318
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
311
319
|
<Zap className="h-6 w-6 text-blue-400" />
|
|
312
320
|
</div>
|
|
313
321
|
<h3 className="text-lg font-semibold mb-2">High-Quality Streaming</h3>
|
|
@@ -316,8 +324,8 @@ export default function Home() {
|
|
|
316
324
|
</p>
|
|
317
325
|
</div>
|
|
318
326
|
|
|
319
|
-
<div className={
|
|
320
|
-
<div className={
|
|
327
|
+
<div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.medium}>
|
|
328
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
321
329
|
<Shield className="h-6 w-6 text-green-400" />
|
|
322
330
|
</div>
|
|
323
331
|
<h3 className="text-lg font-semibold mb-2">Secure & Private</h3>
|
|
@@ -326,8 +334,8 @@ export default function Home() {
|
|
|
326
334
|
</p>
|
|
327
335
|
</div>
|
|
328
336
|
|
|
329
|
-
<div className={
|
|
330
|
-
<div className={
|
|
337
|
+
<div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.long}>
|
|
338
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
331
339
|
<Rocket className="h-6 w-6 text-purple-400" />
|
|
332
340
|
</div>
|
|
333
341
|
<h3 className="text-lg font-semibold mb-2">Offline Support</h3>
|
|
@@ -336,8 +344,8 @@ export default function Home() {
|
|
|
336
344
|
</p>
|
|
337
345
|
</div>
|
|
338
346
|
|
|
339
|
-
<div className={
|
|
340
|
-
<div className={
|
|
347
|
+
<div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.extra}>
|
|
348
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
341
349
|
<svg className="h-6 w-6 text-orange-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
342
350
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" />
|
|
343
351
|
</svg>
|
|
@@ -355,7 +363,7 @@ export default function Home() {
|
|
|
355
363
|
</OfflineWrapper>
|
|
356
364
|
|
|
357
365
|
{/* Fixed Audio Player Bar with Enhanced Glassmorphism */}
|
|
358
|
-
<div className={
|
|
366
|
+
<div className={"fixed bottom-0 left-0 right-0 z-50" + " " + glass.card + " " + glass.border + " " + "border-t backdrop-blur-xl"}>
|
|
359
367
|
<FixedAudioBar
|
|
360
368
|
track={currentTrack || demoPlaylist[0]}
|
|
361
369
|
isPlaying={isPlaying}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Button,
|
|
5
|
+
Card,
|
|
6
|
+
AudioPlayer,
|
|
7
|
+
PageTransition,
|
|
8
|
+
MobileContainer,
|
|
9
|
+
MobileHero,
|
|
10
|
+
ResponsiveGrid,
|
|
11
|
+
NetworkAwareContent,
|
|
12
|
+
OfflineWrapper,
|
|
13
|
+
SwipeableCard,
|
|
14
|
+
PullToRefresh,
|
|
15
|
+
useNetworkInfo,
|
|
16
|
+
useOfflineState,
|
|
17
|
+
FixedAudioBar,
|
|
18
|
+
PlaylistCard,
|
|
19
|
+
TrackList,
|
|
20
|
+
WaveformVisualizer,
|
|
21
|
+
AudioControls,
|
|
22
|
+
VolumeSlider,
|
|
23
|
+
ProgressBar,
|
|
24
|
+
ShuffleButton,
|
|
25
|
+
RepeatButton,
|
|
26
|
+
LikeButton,
|
|
27
|
+
ShareButton,
|
|
28
|
+
PlaylistSidebar,
|
|
29
|
+
AudioSearch,
|
|
30
|
+
NowPlayingCard,
|
|
31
|
+
useAnimationTokens,
|
|
32
|
+
useGlassmorphism
|
|
33
|
+
} from '@digilogiclabs/saas-factory-ui'
|
|
34
|
+
import { ArrowRight, Zap, Shield, Rocket, CheckCircle, LogOut, User, Music, Wifi, WifiOff } from 'lucide-react'
|
|
35
|
+
import { useAuth } from '@digilogiclabs/saas-factory-auth'
|
|
36
|
+
import Link from 'next/link'
|
|
37
|
+
import { useState } from 'react'
|
|
38
|
+
|
|
39
|
+
export default function Home() {
|
|
40
|
+
const { user, signOut, loading } = useAuth()
|
|
41
|
+
const networkInfo = useNetworkInfo()
|
|
42
|
+
const isOnline = useOfflineState()
|
|
43
|
+
const [isRefreshing, setIsRefreshing] = useState(false)
|
|
44
|
+
const [currentTrack, setCurrentTrack] = useState(null)
|
|
45
|
+
const [isPlaying, setIsPlaying] = useState(false)
|
|
46
|
+
const [showPlaylistSidebar, setShowPlaylistSidebar] = useState(false)
|
|
47
|
+
|
|
48
|
+
// Modern design tokens - Commenting out to fix mustache template processing
|
|
49
|
+
// const animations = useAnimationTokens()
|
|
50
|
+
// const glass = useGlassmorphism()
|
|
51
|
+
|
|
52
|
+
const projectName = "{{projectName}}"
|
|
53
|
+
const projectDescription = "{{description}}"
|
|
54
|
+
|
|
55
|
+
// Static glassmorphism classes to avoid template literal corruption
|
|
56
|
+
const glassCard = "bg-white/10 backdrop-blur-lg border border-white/20"
|
|
57
|
+
const glassCardRounded = "bg-white/10 backdrop-blur-lg border border-white/20 rounded-2xl"
|
|
58
|
+
const glassCardWithHover = "bg-white/10 backdrop-blur-lg border border-white/20 rounded-2xl hover:scale-105 transition-all duration-300"
|
|
59
|
+
const glassAccentIcon = "bg-white/10 backdrop-blur-lg border border-white/20 rounded-xl flex items-center justify-center hover:shadow-lg hover:shadow-purple-500/25 transition-all duration-300"
|
|
60
|
+
|
|
61
|
+
const gridConfig = {
|
|
62
|
+
columns_1_2: { base: 1, md: 2 },
|
|
63
|
+
columns_1_3: { base: 1, md: 3 },
|
|
64
|
+
columns_1_sm2: { base: 1, sm: 2 },
|
|
65
|
+
columns_1_sm2_md3: { base: 1, sm: 2, md: 3 },
|
|
66
|
+
columns_1_sm2_md4: { base: 1, sm: 2, md: 4 },
|
|
67
|
+
columns_2: { base: 2 },
|
|
68
|
+
columns_2_md3: { base: 2, md: 3 },
|
|
69
|
+
columns_2_2: { base: 2 },
|
|
70
|
+
columns_2_md4: { base: 2, md: 4 }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Demo playlist data
|
|
74
|
+
const demoPlaylist = [
|
|
75
|
+
{
|
|
76
|
+
id: '1',
|
|
77
|
+
title: 'Midnight Echoes',
|
|
78
|
+
artist: 'Luna Rivers',
|
|
79
|
+
album: 'Digital Dreams',
|
|
80
|
+
duration: 180,
|
|
81
|
+
url: 'https://www.soundjay.com/misc/sounds/bell-ringing-05.mp3',
|
|
82
|
+
coverArt: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiM4QjVDRjYiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjIiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4=',
|
|
83
|
+
liked: false
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: '2',
|
|
87
|
+
title: 'Neon Nights',
|
|
88
|
+
artist: 'The Frequency',
|
|
89
|
+
album: 'Electric Pulse',
|
|
90
|
+
duration: 210,
|
|
91
|
+
url: 'https://www.soundjay.com/misc/sounds/bell-ringing-05.mp3',
|
|
92
|
+
coverArt: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiNFRjQ0NDQiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjIiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4=',
|
|
93
|
+
liked: true
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: '3',
|
|
97
|
+
title: 'Ocean Waves',
|
|
98
|
+
artist: 'Ambient Flow',
|
|
99
|
+
album: 'Nature Sounds',
|
|
100
|
+
duration: 195,
|
|
101
|
+
url: 'https://www.soundjay.com/misc/sounds/bell-ringing-05.mp3',
|
|
102
|
+
coverArt: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiMwNjkyQzUiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjIiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4=',
|
|
103
|
+
liked: false
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: '4',
|
|
107
|
+
title: 'City Lights',
|
|
108
|
+
artist: 'Urban Echo',
|
|
109
|
+
album: 'Metropolitan',
|
|
110
|
+
duration: 225,
|
|
111
|
+
url: 'https://www.soundjay.com/misc/sounds/bell-ringing-05.mp3',
|
|
112
|
+
coverArt: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiNGNTk3MDAiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjIiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4=',
|
|
113
|
+
liked: true
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
const heroConfig = {
|
|
118
|
+
badge: {
|
|
119
|
+
text: "🎵 Premium Audio Experience",
|
|
120
|
+
variant: "secondary" as const,
|
|
121
|
+
icon: CheckCircle
|
|
122
|
+
},
|
|
123
|
+
title: {
|
|
124
|
+
text: `Welcome to ${projectName}`,
|
|
125
|
+
highlight: projectName,
|
|
126
|
+
size: "xl" as const
|
|
127
|
+
},
|
|
128
|
+
description: `${projectDescription}. Stream your favorite music with crystal-clear quality, offline downloads, and seamless playback across all your devices.`
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const handleSignOut = async () => {
|
|
132
|
+
try {
|
|
133
|
+
await signOut()
|
|
134
|
+
} catch (err) {
|
|
135
|
+
console.error('Sign out error:', err)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const handleRefresh = async () => {
|
|
140
|
+
setIsRefreshing(true)
|
|
141
|
+
// Simulate refresh
|
|
142
|
+
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
143
|
+
setIsRefreshing(false)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return (
|
|
147
|
+
<PageTransition type="fade" duration={300}>
|
|
148
|
+
<OfflineWrapper
|
|
149
|
+
cacheStrategy="stale-while-revalidate"
|
|
150
|
+
showOfflineIndicator={true}
|
|
151
|
+
backgroundSync={true}
|
|
152
|
+
>
|
|
153
|
+
<PullToRefresh
|
|
154
|
+
onRefresh={handleRefresh}
|
|
155
|
+
threshold={80}
|
|
156
|
+
loadingIndicator="spinner"
|
|
157
|
+
hapticOnTrigger={true}
|
|
158
|
+
networkAware={true}
|
|
159
|
+
>
|
|
160
|
+
<main className={"min-h-screen" + " " + glass.background.primary + " " + "relative overflow-hidden"}>
|
|
161
|
+
{/* Glassmorphism background overlay */}
|
|
162
|
+
<div className={"absolute inset-0" + " " + glass.background.accent + " " + "opacity-30"} />
|
|
163
|
+
<div className="relative z-10">
|
|
164
|
+
<MobileContainer className="py-8">
|
|
165
|
+
{/* Simple Auth Status */}
|
|
166
|
+
{user && (
|
|
167
|
+
<div className="flex justify-end mb-8">
|
|
168
|
+
<div className="flex items-center gap-4">
|
|
169
|
+
<span className="text-sm text-gray-600 dark:text-gray-300">
|
|
170
|
+
Welcome, {user.email?.split('@')[0]}
|
|
171
|
+
</span>
|
|
172
|
+
<Button variant="outline" size="sm" onClick={handleSignOut}>
|
|
173
|
+
<LogOut className="w-4 h-4 mr-2" />
|
|
174
|
+
Sign Out
|
|
175
|
+
</Button>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
)}
|
|
179
|
+
|
|
180
|
+
{!user && !loading && (
|
|
181
|
+
<div className="flex justify-end mb-8">
|
|
182
|
+
<div className="flex gap-2">
|
|
183
|
+
<Link href="/login">
|
|
184
|
+
<Button variant="outline" size="sm">Sign In</Button>
|
|
185
|
+
</Link>
|
|
186
|
+
<Link href="/signup">
|
|
187
|
+
<Button size="sm">Sign Up</Button>
|
|
188
|
+
</Link>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
)}
|
|
192
|
+
|
|
193
|
+
{/* Hero Section with Search */}
|
|
194
|
+
<MobileHero
|
|
195
|
+
badge={heroConfig.badge}
|
|
196
|
+
title={heroConfig.title}
|
|
197
|
+
description={heroConfig.description}
|
|
198
|
+
actions={[
|
|
199
|
+
{
|
|
200
|
+
label: "View Pricing",
|
|
201
|
+
href: "/checkout",
|
|
202
|
+
icon: ArrowRight,
|
|
203
|
+
variant: "default",
|
|
204
|
+
size: "lg"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
label: "Learn More",
|
|
208
|
+
variant: "outline",
|
|
209
|
+
size: "lg"
|
|
210
|
+
}
|
|
211
|
+
]}
|
|
212
|
+
className="text-center mb-8"
|
|
213
|
+
/>
|
|
214
|
+
|
|
215
|
+
{/* Search Bar with Glassmorphism */}
|
|
216
|
+
<div className="max-w-2xl mx-auto mb-12">
|
|
217
|
+
<div className={glass.card + " " + glass.border + " " + "p-1 rounded-2xl" + " " + animations.hover.lift}>
|
|
218
|
+
<AudioSearch
|
|
219
|
+
placeholder="Search for tracks, artists, or albums..."
|
|
220
|
+
onSearch={(query) => console.log('Searching:', query)}
|
|
221
|
+
showTrending={true}
|
|
222
|
+
recentSearches={['Luna Rivers', 'Ambient Flow', 'Electronic']}
|
|
223
|
+
className="w-full bg-transparent border-none"
|
|
224
|
+
/>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
|
|
228
|
+
{/* Main Content Area */}
|
|
229
|
+
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8 mb-20">
|
|
230
|
+
{/* Main Content */}
|
|
231
|
+
<div className="lg:col-span-3 space-y-8">
|
|
232
|
+
{/* Now Playing Card with Enhanced Glassmorphism */}
|
|
233
|
+
<div className={`${glass.card} ${glass.border} rounded-3xl p-6 mb-8 ${animations.hover.lift} ${animations.transition.smooth}">
|
|
234
|
+
<NowPlayingCard
|
|
235
|
+
track={currentTrack || demoPlaylist[0]}
|
|
236
|
+
isPlaying={isPlaying}
|
|
237
|
+
onPlayPause={() => setIsPlaying(!isPlaying)}
|
|
238
|
+
showWaveform={true}
|
|
239
|
+
className="bg-transparent"
|
|
240
|
+
/>
|
|
241
|
+
</div>
|
|
242
|
+
|
|
243
|
+
{/* Featured Playlists with Staggered Animation */}
|
|
244
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
|
|
245
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.short}">
|
|
246
|
+
<PlaylistCard
|
|
247
|
+
title="Today's Top Hits"
|
|
248
|
+
description="The most played songs today"
|
|
249
|
+
trackCount={50}
|
|
250
|
+
coverImage="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiNGRjc4NzgiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjMiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4="
|
|
251
|
+
onClick={() => console.log('Opening Top Hits playlist')}
|
|
252
|
+
className="bg-transparent border-none"
|
|
253
|
+
/>
|
|
254
|
+
</div>
|
|
255
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.medium}">
|
|
256
|
+
<PlaylistCard
|
|
257
|
+
title="Chill Vibes"
|
|
258
|
+
description="Relaxing music for focus and creativity"
|
|
259
|
+
trackCount={32}
|
|
260
|
+
coverImage="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiM2MEE1RkEiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjMiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4="
|
|
261
|
+
onClick={() => console.log('Opening Chill Vibes playlist')}
|
|
262
|
+
className="bg-transparent border-none"
|
|
263
|
+
/>
|
|
264
|
+
</div>
|
|
265
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.long}">
|
|
266
|
+
<PlaylistCard
|
|
267
|
+
title="Electronic Pulse"
|
|
268
|
+
description="High-energy electronic and dance music"
|
|
269
|
+
trackCount={28}
|
|
270
|
+
coverImage="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIGZpbGw9IiM5QzI3QjAiLz48Y2lyY2xlIGN4PSIxNTAiIGN5PSIxNTAiIHI9IjYwIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjMiLz48cGF0aCBkPSJNMTMwIDEyMFYxODBMMTcwIDE1MEwxMzAgMTIwWiIgZmlsbD0id2hpdGUiLz48L3N2Zz4="
|
|
271
|
+
onClick={() => console.log('Opening Electronic Pulse playlist')}
|
|
272
|
+
className="bg-transparent border-none"
|
|
273
|
+
/>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
|
|
277
|
+
{/* Track List with Glassmorphism */}
|
|
278
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.transition.smooth}">
|
|
279
|
+
<TrackList
|
|
280
|
+
tracks={demoPlaylist}
|
|
281
|
+
currentTrackId={currentTrack?.id}
|
|
282
|
+
onTrackSelect={(track) => setCurrentTrack(track)}
|
|
283
|
+
onTrackPlay={(track) => {
|
|
284
|
+
setCurrentTrack(track)
|
|
285
|
+
setIsPlaying(true)
|
|
286
|
+
}}
|
|
287
|
+
showArtwork={true}
|
|
288
|
+
showDuration={true}
|
|
289
|
+
showLikeButton={true}
|
|
290
|
+
className="mb-8 bg-transparent"
|
|
291
|
+
/>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
|
|
295
|
+
{/* Sidebar with Glassmorphism */}
|
|
296
|
+
<div className="lg:col-span-1">
|
|
297
|
+
<div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.lift} ${animations.transition.smooth}">
|
|
298
|
+
<PlaylistSidebar
|
|
299
|
+
playlists={[
|
|
300
|
+
{ id: '1', name: 'Liked Songs', trackCount: 47 },
|
|
301
|
+
{ id: '2', name: 'Recently Played', trackCount: 23 },
|
|
302
|
+
{ id: '3', name: 'My Playlist #1', trackCount: 15 },
|
|
303
|
+
{ id: '4', name: 'Favorites', trackCount: 32 }
|
|
304
|
+
]}
|
|
305
|
+
onPlaylistSelect={(playlist) => console.log('Selected playlist:', playlist)}
|
|
306
|
+
currentPlaylistId="1"
|
|
307
|
+
className="sticky top-4 bg-transparent"
|
|
308
|
+
/>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
{/* Features Overview with Enhanced Glassmorphism */}
|
|
314
|
+
<ResponsiveGrid columns={gridConfig.columns_1_sm2_md4} gap="lg" className="mb-16">
|
|
315
|
+
<div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.short}">
|
|
316
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
317
|
+
<Zap className="h-6 w-6 text-blue-400" />
|
|
318
|
+
</div>
|
|
319
|
+
<h3 className="text-lg font-semibold mb-2">High-Quality Streaming</h3>
|
|
320
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
321
|
+
Lossless audio with adaptive bitrate for the best experience
|
|
322
|
+
</p>
|
|
323
|
+
</div>
|
|
324
|
+
|
|
325
|
+
<div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.medium}">
|
|
326
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
327
|
+
<Shield className="h-6 w-6 text-green-400" />
|
|
328
|
+
</div>
|
|
329
|
+
<h3 className="text-lg font-semibold mb-2">Secure & Private</h3>
|
|
330
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
331
|
+
Your listening habits and data are always protected
|
|
332
|
+
</p>
|
|
333
|
+
</div>
|
|
334
|
+
|
|
335
|
+
<div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.long}">
|
|
336
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
337
|
+
<Rocket className="h-6 w-6 text-purple-400" />
|
|
338
|
+
</div>
|
|
339
|
+
<h3 className="text-lg font-semibold mb-2">Offline Support</h3>
|
|
340
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
341
|
+
Download your favorites for offline listening anywhere
|
|
342
|
+
</p>
|
|
343
|
+
</div>
|
|
344
|
+
|
|
345
|
+
<div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.extra}">
|
|
346
|
+
<div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
|
|
347
|
+
<svg className="h-6 w-6 text-orange-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
348
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" />
|
|
349
|
+
</svg>
|
|
350
|
+
</div>
|
|
351
|
+
<h3 className="text-lg font-semibold mb-2">Premium Plans</h3>
|
|
352
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
353
|
+
Flexible subscription options for every music lover
|
|
354
|
+
</p>
|
|
355
|
+
</div>
|
|
356
|
+
</ResponsiveGrid>
|
|
357
|
+
</MobileContainer>
|
|
358
|
+
</div>
|
|
359
|
+
</main>
|
|
360
|
+
</PullToRefresh>
|
|
361
|
+
</OfflineWrapper>
|
|
362
|
+
|
|
363
|
+
{/* Fixed Audio Player Bar with Enhanced Glassmorphism */}
|
|
364
|
+
<div className={"fixed bottom-0 left-0 right-0 z-50" + " " + glass.card + " " + glass.border + " " + "border-t backdrop-blur-xl"}>
|
|
365
|
+
<FixedAudioBar
|
|
366
|
+
track={currentTrack || demoPlaylist[0]}
|
|
367
|
+
isPlaying={isPlaying}
|
|
368
|
+
onPlayPause={() => setIsPlaying(!isPlaying)}
|
|
369
|
+
onNext={() => {
|
|
370
|
+
const currentIndex = demoPlaylist.findIndex(track => track.id === (currentTrack?.id || demoPlaylist[0].id))
|
|
371
|
+
const nextIndex = (currentIndex + 1) % demoPlaylist.length
|
|
372
|
+
setCurrentTrack(demoPlaylist[nextIndex])
|
|
373
|
+
}}
|
|
374
|
+
onPrevious={() => {
|
|
375
|
+
const currentIndex = demoPlaylist.findIndex(track => track.id === (currentTrack?.id || demoPlaylist[0].id))
|
|
376
|
+
const prevIndex = (currentIndex - 1 + demoPlaylist.length) % demoPlaylist.length
|
|
377
|
+
setCurrentTrack(demoPlaylist[prevIndex])
|
|
378
|
+
}}
|
|
379
|
+
showWaveform={true}
|
|
380
|
+
showVolumeControl={true}
|
|
381
|
+
showTimeProgress={true}
|
|
382
|
+
showLikeButton={true}
|
|
383
|
+
showShareButton={true}
|
|
384
|
+
showShuffleRepeat={true}
|
|
385
|
+
allowMinimize={true}
|
|
386
|
+
className="bg-transparent"
|
|
387
|
+
/>
|
|
388
|
+
</div>
|
|
389
|
+
</PageTransition>
|
|
390
|
+
)
|
|
391
|
+
}
|