1
0
Fork 0

Compare commits

...

4 commits

Author SHA1 Message Date
7b5d149ecc
feat: final commit
Signed-off-by: Vojtech Mares <iam@vojtechmares.com>
2023-12-13 18:20:21 +01:00
517a25d91d
chore(README): rename to websites 2023-06-07 09:41:28 +02:00
ada7eb3cdd
refactor: drop everything and start again
- too many packages
- packages were too general
- the repo was hard to work with
- sites were too connected to packages - difficult to do stuff after a while
2023-06-06 20:25:44 +02:00
358e6e59e3
chore(deps): sync pnpm-lock.yaml with current package.json 2023-06-06 19:31:38 +02:00
70 changed files with 1738 additions and 1268 deletions

View file

@ -1,3 +1,3 @@
# Microsites
# Websites
Monorepo of my microsites
Monorepo of my websites

View file

@ -15,7 +15,9 @@
"format": "prettier --write \"**/*.{js,cjs,mjs,ts,tsx,md,mdx}\""
},
"devDependencies": {
"eslint-config-custom": "workspace:*",
"eslint": "^8.42.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-turbo": "^1.10.1",
"prettier": "latest",
"prettier-plugin-tailwindcss": "^0.3.0",
"turbo": "latest"

View file

@ -1,6 +0,0 @@
{
"name": "config",
"version": "0.0.0",
"dependencies": {}
}

View file

@ -1,6 +0,0 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
}

View file

@ -1,11 +0,0 @@
module.exports = {
content: [
'../../packages/ui/components/**/*.{ts,tsx}',
'./src/**/*.{ts,tsx}',
'../../packages/ui/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {}
},
plugins: []
}

View file

@ -0,0 +1,5 @@
{
"name": "content",
"version": "0.0.0",
"private": true
}

View file

@ -0,0 +1,11 @@
---
title: Kubernetes školení
slug: kubernetes
description: TODO
image: ../images/kubernetes.png
price:
open: 9000
corporate: 29000
days: 2
featured: true
---

View file

@ -0,0 +1,11 @@
---
title: Terraform školení
slug: terraform
description: TODO
image: ../images/terraform.png
price:
open: 5000
corporate: 19000
days: 1
featured: false
---

View file

@ -1,7 +0,0 @@
module.exports = {
extends: ["next", "turbo", "prettier"],
rules: {
"@next/next/no-html-link-for-pages": "off",
"react/jsx-key": "off",
},
};

View file

@ -1,19 +0,0 @@
{
"name": "eslint-config-custom",
"version": "0.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"eslint": "^8.0.0",
"eslint-config-next": "^13.0.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-react": "7.32.2",
"eslint-config-turbo": "latest"
},
"devDependencies": {
"typescript": "^4.7.4"
},
"publishConfig": {
"access": "public"
}
}

View file

View file

@ -1,3 +0,0 @@
# `tsconfig`
These are base shared `tsconfig.json`s from which all other `tsconfig.json`'s inherit from.

View file

@ -1,20 +0,0 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Default",
"compilerOptions": {
"composite": false,
"declaration": true,
"declarationMap": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"inlineSources": false,
"isolatedModules": true,
"moduleResolution": "node",
"noUnusedLocals": false,
"noUnusedParameters": false,
"preserveWatchOutput": true,
"skipLibCheck": true,
"strict": true
},
"exclude": ["node_modules"]
}

View file

@ -1,22 +0,0 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Next.js",
"extends": "./base.json",
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"incremental": true,
"esModuleInterop": true,
"module": "esnext",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve"
},
"include": ["src", "next-env.d.ts"],
"exclude": ["node_modules"]
}

View file

@ -1,10 +0,0 @@
{
"name": "tsconfig",
"version": "0.0.0",
"private": true,
"files": [
"base.json",
"nextjs.json",
"react-library.json"
]
}

View file

@ -1,11 +0,0 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"display": "React Library",
"extends": "./base.json",
"compilerOptions": {
"jsx": "react-jsx",
"lib": ["ES2015"],
"module": "ESNext",
"target": "es6"
}
}

View file

@ -1,4 +0,0 @@
import * as React from "react";
export const Button = () => {
return <button>Boop</button>;
};

View file

@ -1,2 +0,0 @@
import * as React from "react";
export * from "./Button";

View file

@ -1,19 +0,0 @@
{
"name": "ui",
"version": "0.0.0",
"main": "./index.tsx",
"types": "./index.tsx",
"license": "MIT",
"scripts": {
"lint": "eslint *.ts*"
},
"devDependencies": {
"@types/react": "^18.0.17",
"@types/react-dom": "^18.0.6",
"eslint": "^8.0.0",
"eslint-config-custom": "workspace:*",
"react": "^18.2.0",
"tsconfig": "workspace:*",
"typescript": "^4.5.2"
}
}

View file

@ -1 +0,0 @@
module.exports = require('config/postcss.config')

View file

@ -1 +0,0 @@
module.exports = require('config/tailwind.config')

View file

@ -1,5 +0,0 @@
{
"extends": "tsconfig/react-library.json",
"include": ["."],
"exclude": ["dist", "build", "node_modules"]
}

2070
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -1,5 +0,0 @@
const withTM = require("next-transpile-modules")(["ui"]);
module.exports = withTM({
reactStrictMode: true,
});

View file

@ -1,28 +0,0 @@
{
"name": "argocd-skoleni.cz",
"version": "0.0.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"next": "13.4.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"ui": "workspace:*",
"config": "workspace:*"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"eslint-config-custom": "workspace:*",
"eslint": "8.41.0",
"next-transpile-modules": "10.0.0",
"tsconfig": "workspace:*",
"@types/node": "^18.0.0",
"@types/react": "18.2.7",
"typescript": "^4.5.3"
}
}

View file

@ -1 +0,0 @@
module.exports = require('config/postcss.config')

View file

@ -1,10 +0,0 @@
import { Button } from "ui";
export default function Web() {
return (
<div>
<h1>argocd-skoleni.cz</h1>
<Button />
</div>
);
}

View file

@ -1 +0,0 @@
module.exports = require('config/tailwind.config')

View file

@ -1,5 +0,0 @@
{
"extends": "tsconfig/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}

View file

@ -1,4 +0,0 @@
module.exports = {
root: true,
extends: ["custom"],
};

View file

@ -1,30 +0,0 @@
## Getting Started
First, run the development server:
```bash
yarn dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `pages/index.js`. 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.js`.
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.
## 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_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

View file

@ -1,5 +0,0 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.

View file

@ -1,5 +0,0 @@
const withTM = require("next-transpile-modules")(["ui"]);
module.exports = withTM({
reactStrictMode: true,
});

View file

@ -1,28 +0,0 @@
{
"name": "kubernetes-skoleni.cz",
"version": "0.0.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"next": "13.4.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"ui": "workspace:*",
"config": "workspace:*"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"eslint-config-custom": "workspace:*",
"eslint": "8.41.0",
"next-transpile-modules": "10.0.0",
"tsconfig": "workspace:*",
"@types/node": "^18.0.0",
"@types/react": "18.2.7",
"typescript": "^4.5.3"
}
}

View file

@ -1 +0,0 @@
module.exports = require('config/postcss.config')

View file

@ -1,10 +0,0 @@
import { Button } from "ui";
export default function Web() {
return (
<div>
<h1>kubernetes-skoleni.cz</h1>
<Button />
</div>
);
}

View file

@ -1 +0,0 @@
module.exports = require('config/tailwind.config')

View file

@ -1,5 +0,0 @@
{
"extends": "tsconfig/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}

View file

@ -1,4 +0,0 @@
module.exports = {
root: true,
extends: ["custom"],
};

View file

@ -1,30 +0,0 @@
## Getting Started
First, run the development server:
```bash
yarn dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `pages/index.js`. 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.js`.
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.
## 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_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

View file

@ -1,5 +0,0 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.

View file

@ -1,5 +0,0 @@
const withTM = require("next-transpile-modules")(["ui"]);
module.exports = withTM({
reactStrictMode: true,
});

View file

@ -1 +0,0 @@
module.exports = require('config/postcss.config')

View file

@ -1,10 +0,0 @@
import { Button } from "ui";
export default function Web() {
return (
<div>
<h1>Web</h1>
<Button />
</div>
);
}

View file

@ -1 +0,0 @@
module.exports = require('config/tailwind.config')

View file

@ -1,5 +0,0 @@
{
"extends": "tsconfig/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}

View file

@ -0,0 +1,27 @@
import { Footer } from 'components/Footer';
import 'styles/global.css';
import { Metadata } from 'next';
export const metadata: Metadata = {
title: {
default: 'Terraform školení - Vojtěch Mareš',
template: '%s | Next.js App Router',
},
description:
'Terraform školení pro začátečníky i pokročilé | Školí Vojtěch Mareš - DevOps konzultant, lektor a mentor',
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="cs">
<body>
{children}
<Footer />
</body>
</html>
);
}

View file

@ -0,0 +1,26 @@
import { Container } from "components/Container";
import { Hero } from "../components/Hero";
import { Dates } from "../components/Dates";
import { Price } from "../components/Price";
import { CourseDetails } from "components/CourseDetails";
export default function Page() {
return (
<>
<main>
<Hero />
<div className="bg-amber-500 h-8" />
{/* <Dates /> */}
<Container className="mt-12 md:grid md:grid-cols-5 md:gap-x-4 md:gap-y-4">
<div className="md:col-span-3">
<CourseDetails />
</div>
<div className="mt-8 md:col-span-2 md:mt-0">
<Price />
</div>
</Container>
</main>
</>
);
}

View file

@ -0,0 +1,75 @@
import Link from "next/link";
import clsx from "clsx";
import { ReactNode } from "react";
const baseStyles = {
solid:
"group inline-flex items-center justify-center rounded-full font-semibold focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2",
outline:
"group inline-flex ring-1 items-center justify-center rounded-full focus:outline-none",
};
const variantStyles = {
solid: {
black:
"bg-black text-white hover:bg-slate-700 active:bg-slate-800 focus-visible:outline-slate-900",
amber:
"bg-amber-500 text-white hover:bg-amber-600 active:bg-amber-800 focus-visible:outline-amber-500",
white:
"bg-white text-black hover:bg-amber-50 active:bg-amber-200 focus-visible:outline-white",
},
outline: {
black:
"ring-slate-200 text-black hover:ring-slate-300 active:bg-slate-100 focus-visible:outline-amber-500 focus-visible:ring-slate-300",
white:
"ring-slate-700 text-white hover:ring-slate-500 active:ring-slate-700 focus-visible:outline-white",
amber: "", // Outline buttons cannot be amber
},
};
const transitionStyle = "transition duration-150 ease-in-out";
const sizeStyles = {
medium: "px-4 py-2 text-sm",
large: "px-8 py-4 text-base",
};
type Props = {
variant?: "solid" | "outline";
color?: "black" | "white" | "amber";
size?: "medium" | "large";
className?: string;
href?: string;
children?: ReactNode;
};
export function Button({
variant = "solid",
color = "black",
size = "medium",
className,
href,
children,
}: Props) {
if (variant === "outline" && color === "amber") {
throw new Error("Outline buttons cannot be amber");
}
className = clsx(
baseStyles[variant],
variantStyles[variant][color],
sizeStyles[size],
transitionStyle,
className
);
if (href !== undefined) {
return (
<Link href={href} className={className}>
{children}
</Link>
);
} else {
return <button className={className}>{children}</button>;
}
}

View file

@ -0,0 +1,15 @@
import clsx from "clsx";
import { ReactNode } from "react";
type Props = {
className?: string;
children?: ReactNode;
};
export function Container({ className, children }: Props) {
return (
<div className={clsx("mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", className)}>
{children}
</div>
);
}

View file

@ -0,0 +1,44 @@
export function CourseDetails() {
return (
<>
<h1 className="text-2xl font-medium">Co to je Terraform a k čemu se používá?</h1>
<p className="text-slate-700">
Terraform je nástroj, který se používá ke správě infrastruktury v cloudu, jak veřejném (AWS, Azure, GCP), tak privátním (OpenStack, VMware vSphere).
Terraform Vám umožní spravovat infrastruktutru jako kód, to znamená verzovanou v Gitu, přidávání resources pomocí merge (pull) requestů a mnoho dalších výhod. Infrastrukturu můžete dále nasadit do testovacího prostředí přesně tak, jako je v produkci bez zbytečného úsilí. O všech komponentách máte přehled a můžete predikovat ceny. Konec klikání infrastruktury, zkuste Terraform.
Terraform umožnuje spravovat více cloudových providerů současne, zároveň umožnuje pracovat s hibridními cloudy (část v privátním cloudu, část ve veřejném).
</p>
<h1 className="text-2xl font-medium">Jak školení probíhá</h1>
<p className="text-slate-700">Školení je formou workshopu, všechno si podrobně vyzkoušíme a vysvětlíme. Ukážeme si jak Terraform pracuje, jak jej používat v teamu a jak jím spravovat infrastukturu. Uděláme si příklad infrastruktury jednoduché aplikace, kde nastavíme vše - od DNS, přes Kubernetes cluster po S3 file storage.</p>
<h1 className="text-2xl font-medium">Co Vás naučím</h1>
<ul>
<li className="my-0">Základní koncept Terraformu a "Infrastructure as Code"</li>
<li className="my-0">Výhody Terraformu proti Ansible, Puppetu, ...</li>
<li className="my-0">Konfigurace Terraformu pro práci v teamu</li>
<li className="my-0">Ovládání Terraform CLI</li>
<li className="my-0">Úvod do Terraform Configuration Language (HCL)</li>
<li className="my-0">Terraform Providers - napojení na cloudy</li>
<li className="my-0">Práce s resources v Terraformu</li>
<li className="my-0">Terraform moduly</li>
<li className="my-0">Best Practice</li>
</ul>
<h1 className="text-2xl font-medium">Pro koho je školení určeno</h1>
<p className="text-slate-700">Školení je určeno pro DevOps a adminy, kteří chtějí lépe a efektivněji spravovat infrastrukturu. Zároveň také pro vývojáře, kteří se starají o nejakou infrastrukturu v cloudech.</p>
<h1 className="text-2xl font-medium">Předchozí znalosti</h1>
<ul>
<li className="my-0">Základní znalost veřejných cloudů (AWS, DigitalOcean, Azure, ...)</li>
<li className="my-0">Základy práce v terminálu</li>
</ul>
<h1 className="text-2xl font-medium">Technické požadavky</h1>
<ul>
<li className="my-0">Nainstalovaný Terraform</li>
<li className="my-0">Přístup na internet (ideálně bez korporatni proxy)</li>
<li className="my-0">Vlastní účet v DigitalOceanu výhodou</li>
</ul>
</>
);
}

View file

@ -0,0 +1,35 @@
export function Dates() {
return (
<div className="mt-8 mx-auto max-w-3xl px-4 sm:px-6 lg:px-8">
<h2 className="text-4xl">Veřejné termíny</h2>
<div className="mt-8 flow-root">
<div className="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
<div className="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
<table className="min-w-full divide-y divide-gray-300">
<thead>
<tr>
<th scope="col" className="py-3.5 pl-4 pr-3 text-left font-semibold text-gray-900 sm:pl-0">Místo</th>
<th scope="col" className="px-3 py-3.5 text-left font-semibold text-gray-900">Datum</th>
<th scope="col" className="px-3 py-3.5 text-left font-semibold text-gray-900">Volná místa?</th>
<th scope="col" className="relative py-3.5 pl-3 pr-4 sm:pr-0">
<span className="sr-only">Registrovat</span>
</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="whitespace-nowrap py-4 pl-4 pr-3 font-medium text-gray-900 sm:pl-0">Praha</td>
<td className="whitespace-nowrap px-3 py-4 text-gray-500">30. května 2023</td>
<td className="whitespace-nowrap px-3 py-4 text-gray-500">Ano</td>
<td className="relative whitespace-nowrap py-4 pl-3 pr-4 text-right font-medium sm:pr-0">
<a href="#" className="underline">Registrovat<span className="sr-only">, na termín školení</span></a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
)
}

View file

@ -0,0 +1,159 @@
import Link from "next/link";
import { Container } from "./Container";
import { Button } from "./Button";
export function Footer() {
return (
<footer className="bg-slate-50">
<Container className="py-8">
<div className="py-4">
<div className="grid grid-cols-1 gap-y-6 lg:grid-cols-4 lg:gap-4">
<div>
<h4 className="text-lg font-medium">Vojtěch Mareš</h4>
<ul className="mt-4 list-none">
<li>
<Link href="tel:+420732490651" className="underline">
+420 732 490 651
</Link>
</li>
<li>
<Link
href="mailto:iam@vojtechmares.com"
className="underline"
>
iam@vojtechmares.com
</Link>
</li>
<li className="mt-4">
Company ID
<br />
<code id="company-id">06999280</code>
</li>
<li className="mt-2">
VAT ID
<br />
<code id="vat-id">CZ9709180063</code>
</li>
</ul>
</div>
<div>
<h3 className="text-lg font-medium">Další školení</h3>
<ul className="mt-4 list-disc pl-4">
<li>
<Link href="https://www.vojtechmares.com/skoleni/kubernetes" className="underline">
Kubernetes
</Link>
</li>
<li>
<Link href="https://www.vojtechmares.com/skoleni/git" className="underline">Git</Link>
</li>
<li>
<Link href="https://www.vojtechmares.com/skoleni/terraform" className="underline">
Terraform
</Link>
</li>
<li>
<Link href="https://www.vojtechmares.com/skoleni/argocd" className="underline">ArgoCD</Link>
</li>
</ul>
</div>
<div>
<h3 className="text-lg font-medium">Důležité odkazy</h3>
<ul className="mt-4 list-disc pl-4">
<li>
<Link
href="https://vojtechmares.com/?utm_source=microsite&utm_medium=terraform-skoleni.cz&utm_content=link"
className="underline"
>
vojtechmares.com
</Link>
</li>
<li>
<Link
href="https://skoleni.io/?utm_source=vojtechmares&utm_medium=vojtechmares-com-website&utm_content=link"
className="underline"
target="_blank"
>
Skoleni.io
</Link>
</li>
<li>
<Link
href="https://devopsaci.cz/?utm_source=vojtechmares&utm_medium=vojtechmares-com-website&utm_content=link"
className="underline"
target="_blank"
>
DevOpsaci.cz
</Link>
</li>
</ul>
</div>
<div>
<h3 className="text-lg font-medium">Máte zájem o školení?</h3>
<p className="mt-4">
TBD.
</p>
<Button
href="mailto:iam@vojtechmares.com"
className="mt-5"
>
Napište mi
</Button>
</div>
</div>
</div>
<div className="flex flex-col items-center border-t border-slate-400/10 py-10 sm:flex-row-reverse sm:justify-between">
<div className="flex gap-x-6">
<Link
href="https://www.linkedin.com/in/vojtech-mares/"
target="_blank"
className="group"
aria-label="Vojtěch Mareš na LinkedIn"
>
<svg
// role="img"
// viewBox="0 0 24 24"
// xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
className="h-6 w-6 fill-black group-hover:fill-slate-700"
>
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</Link>
<Link
href="https://twitter.com/vojtechmares_"
target="_blank"
className="group"
aria-label="Vojtěch Mareš na Twitter"
>
<svg
aria-hidden="true"
className="h-6 w-6 fill-black group-hover:fill-slate-700"
>
<path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0 0 22 5.92a8.19 8.19 0 0 1-2.357.646 4.118 4.118 0 0 0 1.804-2.27 8.224 8.224 0 0 1-2.605.996 4.107 4.107 0 0 0-6.993 3.743 11.65 11.65 0 0 1-8.457-4.287 4.106 4.106 0 0 0 1.27 5.477A4.073 4.073 0 0 1 2.8 9.713v.052a4.105 4.105 0 0 0 3.292 4.022 4.093 4.093 0 0 1-1.853.07 4.108 4.108 0 0 0 3.834 2.85A8.233 8.233 0 0 1 2 18.407a11.615 11.615 0 0 0 6.29 1.84" />
</svg>
</Link>
<Link
href="https://github.com/vojtechmares"
target="_blank"
className="group"
aria-label="Vojtěch Mareš na GitHub"
>
<svg
aria-hidden="true"
className="h-6 w-6 fill-black group-hover:fill-slate-700"
>
<path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2Z" />
</svg>
</Link>
</div>
<p className="mt-6 text-slate-700 sm:mt-0">
Copyright &copy; {new Date().getFullYear()} Vojtěch Mareš. Všechna
práva vyhrazena.
</p>
</div>
</Container>
</footer>
);
}

View file

@ -0,0 +1,34 @@
import Image from 'next/image';
import clsx from 'clsx';
import { Container } from './Container';
import terraformLogo from '../images/terraform.svg';
export function Hero() {
return (
<>
<div className="bg-black pt-16 pb-16">
<Container className="flex flex-col justify-center md:flex-row md:justify-around md:items-end">
<Image
src={terraformLogo}
width="1500"
height="1500"
alt=""
priority
className={clsx(
"h-32 w-32",
terraformLogo.src.endsWith(".svg") ? "invert" : "rounded-full"
)}
/>
<div className="self-center">
<h1 className="text-center font-display text-5xl font-medium tracking-tight text-white sm:text-7xl leading-10">
Terraform školení
</h1>
<p className="mt-6 max-w-xl text-xl tracking-tight text-slate-100">
Školí: Vojtěch Mareš - DevOps konzultant, lektor a mentor
</p>
</div>
</Container>
</div>
</>
);
}

View file

@ -0,0 +1,45 @@
import { Button } from "./Button"
export function Price() {
return (
<>
<div className="mt-8 overflow-hidden rounded-lg bg-slate-50 shadow md:mt-0">
<div className="px-4 pt-5 sm:px-6">
<h3 className="text-lg font-medium leading-6 text-black">
Cena za školení
</h3>
</div>
<div className=" px-4 pb-5 pt-2">
<dl className="sm:divide-y sm:divide-slate-400">
<div className="py-4 sm:grid sm:grid-cols-2 sm:gap-4 sm:py-5 sm:px-6">
<dt className="font-medium text-slate-700">
Veřejný termín
</dt>
<dd className="mt-1 text-black sm:mt-0">
5500 CZK bez DPH
</dd>
</div>
<div className="py-4 sm:grid sm:grid-cols-2 sm:gap-4 sm:py-5 sm:px-6">
<dt className="font-medium text-slate-700">
Firemní školení
</dt>
<dd className="mt-1 text-black sm:mt-0">
19 000 CZK bez DPH
</dd>
</div>
</dl>
</div>
</div>
<div className="mt-8">
<Button
variant="solid"
color="amber"
className="w-full text-lg font-medium"
href="mailto:iam@vojtechmares.com"
>
Nezávazně poptat
</Button>
</div>
</>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Terraform</title><path d="M1.44 0v7.575l6.561 3.79V3.787zm21.12 4.227l-6.561 3.791v7.574l6.56-3.787zM8.72 4.23v7.575l6.561 3.787V8.018zm0 8.405v7.575L15.28 24v-7.578z"/></svg>

After

Width:  |  Height:  |  Size: 253 B

View file

@ -0,0 +1,6 @@
const nextConfig = {
transpilePackages: ['ui'],
reactStrictMode: true,
};
module.exports = nextConfig;

View file

@ -1,5 +1,5 @@
{
"name": "r11y.news",
"name": "terraform-skoleni.cz",
"version": "0.0.0",
"private": true,
"scripts": {
@ -9,20 +9,20 @@
"lint": "next lint"
},
"dependencies": {
"clsx": "^1.2.1",
"next": "13.4.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"ui": "workspace:*",
"config": "workspace:*"
"react-dom": "18.2.0"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"eslint-config-custom": "workspace:*",
"eslint": "8.41.0",
"next-transpile-modules": "10.0.0",
"tsconfig": "workspace:*",
"@types/node": "^18.0.0",
"@babel/core": "^7.22.1",
"@types/node": "^18.16.16",
"@types/react": "18.2.7",
"typescript": "^4.5.3"
"autoprefixer": "^10.4.14",
"eslint": "8.41.0",
"eslint-config-next": "^13.0.0",
"postcss": "^8.4.24",
"tailwindcss": "^3.3.2",
"typescript": "5.1.3"
}
}

View file

@ -0,0 +1,8 @@
// If you want to use other PostCSS plugins, see the following:
// https://tailwindcss.com/docs/using-with-preprocessors
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View file

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View file

@ -0,0 +1,10 @@
module.exports = {
content: [
'./components/**/*.{ts,tsx}',
'./app/**/*.{ts,tsx}',
],
theme: {
extend: {}
},
plugins: []
}

View file

@ -0,0 +1,44 @@
{
"compilerOptions": {
"baseUrl": ".",
"composite": false,
"declaration": true,
"declarationMap": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"inlineSources": false,
"isolatedModules": true,
"moduleResolution": "node",
"noUnusedLocals": false,
"noUnusedParameters": false,
"preserveWatchOutput": true,
"skipLibCheck": true,
"strict": true,
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"noEmit": true,
"module": "esnext",
"resolveJsonModule": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
]
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}