feat: change homepage to tailwindui template

main
Carsten Kragelund 2023-07-29 16:56:27 +02:00
parent ca429aaccc
commit 937150696c
Signed by: nyx
GPG Key ID: CADDADEEC9F753C0
10 changed files with 966 additions and 17 deletions

10
Cargo.lock generated

@ -369,6 +369,8 @@ dependencies = [
"futures-util", "futures-util",
"include_dir", "include_dir",
"rapid-web", "rapid-web",
"serde",
"serde_json",
] ]
[[package]] [[package]]
@ -1856,18 +1858,18 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.177" version = "1.0.178"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a" checksum = "60363bdd39a7be0266a520dab25fdc9241d2f987b08a01e01f0ec6d06a981348"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.177" version = "1.0.178"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3" checksum = "f28482318d6641454cb273da158647922d1be6b5a2fcc6165cd89ebdd7ed576b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

@ -8,6 +8,8 @@ edition = "2021"
futures-util = "0.3.28" futures-util = "0.3.28"
include_dir = "0.7.3" include_dir = "0.7.3"
rapid-web = "0.4.7" rapid-web = "0.4.7"
serde = { version = "1.0.178", features = ["serde_derive", "derive"] }
serde_json = "1.0.104"
# Rapid binary # Rapid binary
[[bin]] [[bin]]

@ -0,0 +1,149 @@
"use client";
import { Fragment } from "react";
import { Popover, Transition } from "@headlessui/react";
import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline";
import Image from "next/image";
export type HeaderProps = {
navigation: { name: string; href: string }[];
};
export function Header({ navigation }: HeaderProps) {
return (
<Popover as="header" className="relative">
<div className="bg-gray-900 pt-6">
<nav
className="relative mx-auto flex max-w-7xl items-center justify-between px-6"
aria-label="Global"
>
<div className="flex flex-1 items-center">
<div className="flex w-full items-center justify-between md:w-auto">
<a href="#">
<span className="sr-only">Your Company</span>
<svg
className="h-8 w-auto sm:h-10"
viewBox="0 0 47 40"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill="url(#potato)"
d="M23.5 6.5C17.5 6.5 13.75 9.5 12.25 15.5C14.5 12.5 17.125 11.375 20.125 12.125C21.8367 12.5529 23.0601 13.7947 24.4142 15.1692C26.6202 17.4084 29.1734 20 34.75 20C40.75 20 44.5 17 46 11C43.75 14 41.125 15.125 38.125 14.375C36.4133 13.9471 35.1899 12.7053 33.8357 11.3308C31.6297 9.09158 29.0766 6.5 23.5 6.5ZM12.25 20C6.25 20 2.5 23 1 29C3.25 26 5.875 24.875 8.875 25.625C10.5867 26.0529 11.8101 27.2947 13.1642 28.6693C15.3702 30.9084 17.9234 33.5 23.5 33.5C29.5 33.5 33.25 30.5 34.75 24.5C32.5 27.5 29.875 28.625 26.875 27.875C25.1633 27.4471 23.9399 26.2053 22.5858 24.8307C20.3798 22.5916 17.8266 20 12.25 20Z"
/>
<defs>
<linearGradient
id="potato"
x1="33.999"
x2="1"
y1="16.181"
y2="16.181"
gradientUnits="userSpaceOnUse"
>
<stop stop-color="#22d3ee" />
<stop offset="1" stop-color="#99f6e4" />
</linearGradient>
</defs>
</svg>
</a>
<div className="-mr-2 flex items-center md:hidden">
<Popover.Button className="focus-ring-inset relative inline-flex items-center justify-center rounded-md bg-gray-900 p-2 text-gray-400 hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-white">
<span className="absolute -inset-0.5" />
<span className="sr-only">Open main menu</span>
<Bars3Icon className="h-6 w-6" aria-hidden="true" />
</Popover.Button>
</div>
</div>
<div className="hidden space-x-8 md:ml-10 md:flex">
{navigation.map((item) => (
<a
key={item.name}
href={item.href}
className="text-base font-medium text-white hover:text-gray-300"
>
{item.name}
</a>
))}
</div>
</div>
<div className="hidden md:flex md:items-center md:space-x-6">
<a
href="#"
className="text-base font-medium text-white hover:text-gray-300"
>
Log in
</a>
<a
href="#"
className="inline-flex items-center rounded-md border border-transparent bg-gray-600 px-4 py-2 text-base font-medium text-white hover:bg-gray-700"
>
Start free trial
</a>
</div>
</nav>
</div>
<Transition
as={Fragment}
enter="duration-150 ease-out"
enterFrom="opacity-0 scale-95"
enterTo="opacity-100 scale-100"
leave="duration-100 ease-in"
leaveFrom="opacity-100 scale-100"
leaveTo="opacity-0 scale-95"
>
<Popover.Panel
focus
className="absolute inset-x-0 top-0 origin-top transform p-2 transition md:hidden"
>
<div className="overflow-hidden rounded-lg bg-white shadow-md ring-1 ring-black ring-opacity-5">
<div className="flex items-center justify-between px-5 pt-4">
<div>
<Image
className="h-8 w-auto"
src="https://tailwindui.com/img/logos/mark.svg?from-color=teal&from-shade=500&to-color=cyan&to-shade=600&toShade=600"
alt=""
/>
</div>
<div className="-mr-2">
<Popover.Button className="relative inline-flex items-center justify-center rounded-md bg-white p-2 text-gray-400 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-cyan-600">
<span className="absolute -inset-0.5" />
<span className="sr-only">Close menu</span>
<XMarkIcon className="h-6 w-6" aria-hidden="true" />
</Popover.Button>
</div>
</div>
<div className="pb-6 pt-5">
<div className="space-y-1 px-2">
{navigation.map((item) => (
<a
key={item.name}
href={item.href}
className="block rounded-md px-3 py-2 text-base font-medium text-gray-900 hover:bg-gray-50"
>
{item.name}
</a>
))}
</div>
<div className="mt-6 px-5">
<a
href="#"
className="block w-full rounded-md bg-gradient-to-r from-teal-500 to-cyan-600 px-4 py-3 text-center font-medium text-white shadow hover:from-teal-600 hover:to-cyan-700"
>
Start free trial
</a>
</div>
<div className="mt-6 px-5">
<p className="text-center text-base font-medium text-gray-500">
Existing customer?{" "}
<a href="#" className="text-gray-900 hover:underline">
Login
</a>
</p>
</div>
</div>
</div>
</Popover.Panel>
</Transition>
</Popover>
);
}

@ -1,4 +1,5 @@
import { Metadata } from "next"; import { Metadata } from "next";
import "../styles/globals.css";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Rapid App with NextJS App-Router", title: "Rapid App with NextJS App-Router",

@ -1,23 +1,668 @@
import { Welcome, createBoltClient } from "@rapid-web/react"; import { createBoltClient } from "@rapid-web/react";
import { routes, Handlers } from "../pages/api/bindings"; import { routes, Handlers } from "../pages/api/bindings";
const bolt = createBoltClient<Handlers, typeof routes>(routes, { const bolt = createBoltClient<Handlers, typeof routes>(routes, {
transport: "http://localhost:8080", transport: "http://localhost:8080",
}); });
import {
ArrowPathIcon,
CloudArrowUpIcon,
CogIcon,
LockClosedIcon,
ServerIcon,
ShieldCheckIcon,
} from "@heroicons/react/24/outline";
import {
ArrowTopRightOnSquareIcon,
ChevronRightIcon,
} from "@heroicons/react/20/solid";
import { Header } from "./header";
import Image from "next/image";
const navigation = [
{ name: "Product", href: "#" },
{ name: "Features", href: "#" },
{ name: "Marketplace", href: "#" },
{ name: "Company", href: "#" },
];
const features = [
{
name: "Push to Deploy",
description:
"Ac tincidunt sapien vehicula erat auctor pellentesque rhoncus. Et magna sit morbi vitae lobortis.",
icon: CloudArrowUpIcon,
},
{
name: "SSL Certificates",
description:
"Qui aut temporibus nesciunt vitae dicta repellat sit dolores pariatur. Temporibus qui illum aut.",
icon: LockClosedIcon,
},
{
name: "Simple Queues",
description:
"Rerum quas incidunt deleniti quaerat suscipit mollitia. Amet repellendus ut odit dolores qui.",
icon: ArrowPathIcon,
},
{
name: "Advanced Security",
description:
"Ullam laboriosam est voluptatem maxime ut mollitia commodi. Et dignissimos suscipit perspiciatis.",
icon: ShieldCheckIcon,
},
{
name: "Powerful API",
description:
"Ab a facere voluptatem in quia corrupti veritatis aliquam. Veritatis labore quaerat ipsum quaerat id.",
icon: CogIcon,
},
{
name: "Database Backups",
description:
"Quia qui et est officia cupiditate qui consectetur. Ratione similique et impedit ea ipsum et.",
icon: ServerIcon,
},
];
const blogPosts = [
{
id: 1,
title: "Boost your conversion rate",
href: "#",
date: "Mar 16, 2020",
datetime: "2020-03-16",
category: { name: "Article", href: "#" },
imageUrl:
"https://images.unsplash.com/photo-1496128858413-b36217c2ce36?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1679&q=80",
preview:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Architecto accusantium praesentium eius, ut atque fuga culpa, similique sequi cum eos quis dolorum.",
author: {
name: "Roel Aufderehar",
imageUrl:
"https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80",
href: "#",
},
readingLength: "6 min",
},
{
id: 2,
title: "How to use search engine optimization to drive sales",
href: "#",
date: "Mar 10, 2020",
datetime: "2020-03-10",
category: { name: "Video", href: "#" },
imageUrl:
"https://images.unsplash.com/photo-1547586696-ea22b4d4235d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1679&q=80",
preview:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Velit facilis asperiores porro quaerat doloribus, eveniet dolore. Adipisci tempora aut inventore optio animi., tempore temporibus quo laudantium.",
author: {
name: "Brenna Goyette",
imageUrl:
"https://images.unsplash.com/photo-1550525811-e5869dd03032?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80",
href: "#",
},
readingLength: "4 min",
},
{
id: 3,
title: "Improve your customer experience",
href: "#",
date: "Feb 12, 2020",
datetime: "2020-02-12",
category: { name: "Case Study", href: "#" },
imageUrl:
"https://images.unsplash.com/photo-1492724441997-5dc865305da7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1679&q=80",
preview:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Sint harum rerum voluptatem quo recusandae magni placeat saepe molestiae, sed excepturi cumque corporis perferendis hic.",
author: {
name: "Daniela Metz",
imageUrl:
"https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80",
href: "#",
},
readingLength: "11 min",
},
];
const footerNavigation = {
solutions: [
{ name: "Marketing", href: "#" },
{ name: "Analytics", href: "#" },
{ name: "Commerce", href: "#" },
{ name: "Insights", href: "#" },
],
support: [
{ name: "Pricing", href: "#" },
{ name: "Documentation", href: "#" },
{ name: "Guides", href: "#" },
{ name: "API Status", href: "#" },
],
company: [
{ name: "About", href: "#" },
{ name: "Blog", href: "#" },
{ name: "Jobs", href: "#" },
{ name: "Press", href: "#" },
{ name: "Partners", href: "#" },
],
legal: [
{ name: "Claim", href: "#" },
{ name: "Privacy", href: "#" },
{ name: "Terms", href: "#" },
],
social: [
{
name: "Facebook",
href: "#",
icon: (props: Omit<React.SVGProps<SVGElement>, "ref">) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<path
fillRule="evenodd"
d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z"
clipRule="evenodd"
/>
</svg>
),
},
{
name: "Instagram",
href: "#",
icon: (props: Omit<React.SVGProps<SVGElement>, "ref">) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<path
fillRule="evenodd"
d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"
clipRule="evenodd"
/>
</svg>
),
},
{
name: "Twitter",
href: "#",
icon: (props: Omit<React.SVGProps<SVGElement>, "ref">) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<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 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" />
</svg>
),
},
{
name: "GitHub",
href: "#",
icon: (props: Omit<React.SVGProps<SVGElement>, "ref">) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<path
fillRule="evenodd"
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 0112 6.844c.85.004 1.705.115 2.504.337 1.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.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clipRule="evenodd"
/>
</svg>
),
},
{
name: "Dribbble",
href: "#",
icon: (props: Omit<React.SVGProps<SVGElement>, "ref">) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<path
fillRule="evenodd"
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10c5.51 0 10-4.48 10-10S17.51 2 12 2zm6.605 4.61a8.502 8.502 0 011.93 5.314c-.281-.054-3.101-.629-5.943-.271-.065-.141-.12-.293-.184-.445a25.416 25.416 0 00-.564-1.236c3.145-1.28 4.577-3.124 4.761-3.362zM12 3.475c2.17 0 4.154.813 5.662 2.148-.152.216-1.443 1.941-4.48 3.08-1.399-2.57-2.95-4.675-3.189-5A8.687 8.687 0 0112 3.475zm-3.633.803a53.896 53.896 0 013.167 4.935c-3.992 1.063-7.517 1.04-7.896 1.04a8.581 8.581 0 014.729-5.975zM3.453 12.01v-.26c.37.01 4.512.065 8.775-1.215.25.477.477.965.694 1.453-.109.033-.228.065-.336.098-4.404 1.42-6.747 5.303-6.942 5.629a8.522 8.522 0 01-2.19-5.705zM12 20.547a8.482 8.482 0 01-5.239-1.8c.152-.315 1.888-3.656 6.703-5.337.022-.01.033-.01.054-.022a35.318 35.318 0 011.823 6.475 8.4 8.4 0 01-3.341.684zm4.761-1.465c-.086-.52-.542-3.015-1.659-6.084 2.679-.423 5.022.271 5.314.369a8.468 8.468 0 01-3.655 5.715z"
clipRule="evenodd"
/>
</svg>
),
},
],
};
export default async function Home() { export default async function Home() {
const { data: title } = await bolt("hello").get(routes.hello); const {
data: { plain, colored },
} = await bolt("hello").get(routes.hello);
const { data: message } = await bolt("echo").post( const { data: message } = await bolt("echo").post(
routes.echo, routes.echo,
"Hello from the client!" "Anim aute id magna aliqua ad ad non deserunt sunt. Quiirure qui Lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat."
); );
return ( return (
<main> <div className="bg-white">
<Welcome> <div className="relative overflow-hidden">
<p className="mt-4">{title}</p> <Header navigation={navigation} />
<span>The server replied: {message}</span> <main>
</Welcome> <div className="bg-gray-900 pt-10 sm:pt-16 lg:overflow-hidden lg:pb-14 lg:pt-8">
</main> <div className="mx-auto max-w-7xl lg:px-8">
<div className="lg:grid lg:grid-cols-2 lg:gap-8">
<div className="mx-auto max-w-md px-6 sm:max-w-2xl sm:text-center lg:flex lg:items-center lg:px-0 lg:text-left">
<div className="lg:py-24">
<a
href="#"
className="inline-flex items-center rounded-full bg-black p-1 pr-2 text-white hover:text-gray-200 sm:text-base lg:text-sm xl:text-base"
>
<span className="rounded-full bg-gradient-to-r from-teal-500 to-cyan-600 px-3 py-0.5 text-sm font-semibold leading-5 text-white">
We&apos;re hiring
</span>
<span className="ml-4 text-sm">
Visit our careers page
</span>
<ChevronRightIcon
className="ml-2 h-5 w-5 text-gray-500"
aria-hidden="true"
/>
</a>
<h1 className="mt-4 text-4xl font-bold tracking-tight text-white sm:mt-5 sm:text-6xl lg:mt-6 xl:text-6xl">
<span className="block">{plain}</span>
<span className="block bg-gradient-to-r from-teal-200 to-cyan-400 bg-clip-text pb-3 text-transparent sm:pb-5">
{colored}
</span>
</h1>
<p className="text-base text-gray-300 sm:text-xl lg:text-lg xl:text-xl">
{message}
</p>
<div className="mt-10 sm:mt-12">
<form
action="#"
className="sm:mx-auto sm:max-w-xl lg:mx-0"
>
<div className="sm:flex">
<div className="min-w-0 flex-1">
<label htmlFor="email" className="sr-only">
Email address
</label>
<input
id="email"
type="email"
placeholder="Enter your email"
className="block w-full rounded-md border-0 px-4 py-3 text-base text-gray-900 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-cyan-400 focus:ring-offset-2 focus:ring-offset-gray-900"
/>
</div>
<div className="mt-3 sm:ml-3 sm:mt-0">
<button
type="submit"
className="block w-full rounded-md bg-gradient-to-r from-teal-500 to-cyan-600 px-4 py-3 font-medium text-white shadow hover:from-teal-600 hover:to-cyan-700 focus:outline-none focus:ring-2 focus:ring-cyan-400 focus:ring-offset-2 focus:ring-offset-gray-900"
>
Start free trial
</button>
</div>
</div>
<p className="mt-3 text-sm text-gray-300 sm:mt-4">
Start your free 14-day trial, no credit card
necessary. By providing your email, you agree to our{" "}
<a href="#" className="font-medium text-white">
terms of service
</a>
.
</p>
</form>
</div>
</div>
</div>
<div className="-mb-16 mt-12 sm:-mb-48 lg:relative lg:m-0">
<div className="mx-auto max-w-md px-6 sm:max-w-2xl lg:max-w-none lg:px-0">
{/* Illustration taken from Lucid Illustrations: https://lucid.pixsellz.io/ */}
<Image
className="w-full lg:absolute lg:inset-y-0 lg:left-0 lg:h-full lg:w-auto lg:max-w-none"
src="https://tailwindui.com/img/component-images/cloud-illustration-teal-cyan.svg"
alt=""
/>
</div>
</div>
</div>
</div>
</div>
{/* Feature section with screenshot */}
<div className="relative bg-gray-50 pt-16 sm:pt-24 lg:pt-32">
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
<div>
<h2 className="text-lg font-semibold text-cyan-600">
Serverless
</h2>
<p className="mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
No server? No problem.
</p>
<p className="mx-auto mt-5 max-w-prose text-xl text-gray-500">
Phasellus lorem quam molestie id quisque diam aenean nulla in.
Accumsan in quis quis nunc, ullamcorper malesuada. Eleifend
condimentum id viverra nulla.
</p>
</div>
<div className="-mb-10 mt-12 sm:-mb-24 lg:-mb-80">
<Image
className="rounded-lg shadow-xl ring-1 ring-black ring-opacity-5"
src="https://tailwindui.com/img/component-images/green-project-app-screenshot.jpg"
alt=""
/>
</div>
</div>
</div>
{/* Feature section with grid */}
<div className="relative bg-white py-16 sm:py-24 lg:py-32">
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
<h2 className="text-lg font-semibold text-cyan-600">
Deploy faster
</h2>
<p className="mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
Everything you need to deploy your app
</p>
<p className="mx-auto mt-5 max-w-prose text-xl text-gray-500">
Phasellus lorem quam molestie id quisque diam aenean nulla in.
Accumsan in quis quis nunc, ullamcorper malesuada. Eleifend
condimentum id viverra nulla.
</p>
<div className="mt-12">
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3">
{features.map((feature) => (
<div key={feature.name} className="pt-6">
<div className="flow-root rounded-lg bg-gray-50 px-6 pb-8">
<div className="-mt-6">
<div>
<span className="inline-flex items-center justify-center rounded-md bg-gradient-to-r from-teal-500 to-cyan-600 p-3 shadow-lg">
<feature.icon
className="h-6 w-6 text-white"
aria-hidden="true"
/>
</span>
</div>
<h3 className="mt-8 text-lg font-medium tracking-tight text-gray-900">
{feature.name}
</h3>
<p className="mt-5 text-base text-gray-500">
{feature.description}
</p>
</div>
</div>
</div>
))}
</div>
</div>
</div>
</div>
{/* Testimonial section */}
<div className="bg-gradient-to-r from-teal-500 to-cyan-600 pb-16 lg:relative lg:z-10 lg:pb-0">
<div className="lg:mx-auto lg:grid lg:max-w-7xl lg:grid-cols-3 lg:gap-8 lg:px-8">
<div className="relative lg:-my-8">
<div
aria-hidden="true"
className="absolute inset-x-0 top-0 h-1/2 bg-white lg:hidden"
/>
<div className="mx-auto max-w-md px-6 sm:max-w-3xl lg:h-full lg:p-0">
<div className="aspect-h-6 aspect-w-10 overflow-hidden rounded-xl shadow-xl sm:aspect-h-7 sm:aspect-w-16 lg:aspect-none lg:h-full">
<Image
className="object-cover lg:h-full lg:w-full"
src="https://images.unsplash.com/photo-1520333789090-1afc82db536a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2102&q=80"
alt=""
/>
</div>
</div>
</div>
<div className="mt-12 lg:col-span-2 lg:m-0 lg:pl-8">
<div className="mx-auto max-w-md px-6 sm:max-w-2xl lg:max-w-none lg:px-0 lg:py-20">
<blockquote>
<div>
<svg
className="h-12 w-12 text-white opacity-25"
fill="currentColor"
viewBox="0 0 32 32"
aria-hidden="true"
>
<path d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" />
</svg>
<p className="mt-6 text-2xl font-medium text-white">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed urna nulla vitae laoreet augue. Amet feugiat est
integer dolor auctor adipiscing nunc urna, sit.
</p>
</div>
<footer className="mt-6">
<p className="text-base font-medium text-white">
Judith Black
</p>
<p className="text-base font-medium text-cyan-100">
CEO at PureInsights
</p>
</footer>
</blockquote>
</div>
</div>
</div>
</div>
{/* Blog section */}
<div className="relative bg-gray-50 py-16 sm:py-24 lg:py-32">
<div className="relative">
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
<h2 className="text-lg font-semibold text-cyan-600">Learn</h2>
<p className="mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
Helpful Resources
</p>
<p className="mx-auto mt-5 max-w-prose text-xl text-gray-500">
Phasellus lorem quam molestie id quisque diam aenean nulla in.
Accumsan in quis quis nunc, ullamcorper malesuada. Eleifend
condimentum id viverra nulla.
</p>
</div>
<div className="mx-auto mt-12 grid max-w-md gap-8 px-6 sm:max-w-lg lg:max-w-7xl lg:grid-cols-3 lg:px-8">
{blogPosts.map((post) => (
<div
key={post.id}
className="flex flex-col overflow-hidden rounded-lg shadow-lg"
>
<div className="flex-shrink-0">
<Image
className="h-48 w-full object-cover"
src={post.imageUrl}
alt=""
/>
</div>
<div className="flex flex-1 flex-col justify-between bg-white p-6">
<div className="flex-1">
<p className="text-sm font-medium text-cyan-600">
<a
href={post.category.href}
className="hover:underline"
>
{post.category.name}
</a>
</p>
<a href={post.href} className="mt-2 block">
<p className="text-xl font-semibold text-gray-900">
{post.title}
</p>
<p className="mt-3 text-base text-gray-500">
{post.preview}
</p>
</a>
</div>
<div className="mt-6 flex items-center">
<div className="flex-shrink-0">
<a href={post.author.href}>
<Image
className="h-10 w-10 rounded-full"
src={post.author.imageUrl}
alt={post.author.name}
/>
</a>
</div>
<div className="ml-3">
<p className="text-sm font-medium text-gray-900">
<a
href={post.author.href}
className="hover:underline"
>
{post.author.name}
</a>
</p>
<div className="flex space-x-1 text-sm text-gray-500">
<time dateTime={post.datetime}>{post.date}</time>
<span aria-hidden="true">&middot;</span>
<span>{post.readingLength} read</span>
</div>
</div>
</div>
</div>
</div>
))}
</div>
</div>
</div>
{/* CTA Section */}
<div className="relative bg-gray-900">
<div className="relative h-56 bg-indigo-600 sm:h-72 md:absolute md:left-0 md:h-full md:w-1/2">
<Image
className="h-full w-full object-cover"
src="https://images.unsplash.com/photo-1525130413817-d45c1d127c42?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1920&q=60&sat=-100"
alt=""
/>
<div
aria-hidden="true"
className="absolute inset-0 bg-gradient-to-r from-teal-500 to-cyan-600 mix-blend-multiply"
/>
</div>
<div className="relative mx-auto max-w-md px-6 py-12 sm:max-w-7xl sm:py-20 md:py-28 lg:px-8 lg:py-32">
<div className="md:ml-auto md:w-1/2 md:pl-10">
<h2 className="text-lg font-semibold text-gray-300">
Award winning support
</h2>
<p className="mt-2 text-3xl font-bold tracking-tight text-white sm:text-4xl">
Were here to help
</p>
<p className="mt-3 text-lg text-gray-300">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Et,
egestas tempus tellus etiam sed. Quam a scelerisque amet
ullamcorper eu enim et fermentum, augue. Aliquet amet volutpat
quisque ut interdum tincidunt duis.
</p>
<div className="mt-8">
<div className="inline-flex rounded-md shadow">
<a
href="#"
className="inline-flex items-center justify-center rounded-md border border-transparent bg-white px-5 py-3 text-base font-medium text-gray-900 hover:bg-gray-50"
>
Visit the help center
<ArrowTopRightOnSquareIcon
className="-mr-1 ml-3 h-5 w-5 text-gray-400"
aria-hidden="true"
/>
</a>
</div>
</div>
</div>
</div>
</div>
</main>
<footer className="bg-gray-50" aria-labelledby="footer-heading">
<h2 id="footer-heading" className="sr-only">
Footer
</h2>
<div className="mx-auto max-w-md px-6 pt-12 sm:max-w-7xl lg:px-8 lg:pt-16">
<div className="xl:grid xl:grid-cols-3 xl:gap-8">
<div className="space-y-8 xl:col-span-1">
<Image
className="h-10"
src="https://tailwindui.com/img/logos/mark.svg?color=gray&shade=300"
alt="Company name"
/>
<p className="text-base text-gray-500">
Making the world a better place through constructing elegant
hierarchies.
</p>
<div className="flex space-x-6">
{footerNavigation.social.map((item) => (
<a
key={item.name}
href={item.href}
className="text-gray-400 hover:text-gray-500"
>
<span className="sr-only">{item.name}</span>
<item.icon className="h-6 w-6" aria-hidden="true" />
</a>
))}
</div>
</div>
<div className="mt-12 grid grid-cols-2 gap-8 xl:col-span-2 xl:mt-0">
<div className="md:grid md:grid-cols-2 md:gap-8">
<div>
<h3 className="text-base font-medium text-gray-900">
Solutions
</h3>
<ul role="list" className="mt-4 space-y-4">
{footerNavigation.solutions.map((item) => (
<li key={item.name}>
<a
href={item.href}
className="text-base text-gray-500 hover:text-gray-900"
>
{item.name}
</a>
</li>
))}
</ul>
</div>
<div className="mt-12 md:mt-0">
<h3 className="text-base font-medium text-gray-900">
Support
</h3>
<ul role="list" className="mt-4 space-y-4">
{footerNavigation.support.map((item) => (
<li key={item.name}>
<a
href={item.href}
className="text-base text-gray-500 hover:text-gray-900"
>
{item.name}
</a>
</li>
))}
</ul>
</div>
</div>
<div className="md:grid md:grid-cols-2 md:gap-8">
<div>
<h3 className="text-base font-medium text-gray-900">
Company
</h3>
<ul role="list" className="mt-4 space-y-4">
{footerNavigation.company.map((item) => (
<li key={item.name}>
<a
href={item.href}
className="text-base text-gray-500 hover:text-gray-900"
>
{item.name}
</a>
</li>
))}
</ul>
</div>
<div className="mt-12 md:mt-0">
<h3 className="text-base font-medium text-gray-900">
Legal
</h3>
<ul role="list" className="mt-4 space-y-4">
{footerNavigation.legal.map((item) => (
<li key={item.name}>
<a
href={item.href}
className="text-base text-gray-500 hover:text-gray-900"
>
{item.name}
</a>
</li>
))}
</ul>
</div>
</div>
</div>
</div>
<div className="mt-12 border-t border-gray-200 py-8">
<p className="text-base text-gray-400 xl:text-center">
&copy; 2020 Your Company, Inc. All rights reserved.
</p>
</div>
</div>
</footer>
</div>
</div>
); );
} }

125
package-lock.json generated

@ -8,6 +8,8 @@
"name": "rapid-nextjs-testing", "name": "rapid-nextjs-testing",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@heroicons/react": "^2.0.18",
"@icons-pack/react-simple-icons": "^8.0.1",
"@rapid-web/react": "^0.2.4", "@rapid-web/react": "^0.2.4",
"@types/node": "20.4.2", "@types/node": "20.4.2",
"@types/react": "18.2.15", "@types/react": "18.2.15",
@ -24,10 +26,13 @@
}, },
"devDependencies": { "devDependencies": {
"@rapid-web/ui": "^0.2.2", "@rapid-web/ui": "^0.2.2",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.4",
"concurrently": "^8.2.0", "concurrently": "^8.2.0",
"eslint-config-prettier": "^8.9.0", "eslint-config-prettier": "^8.9.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"prettier-plugin-rust": "^0.1.9", "prettier-plugin-rust": "^0.1.9",
"prettier-plugin-tailwindcss": "^0.4.1",
"prettier-plugin-toml": "^0.3.1", "prettier-plugin-toml": "^0.3.1",
"rimraf": "^5.0.1" "rimraf": "^5.0.1"
} }
@ -175,6 +180,14 @@
"react-dom": "^16 || ^17 || ^18" "react-dom": "^16 || ^17 || ^18"
} }
}, },
"node_modules/@heroicons/react": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz",
"integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==",
"peerDependencies": {
"react": ">= 16"
}
},
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.10", "version": "0.11.10",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
@ -205,6 +218,14 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
}, },
"node_modules/@icons-pack/react-simple-icons": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@icons-pack/react-simple-icons/-/react-simple-icons-8.0.1.tgz",
"integrity": "sha512-lCdPSp+EFJKDabwQ16pQsTJKViwGa8naoYAnL0IpxQvl7E1CeQ7Z84BbJWhIustrrdNIZwcyuKg+ClPi7BXFWw==",
"peerDependencies": {
"react": "^16.13 || ^17 || ^18"
}
},
"node_modules/@isaacs/cliui": { "node_modules/@isaacs/cliui": {
"version": "8.0.2", "version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@ -591,6 +612,27 @@
"tslib": "^2.4.0" "tslib": "^2.4.0"
} }
}, },
"node_modules/@tailwindcss/aspect-ratio": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.2.tgz",
"integrity": "sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==",
"dev": true,
"peerDependencies": {
"tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1"
}
},
"node_modules/@tailwindcss/forms": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.4.tgz",
"integrity": "sha512-YAm12D3R7/9Mh4jFbYSMnsd6jG++8KxogWgqs7hbdo/86aWjjlIEvL7+QYdVELmAI0InXTpZqFIg5e7aDVWI2Q==",
"dev": true,
"dependencies": {
"mini-svg-data-uri": "^1.2.3"
},
"peerDependencies": {
"tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
}
},
"node_modules/@toml-tools/lexer": { "node_modules/@toml-tools/lexer": {
"version": "0.3.1", "version": "0.3.1",
"resolved": "https://registry.npmjs.org/@toml-tools/lexer/-/lexer-0.3.1.tgz", "resolved": "https://registry.npmjs.org/@toml-tools/lexer/-/lexer-0.3.1.tgz",
@ -3244,6 +3286,15 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/mini-svg-data-uri": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
"integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
"dev": true,
"bin": {
"mini-svg-data-uri": "cli.js"
}
},
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@ -3890,6 +3941,80 @@
"prettier": "^2.7.1" "prettier": "^2.7.1"
} }
}, },
"node_modules/prettier-plugin-tailwindcss": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.4.1.tgz",
"integrity": "sha512-hwn2EiJmv8M+AW4YDkbjJ6HlZCTzLyz1QlySn9sMuKV/Px0fjwldlB7tol8GzdgqtkdPtzT3iJ4UzdnYXP25Ag==",
"dev": true,
"engines": {
"node": ">=12.17.0"
},
"peerDependencies": {
"@ianvs/prettier-plugin-sort-imports": "*",
"@prettier/plugin-pug": "*",
"@shopify/prettier-plugin-liquid": "*",
"@shufo/prettier-plugin-blade": "*",
"@trivago/prettier-plugin-sort-imports": "*",
"prettier": "^2.2 || ^3.0",
"prettier-plugin-astro": "*",
"prettier-plugin-css-order": "*",
"prettier-plugin-import-sort": "*",
"prettier-plugin-jsdoc": "*",
"prettier-plugin-marko": "*",
"prettier-plugin-organize-attributes": "*",
"prettier-plugin-organize-imports": "*",
"prettier-plugin-style-order": "*",
"prettier-plugin-svelte": "*",
"prettier-plugin-twig-melody": "*"
},
"peerDependenciesMeta": {
"@ianvs/prettier-plugin-sort-imports": {
"optional": true
},
"@prettier/plugin-pug": {
"optional": true
},
"@shopify/prettier-plugin-liquid": {
"optional": true
},
"@shufo/prettier-plugin-blade": {
"optional": true
},
"@trivago/prettier-plugin-sort-imports": {
"optional": true
},
"prettier-plugin-astro": {
"optional": true
},
"prettier-plugin-css-order": {
"optional": true
},
"prettier-plugin-import-sort": {
"optional": true
},
"prettier-plugin-jsdoc": {
"optional": true
},
"prettier-plugin-marko": {
"optional": true
},
"prettier-plugin-organize-attributes": {
"optional": true
},
"prettier-plugin-organize-imports": {
"optional": true
},
"prettier-plugin-style-order": {
"optional": true
},
"prettier-plugin-svelte": {
"optional": true
},
"prettier-plugin-twig-melody": {
"optional": true
}
}
},
"node_modules/prettier-plugin-toml": { "node_modules/prettier-plugin-toml": {
"version": "0.3.1", "version": "0.3.1",
"resolved": "https://registry.npmjs.org/prettier-plugin-toml/-/prettier-plugin-toml-0.3.1.tgz", "resolved": "https://registry.npmjs.org/prettier-plugin-toml/-/prettier-plugin-toml-0.3.1.tgz",

@ -16,6 +16,8 @@
"clean@rust": "cargo clean" "clean@rust": "cargo clean"
}, },
"dependencies": { "dependencies": {
"@heroicons/react": "^2.0.18",
"@icons-pack/react-simple-icons": "^8.0.1",
"@rapid-web/react": "^0.2.4", "@rapid-web/react": "^0.2.4",
"@types/node": "20.4.2", "@types/node": "20.4.2",
"@types/react": "18.2.15", "@types/react": "18.2.15",
@ -32,10 +34,13 @@
}, },
"devDependencies": { "devDependencies": {
"@rapid-web/ui": "^0.2.2", "@rapid-web/ui": "^0.2.2",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.4",
"concurrently": "^8.2.0", "concurrently": "^8.2.0",
"eslint-config-prettier": "^8.9.0", "eslint-config-prettier": "^8.9.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"prettier-plugin-rust": "^0.1.9", "prettier-plugin-rust": "^0.1.9",
"prettier-plugin-tailwindcss": "^0.4.1",
"prettier-plugin-toml": "^0.3.1", "prettier-plugin-toml": "^0.3.1",
"rimraf": "^5.0.1" "rimraf": "^5.0.1"
} }

@ -9,7 +9,7 @@ export interface Handlers {
}, },
"hello": { "hello": {
output: string output: HelloResponse
type: 'query' type: 'query'
isDynamic: false isDynamic: false
}, },
@ -36,4 +36,9 @@ export const routes = {
url: '/echo', url: '/echo',
type: 'post', type: 'post',
}, },
} as const } as const
export interface HelloResponse {
plain: string;
colored: string;
}

@ -1,10 +1,20 @@
use rapid_web::actix::HttpResponse; use rapid_web::actix::HttpResponse;
use rapid_web::rapid_web_codegen::rapid_handler; use rapid_web::rapid_web_codegen::rapid_handler;
use serde::{ Serialize, Deserialize };
pub const ROUTE_KEY: &str = "hello"; pub const ROUTE_KEY: &str = "hello";
pub type RapidOutput = String; pub type RapidOutput = HelloResponse;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct HelloResponse {
plain: String,
colored: String,
}
#[rapid_handler] #[rapid_handler]
pub async fn query() -> HttpResponse { pub async fn query() -> HttpResponse {
HttpResponse::Ok().body("Hello from a RAPID rust endpoint!") HttpResponse::Ok().json(HelloResponse {
plain: "Rapid, Rust powered NextJS for".to_string(),
colored: "a faster web!".to_string(),
})
} }

@ -4,11 +4,14 @@ import {
rapidTailwindTheme, rapidTailwindTheme,
rapidPlugin, rapidPlugin,
} from "@rapid-web/ui"; } from "@rapid-web/ui";
import tailwindForms from "@tailwindcss/forms"
import tailwindAspect from "@tailwindcss/aspect-ratio"
// Use this as your template paths directory if using nextjs app dir: "./app/**/*.{js,ts,jsx,tsx,mdx}", // Use this as your template paths directory if using nextjs app dir: "./app/**/*.{js,ts,jsx,tsx,mdx}",
export default { export default {
content: [ content: [
"./app/**/*.{js,ts,jsx,tsx}",
"./pages/**/*.{js,ts,jsx,tsx}", "./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}",
rapidStylesPath, rapidStylesPath,
@ -19,6 +22,8 @@ export default {
}), }),
}, },
plugins: [ plugins: [
tailwindForms({}),
tailwindAspect,
rapidPlugin({ rapidPlugin({
// Configure global styles variants here (documentation coming soon) // Configure global styles variants here (documentation coming soon)
global: {}, global: {},