Add portal project page & images
BIN
public/portal/admin.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 147 KiB |
BIN
public/portal/checkin.png
Normal file
|
After Width: | Height: | Size: 314 KiB |
BIN
public/portal/event.png
Normal file
|
After Width: | Height: | Size: 384 KiB |
BIN
public/portal/events.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
public/portal/filters.png
Normal file
|
After Width: | Height: | Size: 225 KiB |
BIN
public/portal/login.png
Normal file
|
After Width: | Height: | Size: 800 KiB |
BIN
public/portal/profile.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/portal/status.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
@@ -17,7 +17,7 @@ export async function getStaticProps() {
|
|||||||
const projects: Project[] = [
|
const projects: Project[] = [
|
||||||
{
|
{
|
||||||
title: "Portal",
|
title: "Portal",
|
||||||
banner: "/portal.jpeg",
|
banner: "/banner.jpeg",
|
||||||
location: "/portal",
|
location: "/portal",
|
||||||
longDescription: "An advanced membership & event management system for my university's premier computer science organization.",
|
longDescription: "An advanced membership & event management system for my university's premier computer science organization.",
|
||||||
shortDescription: "Advanced membership & event management system for students",
|
shortDescription: "Advanced membership & event management system for students",
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const PhototagPage: NextPage = () => {
|
|||||||
</Head>
|
</Head>
|
||||||
<AppWrapper>
|
<AppWrapper>
|
||||||
|
|
||||||
<div className="bg-zinc-900 text-zinc-50 w-full overflow-auto h-full min-h-screen flex justify-center">
|
<div className="bg-zinc-850 text-zinc-50 w-full overflow-auto h-full min-h-screen flex justify-center">
|
||||||
<div className="relative my-10 p-3 px-6 w-full max-w-screen-md">
|
<div className="relative my-10 p-3 px-6 w-full max-w-screen-md">
|
||||||
<div className="pb-2 flex justify-between">
|
<div className="pb-2 flex justify-between">
|
||||||
<div className="text-2xl font-semibold">
|
<div className="text-2xl font-semibold">
|
||||||
@@ -29,20 +29,17 @@ const PhototagPage: NextPage = () => {
|
|||||||
className="!relative pointer-events-none min-h-[10rem] rounded-md object-cover"/>
|
className="!relative pointer-events-none min-h-[10rem] rounded-md object-cover"/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-3 w-full prose prose-invert prose-lg">
|
<div className="mt-3 w-full prose prose-invert prose-lg">
|
||||||
|
<p>
|
||||||
<p>Phototag is a powerful tool that helps you quickly and easily add rich, descriptive tags to
|
Phototag is a powerful tool that helps you quickly and easily add rich, descriptive tags to
|
||||||
your
|
your photos. Using Google's Vision API, Phototag automatically generates tags based on
|
||||||
photos. Using Google's Vision API, Phototag automatically generates tags based on the visual
|
the visual content of your photos, making it easier than ever to organize and find your
|
||||||
content
|
photos.
|
||||||
of your photos, making it easier than ever to organize and find your photos.</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
With support for IPTC metadata and Adobe XMP Sidecar files, you can easily integrate
|
With support for IPTC metadata and Adobe XMP Sidecar files, you can easily integrate
|
||||||
Phototag
|
Phototag into your existing workflow on Windows. Whether you're a professional
|
||||||
into
|
photographer or a casual snapshot taker, Phototag is the perfect tool for adding clarity and
|
||||||
your existing
|
context to your photos.
|
||||||
workflow on Windows. Whether you're a professional photographer or a casual snapshot taker,
|
|
||||||
Phototag
|
|
||||||
is the perfect tool for adding clarity and context to your photos.
|
|
||||||
</p>
|
</p>
|
||||||
<ul className="md:columns-2">
|
<ul className="md:columns-2">
|
||||||
<li>Simple, but configurable</li>
|
<li>Simple, but configurable</li>
|
||||||
|
|||||||
81
src/pages/portal.tsx
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import type {NextPage} from "next";
|
||||||
|
import Head from "next/head";
|
||||||
|
import Image from "next/image";
|
||||||
|
import {BsGithub} from "react-icons/bs";
|
||||||
|
import Link from "next/link";
|
||||||
|
import AppWrapper from "../components/AppWrapper";
|
||||||
|
import type {ReactNode} from "react";
|
||||||
|
|
||||||
|
const images: [string, string | ReactNode][] = [
|
||||||
|
["/portal/events.png", <> A page listing all current events. <br/> Initial data is cached for performance, but
|
||||||
|
becomes
|
||||||
|
dynamic when filtered.</>],
|
||||||
|
["/portal/admin.png", "A secure admin panel for our officers to view, filter & edit members & events."],
|
||||||
|
["/portal/event.png", "The view of a specific event."],
|
||||||
|
["/portal/checkin.png", "The check-in view."],
|
||||||
|
["/portal/filters.png", "Organization filtering options. Dynamic semester filtering & event sorting is also available."],
|
||||||
|
["/portal/login.png", "The login. Fast form validation, seamless login."],
|
||||||
|
["/portal/profile.png", <>The member profile view; fully editable on both desktop & mobile. <br/> Seamless editing
|
||||||
|
of profiles for users. Full validation available.</>],
|
||||||
|
["/portal/status.png", "Members can check their progress towards becoming full members & view what events they attended."],
|
||||||
|
]
|
||||||
|
|
||||||
|
const PhototagPage: NextPage = () => {
|
||||||
|
return <>
|
||||||
|
<Head>
|
||||||
|
<title>Portal | Xevion.dev</title>
|
||||||
|
</Head>
|
||||||
|
<AppWrapper>
|
||||||
|
|
||||||
|
<div className="bg-zinc-850 text-zinc-50 w-full overflow-auto h-full min-h-screen flex justify-center">
|
||||||
|
<div className="relative my-10 p-3 px-6 w-full max-w-screen-md">
|
||||||
|
<div className="pb-2 flex justify-between">
|
||||||
|
<div className="text-3xl font-semibold">
|
||||||
|
Portal
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-end space-x-1.5">
|
||||||
|
<Link href="https://github.com/UTSA-ACM/Portal" target="_blank">
|
||||||
|
<BsGithub className="w-6 h-6 hover:text-zinc-200"/>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="relative">
|
||||||
|
<Link href="https://portal.acmutsa.org/">
|
||||||
|
<Image fill sizes="100vw" src="/portal/banner.jpeg" alt=""
|
||||||
|
className="!relative pointer-events-none min-h-[10rem] rounded-md object-cover"/>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
<div className="mt-3 w-full prose prose-invert prose-lg">
|
||||||
|
<p>
|
||||||
|
Created in service of our membership, Portal was designed as a approachable membership
|
||||||
|
portal
|
||||||
|
for our users so we could <b>track membership</b>, <b>advertise events</b> and replace our
|
||||||
|
existing <b>database solution</b>.
|
||||||
|
</p>
|
||||||
|
<ul className="md:columns-2">
|
||||||
|
<li>Fast - built to serve thousands</li>
|
||||||
|
<li>Cheap - minimize costs</li>
|
||||||
|
<li>Open Source - help us improve</li>
|
||||||
|
<li>Cutting Edge - the latest technology</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Screenshots</h3>
|
||||||
|
<div className="relative space-y-3">
|
||||||
|
{images.map(([src, description]) => {
|
||||||
|
return <div key={src} className="flex flex-col justify-center w-full">
|
||||||
|
<Image fill sizes="100vw" src={src} alt=""
|
||||||
|
className="shadow-lg !my-1 !relative pointer-events-none min-h-[10rem] rounded-md object-cover"/>
|
||||||
|
<span
|
||||||
|
className="text-center text-base">{description}</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</AppWrapper>
|
||||||
|
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PhototagPage;
|
||||||