Merge branch 'develop' of ssh://gitea.gofwd.group:2225/dstrawsb/ballistic-builder into develop

This commit is contained in:
2024-12-13 15:41:05 -05:00
5 changed files with 349 additions and 48 deletions

View File

@@ -1,37 +1,106 @@
import { ChevronDownIcon } from "@heroicons/react/20/solid";
import { getPSA, getLowerBuildKits, getGrips } from "@queries/PSA";
import { psa } from "@db/schema/Psa";
import partTypes from "src/data/parts_cats.json";
export default async function BuilderPage() {
export default function BuilderPage() { const psa = await getGrips();
return ( return (
<div className="container mx-auto "> <div className="p-4 sm:p-6 lg:p-8">
<table className="table-auto border-separate border-spacing-2 border border-slate-500 text-gray-900"> <div className="sm:flex sm:items-center">
<div className="sm:flex-auto">
<h1 className="text-base font-semibold text-gray-900">Users</h1>
<p className="mt-2 text-sm text-gray-700">
A list of all the Grips We Could Find{" "}
</p>
</div>
</div>
<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> <thead>
<tr> <tr>
<th>Component</th> <th
<th>Selection</th> scope="col"
<th>Base Price</th> className="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 "
<th>Sale Price</th> >
<th>Shipping</th> <a href="#" className="group inline-flex">
<th>Tax</th> Component
<th>Total Price</th> <span className="invisible ml-2 flex-none rounded text-gray-400 group-hover:visible group-focus:visible">
<th>Source</th> <ChevronDownIcon
<th>Order</th> aria-hidden="true"
className="size-5"
/>
</span>
</a>
</th>
<th
scope="col"
className="px-3 py-3.5 text-left text-sm font-semibold text-gray-900"
>
<a href="#" className="group inline-flex">
Manufacturer
<span className="ml-2 flex-none rounded bg-gray-100 text-gray-900 group-hover:bg-gray-200">
<ChevronDownIcon
aria-hidden="true"
className="size-5"
/>
</span>
</a>
</th>
<th
scope="col"
className="px-3 py-3.5 text-left text-sm font-semibold text-gray-900"
>
<a href="#" className="group inline-flex">
Price
<span className="invisible ml-2 flex-none rounded text-gray-400 group-hover:visible group-focus:visible">
<ChevronDownIcon
aria-hidden="true"
className="invisible ml-2 size-5 flex-none rounded text-gray-400 group-hover:visible group-focus:visible"
/>
</span>
</a>
</th>
<th
scope="col"
className="px-3 py-3.5 text-left text-sm font-semibold text-gray-900"
>
<a href="#" className="group inline-flex">
Purchase
<span className="invisible ml-2 flex-none rounded text-gray-400 group-hover:visible group-focus:visible">
<ChevronDownIcon
aria-hidden="true"
className="invisible ml-2 size-5 flex-none rounded text-gray-400 group-hover:visible group-focus:visible"
/>
</span>
</a>
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody className=" divide-y divide-gray-200 bg-white">
<tr> {psa.map((psa) => (
<td>Part 1</td> <tr key={psa.upc}>
<td>Part</td> <td className="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 ">
<td>99.99</td> {psa.productName}
<td>89.99</td> </td>
<td>12.99</td> <td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
<td></td> {psa.brandName}
<td>Palmetto State</td> </td>
<td>101.99</td> <td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
<td><button>Buy Item</button></td> {psa.retailPrice}
</td>
<td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
{psa.salePrice}
</td>
</tr> </tr>
))}
</tbody> </tbody>
</table> </table>
</div> </div>
</div>
</div>
</div>
); );
} }

View File

@@ -1,10 +1,4 @@
import About from "@components/site/About"; import Newsletter from "@src/components/newsletter";
import Contact from "@components/site/Contact";
import FeaturesSection from "@components/FeaturesSection";
import Footer from "@components/site/Footer";
import Header from "@components/Header";
import Hero from "@components/Hero";
import { ChevronRightIcon } from "@heroicons/react/24/outline";
export default async function Home() { export default async function Home() {
return ( return (
@@ -46,10 +40,11 @@ export default async function Home() {
<div className="mt-10 flex items-top gap-x-6"> <div className="mt-10 flex items-top gap-x-6">
<a <a
href="#" href="#"
className="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" className="up rounded-md bg-lime-800 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-lime-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
> >
Get started Get Building
</a> </a>
</div> </div>
</div> </div>
<div className="mt-16 sm:mt-24 alignlg:mt-0 lg:shrink-0 lg:grow items-top"> <div className="mt-16 sm:mt-24 alignlg:mt-0 lg:shrink-0 lg:grow items-top">
@@ -57,6 +52,8 @@ export default async function Home() {
</div> </div>
</div> </div>
</div> </div>
<Newsletter />
</div> </div>
); );
} }

View File

@@ -67,13 +67,12 @@ const navigation = {
}, },
{ {
id: "brands", id: "brands",
name: "Brands", name: "Top Selling Brands",
items: [ items: [
{ name: "Full Nelson", href: "#" }, { name: "Radian Weapons", href: "#" },
{ name: "My Way", href: "#" }, { name: "Noveske", href: "#" },
{ name: "Re-Arranged", href: "#" }, { name: "Aero Precision", href: "#" },
{ name: "Counterfeit", href: "#" }, { name: "Primary Arms", href: "#" },
{ name: "Significant Other", href: "#" },
], ],
}, },
], ],

View File

@@ -0,0 +1,195 @@
const navigation = {
solutions: [
{ name: 'Marketing', href: '#' },
{ name: 'Analytics', href: '#' },
{ name: 'Automation', href: '#' },
{ name: 'Commerce', href: '#' },
{ name: 'Insights', href: '#' },
],
support: [
{ name: 'Submit ticket', href: '#' },
{ name: 'Documentation', href: '#' },
{ name: 'Guides', href: '#' },
],
company: [
{ name: 'About', href: '#' },
{ name: 'Blog', href: '#' },
{ name: 'Jobs', href: '#' },
{ name: 'Press', href: '#' },
],
legal: [
{ name: 'Terms of service', href: '#' },
{ name: 'Privacy policy', href: '#' },
{ name: 'License', href: '#' },
],
social: [
{
name: 'Facebook',
href: '#',
icon: (props) => (
<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) => (
<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: 'X',
href: '#',
icon: (props) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<path d="M13.6823 10.6218L20.2391 3H18.6854L12.9921 9.61788L8.44486 3H3.2002L10.0765 13.0074L3.2002 21H4.75404L10.7663 14.0113L15.5685 21H20.8131L13.6819 10.6218H13.6823ZM11.5541 13.0956L10.8574 12.0991L5.31391 4.16971H7.70053L12.1742 10.5689L12.8709 11.5655L18.6861 19.8835H16.2995L11.5541 13.096V13.0956Z" />
</svg>
),
},
{
name: 'GitHub',
href: '#',
icon: (props) => (
<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: 'YouTube',
href: '#',
icon: (props) => (
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
<path
fillRule="evenodd"
d="M19.812 5.418c.861.23 1.538.907 1.768 1.768C21.998 8.746 22 12 22 12s0 3.255-.418 4.814a2.504 2.504 0 0 1-1.768 1.768c-1.56.419-7.814.419-7.814.419s-6.255 0-7.814-.419a2.505 2.505 0 0 1-1.768-1.768C2 15.255 2 12 2 12s0-3.255.417-4.814a2.507 2.507 0 0 1 1.768-1.768C5.744 5 11.998 5 11.998 5s6.255 0 7.814.418ZM15.194 12 10 15V9l5.194 3Z"
clipRule="evenodd"
/>
</svg>
),
},
],
}
export default function Footer() {
return (
<footer className="bg-gray-900">
<div className="mx-auto max-w-7xl px-6 pb-8 pt-20 sm:pt-24 lg:px-8 lg:pt-32">
<div className="xl:grid xl:grid-cols-3 xl:gap-8">
<div className="grid grid-cols-2 gap-8 xl:col-span-2">
<div className="md:grid md:grid-cols-2 md:gap-8">
<div>
<h3 className="text-sm/6 font-semibold text-white">Solutions</h3>
<ul role="list" className="mt-6 space-y-4">
{navigation.solutions.map((item) => (
<li key={item.name}>
<a href={item.href} className="text-sm/6 text-gray-400 hover:text-white">
{item.name}
</a>
</li>
))}
</ul>
</div>
<div className="mt-10 md:mt-0">
<h3 className="text-sm/6 font-semibold text-white">Support</h3>
<ul role="list" className="mt-6 space-y-4">
{navigation.support.map((item) => (
<li key={item.name}>
<a href={item.href} className="text-sm/6 text-gray-400 hover:text-white">
{item.name}
</a>
</li>
))}
</ul>
</div>
</div>
<div className="md:grid md:grid-cols-2 md:gap-8">
<div>
<h3 className="text-sm/6 font-semibold text-white">Company</h3>
<ul role="list" className="mt-6 space-y-4">
{navigation.company.map((item) => (
<li key={item.name}>
<a href={item.href} className="text-sm/6 text-gray-400 hover:text-white">
{item.name}
</a>
</li>
))}
</ul>
</div>
<div className="mt-10 md:mt-0">
<h3 className="text-sm/6 font-semibold text-white">Legal</h3>
<ul role="list" className="mt-6 space-y-4">
{navigation.legal.map((item) => (
<li key={item.name}>
<a href={item.href} className="text-sm/6 text-gray-400 hover:text-white">
{item.name}
</a>
</li>
))}
</ul>
</div>
</div>
</div>
<div className="mt-10 xl:mt-0">
<h3 className="text-sm/6 font-semibold text-white">Subscribe to our newsletter</h3>
<p className="mt-2 text-sm/6 text-gray-300">
The latest news, articles, and resources, sent to your inbox weekly.
</p>
<form className="mt-6 sm:flex sm:max-w-md">
<label htmlFor="email-address" className="sr-only">
Email address
</label>
<input
id="email-address"
name="email-address"
type="email"
required
placeholder="Enter your email"
autoComplete="email"
className="w-full min-w-0 rounded-md bg-white/5 px-3 py-1.5 text-base text-white outline outline-1 -outline-offset-1 outline-white/10 placeholder:text-gray-500 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-500 sm:w-64 sm:text-sm/6 xl:w-full"
/>
<div className="mt-4 sm:ml-4 sm:mt-0 sm:shrink-0">
<button
type="submit"
className="flex w-full items-center justify-center rounded-md bg-indigo-500 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500"
>
Subscribe
</button>
</div>
</form>
</div>
</div>
<div className="mt-16 border-t border-white/10 pt-8 sm:mt-20 md:flex md:items-center md:justify-between lg:mt-24">
<div className="flex gap-x-6 md:order-2">
{navigation.social.map((item) => (
<a key={item.name} href={item.href} className="text-gray-400 hover:text-gray-300">
<span className="sr-only">{item.name}</span>
<item.icon aria-hidden="true" className="size-6" />
</a>
))}
</div>
<p className="mt-8 text-sm/6 text-gray-400 md:order-1 md:mt-0">
&copy; 2024 Your Company, Inc. All rights reserved.
</p>
</div>
</div>
</footer>
)
}

View File

@@ -0,0 +1,41 @@
export default function Newsletter() {
return (
<div className="bg-gray-900 py-16 sm:py-24 lg:py-32">
<div className="mx-auto grid max-w-7xl grid-cols-1 gap-10 px-6 lg:grid-cols-12 lg:gap-8 lg:px-8">
<h2 className="max-w-xl text-balance text-3xl font-semibold tracking-tight text-white sm:text-4xl lg:col-span-7">
Want product news and updates? Sign up for our newsletter.
</h2>
<form className="w-full max-w-md lg:col-span-5 lg:pt-2">
<div className="flex gap-x-4">
<label htmlFor="email-address" className="sr-only">
Email address
</label>
<input
id="email-address"
name="email"
type="email"
required
placeholder="Enter your email"
autoComplete="email"
className="min-w-0 flex-auto rounded-md bg-white/5 px-3.5 py-2 text-base text-white outline outline-1 -outline-offset-1 outline-white/10 placeholder:text-gray-500 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-500 sm:text-sm/6"
/>
<button
type="submit"
className="flex-none rounded-md bg-indigo-500 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500"
>
Subscribe
</button>
</div>
<p className="mt-4 text-sm/6 text-gray-300">
We care about your data. Read our{' '}
<a href="#" className="font-semibold text-white">
privacy&nbsp;policy
</a>
.
</p>
</form>
</div>
</div>
)
}