diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..fd3dbb5
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..739aba3
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,45 @@
+# syntax = docker/dockerfile:1
+
+# Adjust NODE_VERSION as desired
+ARG NODE_VERSION=22.3.0
+FROM node:${NODE_VERSION}-slim as base
+
+LABEL fly_launch_runtime="Next.js"
+
+# Next.js app lives here
+WORKDIR /app
+
+# Set production environment
+ENV NODE_ENV="production"
+
+
+# Throw-away build stage to reduce size of final image
+FROM base as build
+
+# Install packages needed to build node modules
+RUN apt-get update -qq && \
+ apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3
+
+# Install node modules
+COPY --link package-lock.json package.json ./
+RUN npm ci --include=dev
+
+# Copy application code
+COPY --link . .
+
+# Build application
+RUN npm run build
+
+# Remove development dependencies
+RUN npm prune --omit=dev
+
+
+# Final stage for app image
+FROM base
+
+# Copy built application
+COPY --from=build /app /app
+
+# Start the server by default, this can be overwritten at runtime
+EXPOSE 3000
+CMD [ "npm", "run", "start" ]
diff --git a/app/about/page.jsx b/app/about/page.jsx
new file mode 100644
index 0000000..f56aa6d
--- /dev/null
+++ b/app/about/page.jsx
@@ -0,0 +1,103 @@
+import React from 'react';
+import { User, Award, Globe } from 'lucide-react';
+import { Button } from '@/components/ui/Button';
+
+const TeamMember = ({ name, role, image }) => (
+
+
+
+
+);
+
+const AboutPage = () => {
+ const teamMembers = [
+ { name: "Jane Doe", role: "CEO & Founder", image: "/api/placeholder/150/150" },
+ { name: "John Smith", role: "CTO", image: "/api/placeholder/150/150" },
+ { name: "Emily Brown", role: "Head of AI", image: "/api/placeholder/150/150" },
+ ];
+
+ return (
+
+
+
+
+
+
+
+ Empowering Canadian Businesses with Innovative Technology
+
+
+ Techaro Computing Canada is at the forefront of digital transformation, helping businesses across the country leverage cutting-edge technology to drive growth and innovation.
+
+
+
+
+
+
Our Mission
+
+
+
+
+
+
+ Client Focus
+
+
+ We are dedicated to understanding and meeting the unique needs of each client, ensuring their success in the digital landscape.
+
+
+
+
+
+ Innovation
+
+
+ We continuously explore and implement the latest technologies to provide cutting-edge solutions for our clients.
+
+
+
+
+
+ Canadian Focus
+
+
+ We are committed to strengthening the Canadian tech ecosystem and helping local businesses compete on a global scale.
+
+
+
+
+
+
+
+
Our Leadership Team
+
+ {teamMembers.map((member, index) => (
+
+ ))}
+
+
+
+
+
+
Ready to Transform Your Business?
+
Let{"'"}s discuss how Techaro Computing Canada can help you achieve your technology goals.
+
+ Schedule a Consultation
+
+
+
+
+
+
+
+ );
+};
+
+export default AboutPage;
\ No newline at end of file
diff --git a/app/contact/page.jsx b/app/contact/page.jsx
new file mode 100644
index 0000000..0d38a6e
--- /dev/null
+++ b/app/contact/page.jsx
@@ -0,0 +1,52 @@
+import React from 'react';
+
+const ContactPage = () => {
+ async function contactForm(formData) {
+ "use server";
+ const rawFormData = {
+ name: formData.get('name'),
+ email: formData.get('email'),
+ message: formData.get('message'),
+ };
+ console.log(rawFormData);
+ };
+
+ return (
+
+
Contact Techaro Computing Canada
+
+
+
+
Get in Touch
+
We would love to hear from you. Please fill out the form below or use our contact information.
+
+
Contact Information
+
Email: sales@techaro.lol
+
Phone: (123) 456-7890
+
Address: 123 Tech Street, Toronto, ON M5V 1J2
+
+
+
+
+
+ );
+};
+
+export default ContactPage;
\ No newline at end of file
diff --git a/app/globals.css b/app/globals.css
index 875c01e..152ba88 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -2,6 +2,14 @@
@tailwind components;
@tailwind utilities;
+html {
+ font-family: var(--font-inter);
+}
+
+h1 {
+ font-family: var(--font-podkova);
+}
+
:root {
--foreground-rgb: 0, 0, 0;
--background-start-rgb: 214, 219, 220;
diff --git a/app/layout.tsx b/app/layout.tsx
index 3314e47..b8ab185 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,12 +1,25 @@
import type { Metadata } from "next";
-import { Inter } from "next/font/google";
+import { Inter, Podkova } from "next/font/google";
import "./globals.css";
+import React from "react";
+import Link from "next/link";
+import { Button } from "@/components/ui/Button";
-const inter = Inter({ subsets: ["latin"] });
+const inter = Inter({
+ subsets: ["latin"],
+ variable: "--font-inter",
+ display: "swap",
+});
+
+const podkova = Podkova({
+ subsets: ["latin"],
+ variable: "--font-podkova",
+ display: "swap",
+});
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "Techaro Computing Canada",
+ description: "Your one-stop shop for all your computing needs.",
};
export default function RootLayout({
@@ -16,7 +29,69 @@ export default function RootLayout({
}>) {
return (
- {children}
+
+
+
+
+
+
+
+
+
+ Services
+
+
+
+
+ About
+
+
+
+
+ Contact
+
+
+
+
+
+
+
{children}
+
+
+
);
}
diff --git a/app/page.jsx b/app/page.jsx
new file mode 100644
index 0000000..fc1a244
--- /dev/null
+++ b/app/page.jsx
@@ -0,0 +1,91 @@
+import React from 'react';
+import Link from 'next/link';
+import { ChevronRight, Laptop, Users, TrendingUp, Brain } from 'lucide-react';
+import { Button } from '@/components/ui/Button';
+
+const HomePage = () => {
+ return (
+
+
+
+
+ Transform Your Business
+ with Techaro Computing Canada
+
+
+ We help Canadian businesses leverage cutting-edge technology to drive growth, efficiency, and innovation.
+
+
+
+
+
+ Get started
+
+
+
+
+
+
+
+ Learn more
+
+
+
+
+
+
+
+
+
Our Services
+
+ {[
+ { icon: Laptop, title: "IT Strategy", description: "Align your technology investments with your business goals for maximum impact." },
+ { icon: Users, title: "Digital Transformation", description: "Modernize your operations and customer experiences with cutting-edge digital solutions." },
+ { icon: TrendingUp, title: "Data Analytics", description: "Unlock the power of your data to drive informed decision-making and business growth." }
+ ].map((service, index) => (
+
+
+
+
+
+
+
+
+
{service.title}
+
{service.description}
+
+
+
+ ))}
+
+
+
+
+
+
+
+ Transform Your Business
+ with Industry-Leading AI Tools
+
+
+ At Techaro Computing Canada, we offer transformational experiences by leveraging cutting-edge AI technologies. Our solutions empower your business to stay ahead in the rapidly evolving digital landscape.
+
+
+
+ Learn about our AI solutions
+
+
+
+
+
+
+
+ );
+};
+
+export default HomePage;
\ No newline at end of file
diff --git a/app/page.tsx b/app/page.tsx
deleted file mode 100644
index 5705d4e..0000000
--- a/app/page.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import Image from "next/image";
-
-export default function Home() {
- return (
-
-
-
- Get started by editing
- app/page.tsx
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/app/services/page.jsx b/app/services/page.jsx
new file mode 100644
index 0000000..f6d1d29
--- /dev/null
+++ b/app/services/page.jsx
@@ -0,0 +1,85 @@
+import React from 'react';
+import Link from 'next/link';
+import { Cpu, Database, Cloud, Shield, Users, TrendingUp } from 'lucide-react';
+import { Button } from '@/components/ui/Button';
+
+const ServiceCard = ({ icon: Icon, title, description }) => (
+
+
+
+
{title}
+
{description}
+
+
+);
+
+const ServicesPage = () => {
+ const services = [
+ {
+ icon: Cpu,
+ title: "AI and Machine Learning",
+ description: "Leverage cutting-edge AI technologies to automate processes, gain insights, and drive innovation in your business."
+ },
+ {
+ icon: Database,
+ title: "Data Analytics",
+ description: "Transform your raw data into actionable insights with our advanced analytics solutions."
+ },
+ {
+ icon: Cloud,
+ title: "Cloud Migration",
+ description: "Seamlessly transition your infrastructure and applications to the cloud for improved scalability and efficiency."
+ },
+ {
+ icon: Shield,
+ title: "Cybersecurity",
+ description: "Protect your digital assets with our comprehensive cybersecurity services and solutions."
+ },
+ {
+ icon: Users,
+ title: "Digital Transformation",
+ description: "Modernize your business processes and customer experiences with our digital transformation strategies."
+ },
+ {
+ icon: TrendingUp,
+ title: "IT Strategy Consulting",
+ description: "Align your technology investments with your business goals to maximize ROI and drive growth."
+ }
+ ];
+
+ return (
+
+
+
+
+
+
+ Comprehensive IT Solutions for Canadian Businesses
+
+
+ At Techaro Computing Canada, we offer a wide range of services to help your business thrive in the digital age.
+
+
+
+ {services.map((service, index) => (
+
+ ))}
+
+
+
+
+ Contact Us for a Consultation
+
+
+
+
+
+
+ );
+};
+
+export default ServicesPage;
\ No newline at end of file
diff --git a/components/ui/Button.tsx b/components/ui/Button.tsx
new file mode 100644
index 0000000..cc8b253
--- /dev/null
+++ b/components/ui/Button.tsx
@@ -0,0 +1,49 @@
+import React from "react";
+import { cn } from "@/lib/utils";
+
+const buttonVariants = {
+ base: "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none",
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-10 px-4 py-2",
+ sm: "h-9 rounded-md px-3",
+ lg: "h-11 rounded-md px-8",
+ icon: "h-10 w-10",
+ },
+};
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes {
+ variant?: keyof typeof buttonVariants.variant;
+ size?: keyof typeof buttonVariants.size;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant = "default", size = "default", ...props }, ref) => {
+ return (
+
+ );
+ }
+);
+
+Button.displayName = "Button";
+
+export { Button, buttonVariants };
diff --git a/fly.toml b/fly.toml
new file mode 100644
index 0000000..3f24f4e
--- /dev/null
+++ b/fly.toml
@@ -0,0 +1,22 @@
+# fly.toml app configuration file generated for techaro on 2024-07-01T10:58:51-04:00
+#
+# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
+#
+
+app = 'techaro'
+primary_region = 'yul'
+
+[build]
+
+[http_service]
+ internal_port = 3000
+ force_https = true
+ auto_stop_machines = true
+ auto_start_machines = true
+ min_machines_running = 0
+ processes = ['app']
+
+[[vm]]
+ memory = '1gb'
+ cpu_kind = 'shared'
+ cpus = 1
diff --git a/lib/utils.ts b/lib/utils.ts
new file mode 100644
index 0000000..febecba
--- /dev/null
+++ b/lib/utils.ts
@@ -0,0 +1,8 @@
+type ClassValue = string | number | boolean | undefined | null;
+type ClassArray = ClassValue[];
+type ClassDictionary = Record;
+type ClassProp = ClassValue | ClassArray | ClassDictionary;
+
+export function cn(...inputs: ClassProp[]): string {
+ return inputs.flat().filter(Boolean).join(' ');
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index de34662..2a9de54 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,11 +8,13 @@
"name": "www",
"version": "0.1.0",
"dependencies": {
+ "lucide-react": "^0.399.0",
"next": "14.2.4",
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
+ "@flydotio/dockerfile": "^0.5.7",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
@@ -96,6 +98,39 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
+ "node_modules/@flydotio/dockerfile": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.5.7.tgz",
+ "integrity": "sha512-BVkXM2K/jLLYBFos1gT/bYv0YPJue8L4j0dkIsskJI4JRn6rPA9bZjT4sJzkzhdubZuwRGG9cgxj4Cfgt4lHlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "diff": "^5.1.0",
+ "ejs": "^3.1.9",
+ "shell-quote": "^1.8.1",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "dockerfile": "index.js"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@flydotio/dockerfile/node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@@ -951,6 +986,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/async": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -1163,6 +1205,61 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1397,6 +1494,16 @@
"dev": true,
"license": "Apache-2.0"
},
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -1437,6 +1544,22 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -1645,6 +1768,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -2168,6 +2301,39 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -2308,6 +2474,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
@@ -3122,6 +3298,25 @@
"@pkgjs/parseargs": "^0.11.0"
}
},
+ "node_modules/jake": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz",
+ "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jiti": {
"version": "1.21.6",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
@@ -3307,6 +3502,15 @@
"node": "14 || >=16.14"
}
},
+ "node_modules/lucide-react": {
+ "version": "0.399.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.399.0.tgz",
+ "integrity": "sha512-UyTNa3djBISdzL2UktgCrESXexQXaDQWi/WsDkbw6fBFfHlapajR58WoR+gxQ4laxfEyiHmoFrEIM3V+5XOVQg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4152,6 +4356,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -4380,6 +4594,16 @@
"node": ">=8"
}
},
+ "node_modules/shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
@@ -5238,6 +5462,16 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yaml": {
"version": "2.4.5",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
@@ -5251,6 +5485,57 @@
"node": ">= 14"
}
},
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 4403e37..418fc8b 100644
--- a/package.json
+++ b/package.json
@@ -9,18 +9,20 @@
"lint": "next lint"
},
"dependencies": {
+ "lucide-react": "^0.399.0",
+ "next": "14.2.4",
"react": "^18",
- "react-dom": "^18",
- "next": "14.2.4"
+ "react-dom": "^18"
},
"devDependencies": {
- "typescript": "^5",
+ "@flydotio/dockerfile": "^0.5.7",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
+ "eslint": "^8",
+ "eslint-config-next": "14.2.4",
"postcss": "^8",
"tailwindcss": "^3.4.1",
- "eslint": "^8",
- "eslint-config-next": "14.2.4"
+ "typescript": "^5"
}
}