@digilogiclabs/create-saas-app 1.10.7 → 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.
Files changed (204) hide show
  1. package/README.md +331 -350
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/commands/create.js +2 -2
  4. package/dist/cli/commands/create.js.map +1 -1
  5. package/dist/generators/template-generator.d.ts.map +1 -1
  6. package/dist/generators/template-generator.js +14 -2
  7. package/dist/generators/template-generator.js.map +1 -1
  8. package/dist/templates/web/ui-auth/template/.claude +21 -0
  9. package/dist/templates/web/ui-auth/template/context.md +105 -0
  10. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
  11. package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
  12. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
  13. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
  14. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
  15. package/dist/templates/web/ui-auth-payments-ai/template/.claude +21 -0
  16. package/dist/templates/web/ui-auth-payments-ai/template/.env.example +15 -0
  17. package/dist/templates/web/ui-auth-payments-ai/template/README.md +207 -0
  18. package/dist/templates/web/ui-auth-payments-ai/template/context.md +169 -0
  19. package/dist/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
  20. package/dist/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
  21. package/dist/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
  22. package/dist/templates/web/ui-auth-payments-ai/template/package.json +55 -0
  23. package/dist/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
  24. package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
  25. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
  26. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
  27. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
  28. package/dist/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
  29. package/dist/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
  30. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
  31. package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
  32. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
  33. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
  34. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
  35. package/dist/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
  36. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
  37. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
  38. package/dist/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
  39. package/dist/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
  40. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +380 -0
  41. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
  42. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
  43. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +640 -0
  44. package/dist/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
  45. package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
  46. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
  47. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
  48. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
  49. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
  50. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
  51. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
  52. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
  53. package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
  54. package/dist/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  55. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
  56. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
  57. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
  58. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
  59. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
  60. package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
  61. package/dist/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
  62. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
  63. package/dist/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
  64. package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
  65. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +22 -20
  66. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
  67. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
  68. package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
  69. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
  70. package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
  71. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
  72. package/package.json +1 -1
  73. package/src/templates/web/ui-auth/template/.claude +21 -0
  74. package/src/templates/web/ui-auth/template/context.md +105 -0
  75. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +801 -0
  76. package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +403 -0
  77. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +801 -0
  78. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +507 -0
  79. package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +127 -32
  80. package/src/templates/web/ui-auth-payments-ai/template/.claude +21 -0
  81. package/src/templates/web/ui-auth-payments-ai/template/.env.example +15 -0
  82. package/src/templates/web/ui-auth-payments-ai/template/README.md +207 -0
  83. package/src/templates/web/ui-auth-payments-ai/template/context.md +169 -0
  84. package/src/templates/web/ui-auth-payments-ai/template/middleware.ts +68 -0
  85. package/src/templates/web/ui-auth-payments-ai/template/next.config.js +12 -0
  86. package/src/templates/web/ui-auth-payments-ai/template/package-lock.json +12241 -0
  87. package/src/templates/web/ui-auth-payments-ai/template/package.json +55 -0
  88. package/src/templates/web/ui-auth-payments-ai/template/postcss.config.js +7 -0
  89. package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +310 -0
  90. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/audio/route.ts +56 -0
  91. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/chat/route.ts +49 -0
  92. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/text/route.ts +64 -0
  93. package/src/templates/web/ui-auth-payments-ai/template/src/app/api/ai/video/route.ts +73 -0
  94. package/src/templates/web/ui-auth-payments-ai/template/src/app/auth/callback/route.ts +12 -0
  95. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +211 -0
  96. package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +142 -0
  97. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/layout.tsx +22 -0
  98. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +183 -0
  99. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +801 -0
  100. package/src/templates/web/ui-auth-payments-ai/template/src/app/error.tsx +67 -0
  101. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +43 -0
  102. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +35 -0
  103. package/src/templates/web/ui-auth-payments-ai/template/src/app/loading.tsx +20 -0
  104. package/src/templates/web/ui-auth-payments-ai/template/src/app/login/page.tsx +6 -0
  105. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +380 -0
  106. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.backup +391 -0
  107. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx.bak +391 -0
  108. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +640 -0
  109. package/src/templates/web/ui-auth-payments-ai/template/src/app/signup/page.tsx +6 -0
  110. package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +49 -0
  111. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +52 -0
  112. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +144 -0
  113. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +185 -0
  114. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +36 -0
  115. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/theme-provider.tsx +96 -0
  116. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/footer.tsx +36 -0
  117. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +246 -0
  118. package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/badge.tsx +36 -0
  119. package/src/templates/web/ui-auth-payments-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  120. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +246 -0
  121. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/index.ts +14 -0
  122. package/src/templates/web/ui-auth-payments-ai/template/src/lib/auth-server.ts +177 -0
  123. package/src/templates/web/ui-auth-payments-ai/template/src/lib/env.ts +49 -0
  124. package/src/templates/web/ui-auth-payments-ai/template/src/lib/utils.ts +140 -0
  125. package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +79 -0
  126. package/src/templates/web/ui-auth-payments-ai/template/tailwind.config.js +77 -0
  127. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.json +33 -0
  128. package/src/templates/web/ui-auth-payments-ai/template/tsconfig.tsbuildinfo +1 -0
  129. package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +17 -0
  130. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +22 -20
  131. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.backup +391 -0
  132. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx.bak +391 -0
  133. package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +345 -0
  134. package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +122 -37
  135. package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +351 -0
  136. package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +122 -37
  137. package/dist/cli/commands/add.d.ts +0 -6
  138. package/dist/cli/commands/add.d.ts.map +0 -1
  139. package/dist/cli/commands/add.js +0 -39
  140. package/dist/cli/commands/add.js.map +0 -1
  141. package/dist/cli/commands/index.d.ts +0 -4
  142. package/dist/cli/commands/index.d.ts.map +0 -1
  143. package/dist/cli/commands/index.js +0 -20
  144. package/dist/cli/commands/index.js.map +0 -1
  145. package/dist/cli/commands/update.d.ts +0 -6
  146. package/dist/cli/commands/update.d.ts.map +0 -1
  147. package/dist/cli/commands/update.js +0 -68
  148. package/dist/cli/commands/update.js.map +0 -1
  149. package/dist/cli/index.d.ts +0 -4
  150. package/dist/cli/index.d.ts.map +0 -1
  151. package/dist/cli/index.js +0 -61
  152. package/dist/cli/index.js.map +0 -1
  153. package/dist/cli/prompts/index.d.ts +0 -2
  154. package/dist/cli/prompts/index.d.ts.map +0 -1
  155. package/dist/cli/prompts/index.js +0 -18
  156. package/dist/cli/prompts/index.js.map +0 -1
  157. package/dist/cli/prompts/project-setup.d.ts +0 -5
  158. package/dist/cli/prompts/project-setup.d.ts.map +0 -1
  159. package/dist/cli/prompts/project-setup.js +0 -251
  160. package/dist/cli/prompts/project-setup.js.map +0 -1
  161. package/dist/cli/utils/git.d.ts +0 -9
  162. package/dist/cli/utils/git.d.ts.map +0 -1
  163. package/dist/cli/utils/git.js +0 -77
  164. package/dist/cli/utils/git.js.map +0 -1
  165. package/dist/cli/utils/index.d.ts +0 -5
  166. package/dist/cli/utils/index.d.ts.map +0 -1
  167. package/dist/cli/utils/index.js +0 -21
  168. package/dist/cli/utils/index.js.map +0 -1
  169. package/dist/cli/utils/logger.d.ts +0 -16
  170. package/dist/cli/utils/logger.d.ts.map +0 -1
  171. package/dist/cli/utils/logger.js +0 -55
  172. package/dist/cli/utils/logger.js.map +0 -1
  173. package/dist/cli/utils/package-manager.d.ts +0 -8
  174. package/dist/cli/utils/package-manager.d.ts.map +0 -1
  175. package/dist/cli/utils/package-manager.js +0 -92
  176. package/dist/cli/utils/package-manager.js.map +0 -1
  177. package/dist/cli/utils/spinner.d.ts +0 -7
  178. package/dist/cli/utils/spinner.d.ts.map +0 -1
  179. package/dist/cli/utils/spinner.js +0 -48
  180. package/dist/cli/utils/spinner.js.map +0 -1
  181. package/dist/cli/validators/dependencies.d.ts +0 -15
  182. package/dist/cli/validators/dependencies.d.ts.map +0 -1
  183. package/dist/cli/validators/dependencies.js +0 -108
  184. package/dist/cli/validators/dependencies.js.map +0 -1
  185. package/dist/cli/validators/index.d.ts +0 -3
  186. package/dist/cli/validators/index.d.ts.map +0 -1
  187. package/dist/cli/validators/index.js +0 -19
  188. package/dist/cli/validators/index.js.map +0 -1
  189. package/dist/cli/validators/project-name.d.ts +0 -5
  190. package/dist/cli/validators/project-name.d.ts.map +0 -1
  191. package/dist/cli/validators/project-name.js +0 -151
  192. package/dist/cli/validators/project-name.js.map +0 -1
  193. package/dist/generators/file-processor.d.ts +0 -28
  194. package/dist/generators/file-processor.d.ts.map +0 -1
  195. package/dist/generators/file-processor.js +0 -224
  196. package/dist/generators/file-processor.js.map +0 -1
  197. package/dist/generators/index.d.ts +0 -4
  198. package/dist/generators/index.d.ts.map +0 -1
  199. package/dist/generators/index.js +0 -20
  200. package/dist/generators/index.js.map +0 -1
  201. package/dist/generators/package-installer.d.ts +0 -29
  202. package/dist/generators/package-installer.d.ts.map +0 -1
  203. package/dist/generators/package-installer.js +0 -167
  204. 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,11 +52,13 @@ export default function Home() {
52
52
  const projectName = "{{projectName}}"
53
53
  const projectDescription = "{{description}}"
54
54
 
55
- // Safe CSS class combinations to avoid template literal issues
56
- const glassCard = [glass.card, glass.border].filter(Boolean).join(' ')
57
- const glassCardRounded = [glass.card, glass.border, 'rounded-2xl'].filter(Boolean).join(' ')
58
- const glassCardWithHover = [glass.card, glass.border, 'rounded-2xl', animations.hover.scale, animations.transition.smooth].filter(Boolean).join(' ')
59
- const glassAccentIcon = [glass.accent, 'rounded-xl', 'flex', 'items-center', 'justify-center', animations.hover.glow].filter(Boolean).join(' ')
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"
60
62
 
61
63
  const gridConfig = {
62
64
  columns_1_2: { base: 1, md: 2 },
@@ -121,11 +123,11 @@ export default function Home() {
121
123
  icon: CheckCircle
122
124
  },
123
125
  title: {
124
- text: `Welcome to ${projectName}`,
126
+ text: "Welcome to " + projectName,
125
127
  highlight: projectName,
126
128
  size: "xl" as const
127
129
  },
128
- description: `${projectDescription}. Stream your favorite music with crystal-clear quality, offline downloads, and seamless playback across all your devices.`
130
+ description: projectDescription + ". Stream your favorite music with crystal-clear quality, offline downloads, and seamless playback across all your devices."
129
131
  }
130
132
 
131
133
  const handleSignOut = async () => {
@@ -157,9 +159,9 @@ export default function Home() {
157
159
  hapticOnTrigger={true}
158
160
  networkAware={true}
159
161
  >
160
- <main className={"min-h-screen" + " " + glass.background.primary + " " + "relative overflow-hidden"}>
162
+ <main className={"min-h-screen " + glass.background.primary + " relative overflow-hidden"}>
161
163
  {/* Glassmorphism background overlay */}
162
- <div className={"absolute inset-0" + " " + glass.background.accent + " " + "opacity-30"} />
164
+ <div className={"absolute inset-0 " + glass.background.accent + " opacity-30"} />
163
165
  <div className="relative z-10">
164
166
  <MobileContainer className="py-8">
165
167
  {/* Simple Auth Status */}
@@ -214,7 +216,7 @@ export default function Home() {
214
216
 
215
217
  {/* Search Bar with Glassmorphism */}
216
218
  <div className="max-w-2xl mx-auto mb-12">
217
- <div className={glass.card + " " + glass.border + " " + "p-1 rounded-2xl" + " " + animations.hover.lift}>
219
+ <div className={glass.card + " " + glass.border + " p-1 rounded-2xl " + animations.hover.lift}>
218
220
  <AudioSearch
219
221
  placeholder="Search for tracks, artists, or albums..."
220
222
  onSearch={(query) => console.log('Searching:', query)}
@@ -230,7 +232,7 @@ export default function Home() {
230
232
  {/* Main Content */}
231
233
  <div className="lg:col-span-3 space-y-8">
232
234
  {/* 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}">
235
+ <div className={glass.card + " " + glass.border + " rounded-3xl p-6 mb-8 " + animations.hover.lift + " " + animations.transition.smooth}>
234
236
  <NowPlayingCard
235
237
  track={currentTrack || demoPlaylist[0]}
236
238
  isPlaying={isPlaying}
@@ -242,7 +244,7 @@ export default function Home() {
242
244
 
243
245
  {/* Featured Playlists with Staggered Animation */}
244
246
  <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}">
247
+ <div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.short}>
246
248
  <PlaylistCard
247
249
  title="Today's Top Hits"
248
250
  description="The most played songs today"
@@ -252,7 +254,7 @@ export default function Home() {
252
254
  className="bg-transparent border-none"
253
255
  />
254
256
  </div>
255
- <div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.medium}">
257
+ <div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.medium}>
256
258
  <PlaylistCard
257
259
  title="Chill Vibes"
258
260
  description="Relaxing music for focus and creativity"
@@ -262,7 +264,7 @@ export default function Home() {
262
264
  className="bg-transparent border-none"
263
265
  />
264
266
  </div>
265
- <div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.long}">
267
+ <div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.long}>
266
268
  <PlaylistCard
267
269
  title="Electronic Pulse"
268
270
  description="High-energy electronic and dance music"
@@ -275,7 +277,7 @@ export default function Home() {
275
277
  </div>
276
278
 
277
279
  {/* Track List with Glassmorphism */}
278
- <div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.transition.smooth}">
280
+ <div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.transition.smooth}>
279
281
  <TrackList
280
282
  tracks={demoPlaylist}
281
283
  currentTrackId={currentTrack?.id}
@@ -294,7 +296,7 @@ export default function Home() {
294
296
 
295
297
  {/* Sidebar with Glassmorphism */}
296
298
  <div className="lg:col-span-1">
297
- <div className={`${glass.card} ${glass.border} rounded-2xl overflow-hidden ${animations.hover.lift} ${animations.transition.smooth}">
299
+ <div className={glass.card + " " + glass.border + " rounded-2xl overflow-hidden " + animations.hover.lift + " " + animations.transition.smooth}>
298
300
  <PlaylistSidebar
299
301
  playlists={[
300
302
  { id: '1', name: 'Liked Songs', trackCount: 47 },
@@ -312,7 +314,7 @@ export default function Home() {
312
314
 
313
315
  {/* Features Overview with Enhanced Glassmorphism */}
314
316
  <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}">
317
+ <div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.short}>
316
318
  <div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
317
319
  <Zap className="h-6 w-6 text-blue-400" />
318
320
  </div>
@@ -322,7 +324,7 @@ export default function Home() {
322
324
  </p>
323
325
  </div>
324
326
 
325
- <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.medium}">
327
+ <div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.medium}>
326
328
  <div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
327
329
  <Shield className="h-6 w-6 text-green-400" />
328
330
  </div>
@@ -332,7 +334,7 @@ export default function Home() {
332
334
  </p>
333
335
  </div>
334
336
 
335
- <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.long}">
337
+ <div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.long}>
336
338
  <div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
337
339
  <Rocket className="h-6 w-6 text-purple-400" />
338
340
  </div>
@@ -342,7 +344,7 @@ export default function Home() {
342
344
  </p>
343
345
  </div>
344
346
 
345
- <div className={`${glass.card} ${glass.border} text-center p-6 rounded-2xl ${animations.hover.scale} ${animations.transition.smooth} ${animations.delay.extra}">
347
+ <div className={glass.card + " " + glass.border + " text-center p-6 rounded-2xl " + animations.hover.scale + " " + animations.transition.smooth + " " + animations.delay.extra}>
346
348
  <div className={"mx-auto w-12 h-12" + " " + glass.accent + " " + "rounded-xl flex items-center justify-center mb-4" + " " + animations.hover.glow}>
347
349
  <svg className="h-6 w-6 text-orange-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
348
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" />
@@ -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
+ }