create-rayso 1.0.1 → 1.0.3

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/bin/index.js CHANGED
@@ -54,6 +54,9 @@ const copySpinner = ora('Scaffolding project...').start();
54
54
  try {
55
55
  await fs.copy(TEMPLATE_DIR, targetDir);
56
56
 
57
+ const gitkeeps = await fs.glob('**/.gitkeep', { cwd: targetDir });
58
+ await Promise.all(gitkeeps.map(f => fs.remove(path.join(targetDir, f))));
59
+
57
60
  // Inject project name + description into root package.json
58
61
  const rootPkg = await fs.readJson(path.join(targetDir, 'package.json'));
59
62
  rootPkg.name = projectName;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-rayso",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "CLI scaffolder for RAYSO.STUDIO Next.js + Sanity + Tailwind v4 templates",
5
5
  "main": "bin/index.js",
6
6
  "bin": {
File without changes
File without changes
@@ -1,13 +1,25 @@
1
+ // ── app/layout.tsx ────────────────────────────────────────────────────────────
2
+ // app/layout.tsx — make sure you have both fonts loaded
3
+
1
4
  import type { Metadata } from "next";
2
5
  import { Inter, Playfair_Display } from "next/font/google";
3
6
  import "./globals.css";
4
7
 
5
- const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
6
- const playfair = Playfair_Display({ subsets: ["latin"], variable: "--font-playfair" });
8
+ const inter = Inter({
9
+ subsets: ["latin"],
10
+ variable: "--font-inter",
11
+ display: "swap",
12
+ });
13
+
14
+ const playfair = Playfair_Display({
15
+ subsets: ["latin"],
16
+ variable: "--font-playfair",
17
+ display: "swap",
18
+ });
7
19
 
8
20
  export const metadata: Metadata = {
9
- title: "Template — RAYSO.STUDIO",
10
- description: "A premium Next.js template",
21
+ title: "Meridian — Luxury Resort",
22
+ description: "A premium resort experience.",
11
23
  };
12
24
 
13
25
  export default function RootLayout({ children }: { children: React.ReactNode }) {
@@ -18,4 +30,4 @@ export default function RootLayout({ children }: { children: React.ReactNode })
18
30
  </body>
19
31
  </html>
20
32
  );
21
- }
33
+ }
@@ -1,7 +1,14 @@
1
+ // ── app/page.tsx ──────────────────────────────────────────────────────────────
2
+ // app/page.tsx
3
+
4
+ import { Navbar } from "@/components/layout/Navbar";
5
+ import { HeroSection } from "@/components/sections/HeroSection";
6
+
1
7
  export default function Home() {
2
8
  return (
3
- <main>
4
- <h1 className="heading-1">Your template starts here.</h1>
5
- </main>
9
+ <>
10
+ <Navbar />
11
+ <HeroSection />
12
+ </>
6
13
  );
7
14
  }
File without changes
File without changes
@@ -0,0 +1,105 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { useState } from "react";
5
+
6
+ const NAV_LINKS = [
7
+ { label: "Accommodations", href: "/accommodations" },
8
+ { label: "Experiences", href: "/experiences" },
9
+ { label: "Gallery", href: "/gallery" },
10
+ { label: "About", href: "/about" },
11
+ ];
12
+
13
+ export function Navbar() {
14
+ const [open, setOpen] = useState(false);
15
+
16
+ return (
17
+ <header
18
+ className="fixed top-0 left-0 right-0 z-50"
19
+ style={{ height: "var(--spacing-navbar)" }}
20
+ >
21
+ {/* Glass bar */}
22
+ <div
23
+ className="h-full flex items-center justify-between px-6 md:px-12"
24
+ style={{
25
+ background: "rgba(255,255,255,0.06)",
26
+ backdropFilter: "blur(12px)",
27
+ borderBottom: "1px solid rgba(255,255,255,0.08)",
28
+ }}
29
+ >
30
+ {/* Logo */}
31
+ <Link
32
+ href="/"
33
+ className="font-display text-white text-xl tracking-tight"
34
+ style={{ letterSpacing: "-0.03em" }}
35
+ >
36
+ MERIDIAN
37
+ </Link>
38
+
39
+ {/* Desktop nav */}
40
+ <nav className="hidden md:flex items-center gap-8">
41
+ {NAV_LINKS.map((l) => (
42
+ <Link
43
+ key={l.href}
44
+ href={l.href}
45
+ className="font-body text-xs tracking-widest uppercase text-white/70 hover:text-white transition-colors duration-200"
46
+ >
47
+ {l.label}
48
+ </Link>
49
+ ))}
50
+ </nav>
51
+
52
+ {/* CTA */}
53
+ <Link
54
+ href="/accommodations"
55
+ className="hidden md:inline-flex btn btn-white btn-sm"
56
+ style={{ marginTop: 0 }}
57
+ >
58
+ Book a Stay
59
+ </Link>
60
+
61
+ {/* Mobile hamburger */}
62
+ <button
63
+ className="md:hidden flex flex-col gap-1.5 p-2"
64
+ onClick={() => setOpen((o) => !o)}
65
+ aria-label="Toggle menu"
66
+ >
67
+ <span
68
+ className="block w-6 h-px bg-white transition-all duration-300"
69
+ style={{ transform: open ? "translateY(4px) rotate(45deg)" : "none" }}
70
+ />
71
+ <span
72
+ className="block w-6 h-px bg-white transition-all duration-300"
73
+ style={{ transform: open ? "translateY(-4px) rotate(-45deg)" : "none" }}
74
+ />
75
+ </button>
76
+ </div>
77
+
78
+ {/* Mobile menu */}
79
+ {open && (
80
+ <div
81
+ className="md:hidden flex flex-col px-6 py-6 gap-5"
82
+ style={{ background: "rgba(20,8,12,0.97)", backdropFilter: "blur(12px)" }}
83
+ >
84
+ {NAV_LINKS.map((l) => (
85
+ <Link
86
+ key={l.href}
87
+ href={l.href}
88
+ onClick={() => setOpen(false)}
89
+ className="font-body text-sm tracking-widest uppercase text-white/80 hover:text-white transition-colors"
90
+ >
91
+ {l.label}
92
+ </Link>
93
+ ))}
94
+ <Link
95
+ href="/accommodations"
96
+ className="btn btn-primary btn-sm w-fit"
97
+ style={{ marginTop: "0.5rem" }}
98
+ >
99
+ Book a Stay
100
+ </Link>
101
+ </div>
102
+ )}
103
+ </header>
104
+ );
105
+ }
File without changes
@@ -0,0 +1,97 @@
1
+ // ── Hero Section ──────────────────────────────────────────────────────────────
2
+ // components/sections/HeroSection.tsx
3
+
4
+ import Image from "next/image";
5
+
6
+ export default function HeroSection() {
7
+ return (
8
+ <section className="relative w-full h-screen overflow-hidden">
9
+ {/* Background image — swap src for your hero image or video */}
10
+ <Image
11
+ src="/img/hero.jpg"
12
+ alt="Resort hero"
13
+ fill
14
+ priority
15
+ className="object-cover"
16
+ sizes="100vw"
17
+ />
18
+
19
+ {/* Gradient overlay */}
20
+ <div
21
+ className="absolute inset-0"
22
+ style={{
23
+ background:
24
+ "linear-gradient(to bottom, rgba(10,4,6,0.3) 0%, rgba(10,4,6,0.15) 40%, rgba(10,4,6,0.6) 100%)",
25
+ }}
26
+ />
27
+
28
+ {/* Content */}
29
+ <div className="absolute inset-0 flex flex-col justify-end pb-20 px-6 md:px-12 lg:px-20">
30
+ <div className="max-w-2xl">
31
+ {/* Location tag */}
32
+ <p className="font-body text-white/60 text-xs tracking-[0.3em] uppercase mb-6">
33
+ Maldives, Indian Ocean
34
+ </p>
35
+
36
+ {/* Headline */}
37
+ <h1
38
+ className="font-display text-white mb-8"
39
+ style={{
40
+ fontSize: "clamp(2.8rem, 7vw, 5.5rem)",
41
+ fontWeight: 400,
42
+ lineHeight: 0.95,
43
+ letterSpacing: "-0.03em",
44
+ textTransform: "uppercase",
45
+ }}
46
+ >
47
+ Where stillness
48
+ <br />
49
+ meets the sea.
50
+ </h1>
51
+
52
+ {/* Sub + CTA row */}
53
+ <div className="flex flex-col sm:flex-row sm:items-end gap-6">
54
+ <p className="font-body text-white/60 text-sm leading-relaxed max-w-sm">
55
+ Private villas, overwater bungalows, and curated experiences for
56
+ those who seek something beyond ordinary.
57
+ </p>
58
+
59
+ <Link
60
+ href="/accommodations"
61
+ className="btn btn-white shrink-0"
62
+ style={{ marginTop: 0 }}
63
+ >
64
+ Explore Rooms
65
+ </Link>
66
+ </div>
67
+ </div>
68
+ </div>
69
+
70
+ {/* Scroll indicator */}
71
+ <div className="absolute bottom-8 right-8 flex flex-col items-center gap-2">
72
+ <span
73
+ className="font-body text-white/40 text-[10px] tracking-[0.25em] uppercase"
74
+ style={{ writingMode: "vertical-rl" }}
75
+ >
76
+ Scroll
77
+ </span>
78
+ <div className="w-px h-12 bg-white/20 relative overflow-hidden">
79
+ <div
80
+ className="absolute top-0 left-0 w-full bg-white/60"
81
+ style={{
82
+ height: "40%",
83
+ animation: "scrollLine 1.8s ease-in-out infinite",
84
+ }}
85
+ />
86
+ </div>
87
+ </div>
88
+
89
+ <style>{`
90
+ @keyframes scrollLine {
91
+ 0% { transform: translateY(-100%); }
92
+ 100% { transform: translateY(350%); }
93
+ }
94
+ `}</style>
95
+ </section>
96
+ );
97
+ }
File without changes
File without changes
@@ -10,12 +10,15 @@
10
10
  "deploy:studio": "cd studio && sanity deploy",
11
11
  "zip": "bash zip.sh"
12
12
  },
13
- "workspaces": ["frontend", "studio"],
13
+ "workspaces": [
14
+ "frontend",
15
+ "studio"
16
+ ],
14
17
  "overrides": {
15
18
  "react": "^19.0.0",
16
19
  "react-dom": "^19.0.0"
17
20
  },
18
- "private": true,
21
+ "private": "false",
19
22
  "license": "MIT",
20
23
  "devDependencies": {
21
24
  "npm-run-all": "^4.1.5"