Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 1 addition & 92 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,93 +1,2 @@
# Free React / Next.js landing page template
React / Next.js landing page

![Open React / Next.js template preview](https://github.com/user-attachments/assets/522a5e46-2a0e-48ca-80eb-87c7fa58f3ea)

**Open** is a **free React / Next.js landing page template built with Tailwind CSS** for developers/makers who want to create a quick and professional landing page for their open source projects, SaaS products, online services, and more.

**UPDATE 2025-02-04** Added Tailwind v4 support!

Use it for whatever you want, and be sure to reach us out on [Twitter](https://twitter.com/Cruip_com) if you build anything cool/useful with it.

Created and maintained with ❤️ by [Cruip.com](https://cruip.com).

_Version 1.0.0 built with the Cruip CSS is available [here](https://github.com/cruip/open-react-template/releases/tag/1.0.0)._
_Version 2.0.3 built with Tailwind CSS and React + Vite is available [here](https://github.com/cruip/open-react-template/releases/tag/2.0.3)._
_Version 3.3.0 (before redesign) built with Tailwind CSS and Next.js is available [here](https://github.com/cruip/open-react-template/releases/tag/3.3.0)._

## Live demo

Check the live demo here 👉️ [https://open.cruip.com/](https://open.cruip.com/)

## Open PRO

[![Open Pro](https://github.com/user-attachments/assets/2062c728-95f1-4d59-aa2d-d63556f625d5)](https://cruip.com/)

## Design files

If you need the design files, you can download them from Figma's Community 👉 https://bit.ly/401KSUS

## Usage

This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).

### Getting Started

First, run the development server:

```bash
npm run dev
# or
pnpm dev (recommended)
# or
yarn dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.

[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.

The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.

This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.

### Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!

### Deploy on Vercel

The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

### Support notes

This template has been developed with the App Router (`app`) and React Server Components. If you’re unfamiliar with these beta features, you can find more information about them on the Next.js beta documentation page. So, please note that any request dealing with React (e.g. extra features, customisations, et cetera) is to be considered out of the support scope.

For more information about what support covers, please see our (FAQs)[https://cruip.com/faq/].

## Credits

- [Nucleo](https://nucleoapp.com/)

## Terms and License

- Released under the [GPL](https://www.gnu.org/licenses/gpl-3.0.html).
- Copyright 2024 [Cruip](https://cruip.com/).
- Use it for personal and commercial projects, but please don’t republish, redistribute, or resell the template.
- Attribution is not required, although it is really appreciated.

## About Us

We're an Italian developer/designer duo creating high-quality design/code resources for developers, makers, and startups.

## Stay in the loop

If you would like to know when we release new resources, you can follow [@pacovitiello](https://x.com/pacovitiello) and [@DavidePacilio](https://x.com/DavidePacilio) on X, or you can subscribe to our [newsletter](https://cruip.com/newsletter/).
22 changes: 22 additions & 0 deletions app/(default)/about/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export const metadata = {
title: "Контакты - АЛМ",
description: "Свяжитесь с нами",
};

export default function Contact() {
return (
<section>
<div className="mx-auto max-w-6xl px-4 sm:px-6">
<div className="py-12 md:py-20 text-center">
<h1 className="pb-8 animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))] bg-[length:200%_auto] bg-clip-text pb-4 font-nacelle text-3xl font-semibold text-transparent md:text-3xl" data-aos="fade-up">
О нас
</h1>
<p className="mb-6 text-xl" data-aos="fade-up" data-aos-delay={200}>
«Архитектурно-реставрационная компания» занимается производством и продажей продукции торговой марки «АЛМ», наша компания зарекомендовала себя надёжным производителем продукции для работ по гидроизоляции, ремонту трещин и других дефектов, усилению и восстановлению строительных конструкций из бетона и кирпича современными методами – инъектирования, на объектах гражданского строительства, инфраструктурных объектах и объектах культурного наследия.
</p>

</div>
</div>
</section>
);
}
25 changes: 25 additions & 0 deletions app/(default)/contact/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
export const metadata = {
title: "Контакты - АЛМ",
description: "Свяжитесь с нами",
};

export default function Contact() {
return (
<section>
<div className="mx-auto max-w-6xl px-4 sm:px-6">
<div className="py-12 md:py-20 text-center">
<h1 className="pb-8 animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))] bg-[length:200%_auto] bg-clip-text pb-4 font-nacelle text-3xl font-semibold text-transparent md:text-3xl" data-aos="fade-up">
Свяжитесь с нами
</h1>
<p className="mb-6" data-aos="fade-up" data-aos-delay={200}>
Телефон: <a href="tel:+74951234567" className="text-indigo-500">+7 (495) 123-45-67</a>
</p>
<p className="mb-6" data-aos="fade-up" data-aos-delay={400}>
Email: <a href="mailto:info@alm-gr.ru" className="text-indigo-500">info@alm-gr.ru</a>
</p>

</div>
</div>
</section>
);
}
2 changes: 1 addition & 1 deletion app/(default)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export default function DefaultLayout({
<>
<main className="relative flex grow flex-col">{children}</main>

<Footer />

</>
);
}
8 changes: 4 additions & 4 deletions app/(default)/page.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
export const metadata = {
title: "Home - Open PRO",
description: "Page description",
title: "Главная - АЛМ",
description: "Описание страницы",
};

import PageIllustration from "@/components/page-illustration";
import Hero from "@/components/hero-home";
import Workflows from "@/components/workflows";
import Features from "@/components/features";
import Testimonials from "@/components/testimonials";
import Certificates from "@/components/certificates";
import Cta from "@/components/cta";

export default function Home() {
Expand All @@ -17,7 +17,7 @@ export default function Home() {
<Hero />
<Workflows />
<Features />
<Testimonials />
<Certificates/>
<Cta />
</>
);
Expand Down
57 changes: 57 additions & 0 deletions app/data/products.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
export interface Product {
slug: string;
name: string;
description: string;
image: string;
application: string;
basePreparation: string;
mixturePreparation: string;
specs: { label: string; value: string }[];
}

export const products: Product[] = [
{
slug: "alm-500",
name: "ALM - Микроцем 500",
description:
"ALM - микроцем 500 - сухая смесь на основе тонкомолотого цемента, добавок, компенсирующих усадочные деформация, и полимера, повышающего прочность сцепления с минеральными основаниями. При смешивании с водой ALM - микроцем 500 образует низковязкую, легко прокачиваемую суспензию. После затвердевания раствор обладает высокой прочностью сцепления с основанием.",
image: "/images/prod-1.png",
application:
"Заполнение полостей, швов и трещин в бетонных конструкциях. Склеивание трещин и заполнение пустот при отслоении и деформации. Усиление, гидроизоляция каменных и бетонных фундаментов. Цементация грунтов: средние и крупные пески с малой водонасыщенностью и высокой скоростью фильтрации. Ремонт кирпичных кладок методом инъектирования. Рекомендовано для использования при реставрации и реконструкции объектов культурного наследия (памятников архитектуры)",
basePreparation:
"Основание перед проведением инъекции рекомендуется предварительно продуть сжатым воздухом и по возможности очистить водой под давлением.",
mixturePreparation:
"Для приготовления растворной смеси необходимо использовать воду из питьевого водоснабжения. Соотношение при смешивании: на 1 кг сухой смеси требуется 0,25-0,4 л воды, 5-8 л на 20 кг, в зависимости от поставленной задачи. Сухую смесь добавить в отмеренное количество воды и перемешать в течение 4-5 минут до получения однородной консистенции. Перемешивание производят только механизированным способом с помощью электромиксера или элетродрели с насадкой на высоких оборотах. После перемешивания растворная смесь готова к применению. Время использования готовой растворной смеси 30-45 минут. Из 20 кг сухой смеси на выходе получается около 12 л раствора.",
specs: [
{ label: "Цвет", value: "Серый" },
{ label: "Средний размер частиц", value: "15–20 мкм" },
{ label: "Удельная поверхность", value: "Ок. 5500 см²/г" },
{ label: "Расход воды для затворения", value: "0,25–0,4 л/кг" },
{ label: "Расход воды на мешок 20 кг", value: "5–8 л" },
{ label: "Плотность растворной смеси", value: "Ок. 1,9 кг/дм³" },
{ label: "Расход сухой смеси", value: "1500–1700 кг/м³" },
{ label: "Вязкость (В3-б)", value: "30–50 сек" },
{ label: "Время использования готовой смеси", value: "30–45 мин" },
{ label: "Прочность при сжатии (28 суток)", value: "25–45 МПа" },
{ label: "Прочность при изгибе (28 суток)", value: "6–8 МПа" },
{ label: "Прочность сцепления с основанием", value: "4,5 МПа" },
{ label: "Марка водонепроницаемости", value: "W12 (не менее)" },
],
},
{
slug: "coming-soon",
name: "Скоро",
description:
"Мы работаем над новым продуктом и будем рады скоро преставить вам его.",
image: "/images/prod-0.png",
application:
"",
basePreparation:
"",
mixturePreparation:
"",
specs: [
{ label: "", value: "" },
],
},
];
10 changes: 6 additions & 4 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Inter } from "next/font/google";
import localFont from "next/font/local";

import Header from "@/components/ui/header";
import Footer from "@/components/ui/footer";

const inter = Inter({
subsets: ["latin"],
Expand Down Expand Up @@ -39,8 +40,8 @@ const nacelle = localFont({
});

export const metadata = {
title: "Create Next App",
description: "Generated by create next app",
title: "АЛМ",
description: "Создано с помощью create next app",
};

export default function RootLayout({
Expand All @@ -49,13 +50,14 @@ export default function RootLayout({
children: React.ReactNode;
}) {
return (
<html lang="en">
<html lang="ru">
<body
className={`${inter.variable} ${nacelle.variable} bg-gray-950 font-inter text-base text-gray-200 antialiased`}
className={`${inter.variable} ${nacelle.variable} bg-white font-inter text-base text-gray-800 antialiased`}
>
<div className="flex min-h-screen flex-col overflow-hidden supports-[overflow:clip]:overflow-clip">
<Header />
{children}
<Footer/>
</div>
</body>
</html>
Expand Down
7 changes: 7 additions & 0 deletions app/products/[slug]/not-found.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default function NotFound() {
return (
<div className="p-8 text-center">
<h1 className="text-2xl font-semibold text-gray-200">Продукт не найден</h1>
</div>
)
}
73 changes: 73 additions & 0 deletions app/products/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import Image from 'next/image'
import Link from 'next/link'
import { notFound } from 'next/navigation'
import { products } from '@/app/data/products'

export function generateStaticParams() {
return products.map((p) => ({ slug: p.slug }))
}

export function generateMetadata({ params }: any) {
const product = products.find((p) => p.slug === params.slug)
return { title: product ? product.name : 'Продукт' }
}

export default function ProductPage({ params }: any) {
const product = products.find((p) => p.slug === params.slug)
if (!product) return notFound()

return (
<section>
<div className="mx-auto max-w-3xl px-4 sm:px-6">
<div className="py-12 md:py-20">
<nav className="mb-6 text-sm text-gray-400 flex justify-between">
<span><Link href="/" className="hover:text-indigo-500">Главная</Link>
{' / '}
<Link href="/products" className="hover:text-indigo-500">Каталог продукции</Link>
{' / '}
<span className="text-gray-600">{product.name}</span>
</span>
<span className="text-right ">
<Link href="/products" className="text-indigo-400 underline-offset-4 hover:text-indigo-500 hover:underline ">
← Назад к каталогу
</Link>
</span>
</nav>

<h1 className="
animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))]
bg-[length:200%_auto] bg-clip-text pb-6 font-nacelle text-transparent
pt-12 text-center text-3xl font-semibold ">{product.name}</h1>
<Image src={product.image} width={720} height={945} alt={product.name} className="mb-6 w-sm rounded-md" />
<p className="mb-6 text-gray-700">{product.description}</p>
<div className="space-y-4">
<div>
<h2 className="animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))]
bg-[length:200%_auto] bg-clip-text pb-4 font-nacelle text-transparent text-center text-xl font-semibold ">Область применения</h2>
<p className="text-gray-700">{product.application}</p>
</div>
<div>
<h2 className="animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))]
bg-[length:200%_auto] bg-clip-text pb-4 font-nacelle text-transparent text-center text-xl font-semibold ">Подготовка основания</h2>
<p className="text-gray-700">{product.basePreparation}</p>
</div>
<div>
<h2 className="animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))]
bg-[length:200%_auto] bg-clip-text pb-4 font-nacelle text-transparent text-center text-xl font-semibold ">Приготовление растворной смеси</h2>
<p className="text-gray-700">{product.mixturePreparation}</p>
</div>
<div>
<h2 className="animate-[gradient_6s_linear_infinite] bg-[linear-gradient(to_right,var(--color-gray-700),var(--color-indigo-700),var(--color-gray-600),var(--color-indigo-800),var(--color-gray-700))]
bg-[length:200%_auto] bg-clip-text pb-4 font-nacelle text-transparent text-center text-xl font-semibold ">Технические характеристики</h2>
<ul className="list-disc space-y-1 pl-5 text-gray-700">
{product.specs.map((s) => (
<li key={s.label}><span className="font-medium text-gray-500">{s.label}:</span> {s.value}</li>
))}
</ul>
</div>
</div>
</div>
</div>
</section>
)
}
Loading