feat: split layout sections into components

This commit is contained in:
RizqiSyahrendra 2025-04-16 18:57:48 +07:00
parent a04f33d10c
commit da3b65f5aa
6 changed files with 1769 additions and 1723 deletions

View File

@ -1,7 +1,10 @@
import InitialScript from "@/components/InitialScript";
import InitialScript from "@/components/layouts/InitialScript";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import { Metadata } from "next";
import { getDefaultMetadata } from "@/utils/metadata";
import Header from "@/components/layouts/Header";
import Footer from "@/components/layouts/Footer";
const geistSans = Geist({
variable: "--font-geist-sans",
@ -13,10 +16,10 @@ const geistMono = Geist_Mono({
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export async function generateMetadata(): Promise<Metadata> {
const metadata = await getDefaultMetadata();
return metadata;
}
export default function RootLayout({
children,
@ -41,7 +44,37 @@ export default function RootLayout({
<link rel="stylesheet" href="css/fonts.css" />
</head>
<body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
{children}
<div className="ie-panel">
<a href="http://windows.microsoft.com/en-US/internet-explorer/">
<img
src="images/ie8-panel/warning_bar_0000_us.jpg"
height="42"
width="820"
alt="You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today."
/>
</a>
</div>
<div className="preloader">
<div className="banter-loader">
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
<div className="banter-loader__box"></div>
</div>
</div>
<div className="page">
<Header />
{children}
<Footer />
</div>
<div className="snackbars" id="form-output-global"></div>
<InitialScript />
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,25 @@
export default function Footer() {
return (
<footer className="section footer-classic context-dark bg-gray-21">
<div className="container">
<div className="row row-10 justify-content-sm-between">
<div className="col-sm-6">
<p className="rights">
<span>MyHome</span> <span>&copy;&nbsp;</span>
<span className="copyright-year"></span>
<span>&nbsp;</span>
<a href="privacy-policy.html">Privacy Policy</a>
</p>
</div>
<div className="col-sm-6 text-sm-right">
<div className="right-1">
<a href="#">
<span className="icon mdi mdi-plus"></span>Submit Property
</a>
</div>
</div>
</div>
</div>
</footer>
);
}

View File

@ -0,0 +1,410 @@
export default function Header() {
return (
<header className="section page-header">
<div className="rd-navbar-wrap">
<nav
className="rd-navbar rd-navbar-classic"
data-layout="rd-navbar-fixed"
data-sm-layout="rd-navbar-fixed"
data-md-layout="rd-navbar-fixed"
data-md-device-layout="rd-navbar-fixed"
data-lg-layout="rd-navbar-static"
data-lg-device-layout="rd-navbar-fixed"
data-xl-layout="rd-navbar-static"
data-xl-device-layout="rd-navbar-static"
data-lg-stick-up-offset="46px"
data-xl-stick-up-offset="46px"
data-xxl-stick-up-offset="46px"
data-lg-stick-up="true"
data-xl-stick-up="true"
data-xxl-stick-up="true"
>
<div className="rd-navbar-aside-outer">
<div className="rd-navbar-aside">
<div
className="rd-navbar-collapse-toggle rd-navbar-fixed-element-1"
data-rd-navbar-toggle=".rd-navbar-collapse"
>
<span></span>
</div>
<ul className="rd-navbar-aside-list rd-navbar-collapse">
<li>
<div className="block-inline unit unit-spacing-xs align-items-center">
<div className="unit-left">
<span className="icon text-middle mdi mdi-phone"></span>
</div>
<div className="unit-body">
<a href="tel:#">1-800-1234-567</a>
</div>
</div>
</li>
<li>
<div className="block-inline unit unit-spacing-xs align-items-center">
<div className="unit-left">
<span className="icon text-middle mdi mdi-email-outline"></span>
</div>
<div className="unit-body">
<a href="mailto:#">info@demolink.org</a>
</div>
</div>
</li>
</ul>
<div className="rd-navbar-aside-item">
<div className="block-inline">
<button
className="unit unit-spacing-xs align-items-center"
data-rd-navbar-toggle="#navbar-login-register"
>
<span className="unit-left">
<span className="icon text-middle mdi mdi-login"></span>
</span>
<span className="unit-body">
<span>Login/Register</span>
</span>
</button>
</div>
<div className="rd-navbar-popup bg-gray-12" id="navbar-login-register">
<div className="tabs-custom tabs-horizontal tabs-line" id="navbar-tabs">
<ul className="nav nav-tabs">
<li className="nav-item" role="presentation">
<a className="nav-link active" href="#navbar-tabs-1" data-toggle="tab">
Login
</a>
</li>
<li className="nav-item" role="presentation">
<a className="nav-link" href="#navbar-tabs-2" data-toggle="tab">
Register
</a>
</li>
</ul>
<div className="tab-content">
<div className="tab-pane fade show active" id="navbar-tabs-1">
<form className="rd-form form-1">
<div className="form-wrap">
<input
className="form-input"
id="navbar-login-email"
type="email"
name="email"
data-constraints="@Email @Required"
/>
<label className="form-label" htmlFor="navbar-login-email">
E-mail
</label>
</div>
<div className="form-wrap">
<input
className="form-input"
id="navbar-login-password"
type="password"
name="password"
data-constraints="@Required"
/>
<label className="form-label" htmlFor="navbar-login-password">
Password
</label>
</div>
<div className="form-wrap">
<button className="button button-sm button-primary button-block" type="submit">
Sign in
</button>
</div>
</form>
</div>
<div className="tab-pane fade" id="navbar-tabs-2">
<form className="rd-form form-1">
<div className="form-wrap">
<input
className="form-input"
id="register-name"
type="text"
name="username"
data-constraints="@Required"
/>
<label className="form-label" htmlFor="register-name">
Username
</label>
</div>
<div className="form-wrap">
<input
className="form-input"
id="register-email"
type="email"
name="email"
data-constraints="@Email @Required"
/>
<label className="form-label" htmlFor="register-email">
E-mail
</label>
</div>
<div className="form-wrap">
<input
className="form-input"
id="register-password"
type="password"
name="password"
data-constraints="@Required"
/>
<label className="form-label" htmlFor="register-password">
Password
</label>
</div>
<div className="form-wrap">
<input
className="form-input"
id="register-password-confirm"
type="password"
name="password"
data-constraints="@Required"
/>
<label className="form-label" htmlFor="register-password-confirm">
Confirm Password
</label>
</div>
<div className="form-wrap">
<button className="button button-sm button-primary button-block" type="submit">
Create an Account
</button>
</div>
<div className="form-wrap">
<div className="text-decoration-lines">
<span className="text-decoration-lines-content">or enter with</span>
</div>
</div>
<div className="form-wrap">
<div className="button-group">
<a
className="button button-facebook button-icon button-icon-only"
href="#"
aria-label="Facebook"
>
<span className="icon mdi mdi mdi-facebook"></span>
</a>
<a
className="button button-twitter button-icon button-icon-only"
href="#"
aria-label="Twitter"
>
<span className="icon mdi mdi-twitter"></span>
</a>
<a
className="button button-google button-icon button-icon-only"
href="#"
aria-label="Google+"
>
<span className="icon mdi mdi-google"></span>
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="rd-navbar-main-outer">
<div className="rd-navbar-main">
<div className="rd-navbar-panel">
<button className="rd-navbar-toggle" data-rd-navbar-toggle=".rd-navbar-nav-wrap">
<span></span>
</button>
<div className="rd-navbar-brand">
<a className="brand" href="index.html">
<img
className="brand-logo-dark"
src="images/logo-default-142x41.png"
alt=""
width="142"
height="41"
srcSet="images/logo-default-284x82.png 2x"
/>
<img
className="brand-logo-light"
src="images/logo-inverse-121x61.png"
alt=""
width="121"
height="61"
srcSet="images/logo-inverse-284x82.png 2x"
/>
</a>
</div>
</div>
<div className="rd-navbar-nav-wrap">
<ul className="rd-navbar-nav">
<li className="rd-nav-item active">
<a className="rd-nav-link" href="index.html">
Home
</a>
</li>
<li className="rd-nav-item">
<a className="rd-nav-link" href="#">
Properties
</a>
<ul className="rd-menu rd-navbar-dropdown">
<li className="rd-dropdown-item">
<a className="rd-dropdown-link" href="properties-grid.html">
Properties Grid
</a>
</li>
<li className="rd-dropdown-item">
<a className="rd-dropdown-link" href="properties-grid-2.html">
Properties Grid 2
</a>
</li>
<li className="rd-dropdown-item">
<a className="rd-dropdown-link" href="properties-list.html">
Properties List
</a>
</li>
<li className="rd-dropdown-item">
<a className="rd-dropdown-link" href="submit-property.html">
Submit property
</a>
</li>
<li className="rd-dropdown-item">
<a className="rd-dropdown-link" href="single-property.html">
Single Property
</a>
</li>
</ul>
</li>
<li className="rd-nav-item">
<a className="rd-nav-link" href="about-us.html">
About Us
</a>
</li>
<li className="rd-nav-item">
<a className="rd-nav-link" href="blog.html">
Blog
</a>
<ul className="rd-menu rd-navbar-dropdown">
<li className="rd-dropdown-item">
<a className="rd-dropdown-link" href="blog-post.html">
Blog post
</a>
</li>
</ul>
</li>
<li className="rd-nav-item">
<a className="rd-nav-link" href="#">
Pages
</a>
<ul className="rd-menu rd-navbar-megamenu">
<li className="rd-megamenu-item">
<h6 className="rd-megamenu-title">Pages 1</h6>
<ul className="rd-megamenu-list">
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="agents.html">
Agents
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="agent-single-page.html">
Agent Single Page
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="careers.html">
Careers
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="gallery.html">
Gallery
</a>
</li>
</ul>
</li>
<li className="rd-megamenu-item">
<h6 className="rd-megamenu-title">Pages 2</h6>
<ul className="rd-megamenu-list">
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="search-results.html">
Search results
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="coming-soon.html">
Coming Soon
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="404.html">
404
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="privacy-policy.html">
Privacy Policy
</a>
</li>
</ul>
</li>
<li className="rd-megamenu-item">
<h6 className="rd-megamenu-title">Elements</h6>
<ul className="rd-megamenu-list">
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="typography.html">
Typography
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="buttons.html">
Buttons
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="forms.html">
Forms
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="tabs-and-accordions.html">
Tabs and accordions
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="progress-bars.html">
Progress bars
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="tables.html">
Tables
</a>
</li>
<li className="rd-megamenu-list-item">
<a className="rd-megamenu-list-link" href="grid-system.html">
Grid System
</a>
</li>
</ul>
</li>
</ul>
</li>
<li className="rd-nav-item">
<a className="rd-nav-link" href="contact-us.html">
Contact Us
</a>
</li>
</ul>
<div className="rd-navbar-main-item">
<a className="button button-sm button-primary" href="#">
Submit property
</a>
</div>
</div>
</div>
</div>
</nav>
</div>
</header>
);
}

36
src/utils/metadata.ts Normal file
View File

@ -0,0 +1,36 @@
import { Metadata } from "next";
import { headers } from "next/headers";
export async function getDefaultMetadata(): Promise<Metadata> {
const headersList = await headers();
const mainUrl = headersList.get("x-main-url") ?? "";
const fullUrl = headersList.get("x-full-url") ?? "";
const siteName = headersList.get("x-site-name") ?? "";
const metaDesc = headersList.get("x-meta-desc") ?? "";
return {
metadataBase: new URL(mainUrl),
title: siteName,
description: metaDesc,
robots: {
index: true,
follow: true,
"max-image-preview": "large",
"max-snippet": -1,
"max-video-preview": -1,
},
openGraph: {
siteName,
description: metaDesc,
type: "website",
locale: "en_US",
url: fullUrl,
},
twitter: {
card: "summary_large_image",
},
alternates: {
canonical: "./",
},
};
}