diff --git a/components/team/screens/Team.tsx b/components/team/screens/Team.tsx
new file mode 100644
index 00000000..b064788d
--- /dev/null
+++ b/components/team/screens/Team.tsx
@@ -0,0 +1,83 @@
+import React from "react";
+import Text from "@components/ui/Text";
+import Link from "next/link";
+import Avatar from "@components/Avatar";
+import { ArrowRightIcon } from "@heroicons/react/outline";
+import useTheme from "@components/Theme";
+import classnames from "classnames";
+
+const Team = ({ team }) => {
+ useTheme();
+
+ const Member = ({ member }) => {
+ const classes = classnames(
+ "group",
+ "relative",
+ "flex flex-col",
+ "space-y-4",
+ "p-4",
+ "bg-white dark:bg-opacity-8",
+ "border border-neutral-200",
+ "hover:cursor-pointer",
+ "hover:border-black hover:border-2 dark:border-neutral-700 dark:hover:border-neutral-600",
+ "rounded-sm",
+ "hover:shadow-md"
+ );
+
+ return (
+
+
+
+
+
+
+
+ {member.user.name}
+
+ {member.user.bio}
+
+
+
+
+ );
+ };
+
+ const Members = ({ members }) => {
+ if (!members || members.length === 0) {
+ return null;
+ }
+
+ return (
+
+ {members.map((member) => {
+ return ;
+ })}
+
+ );
+ };
+
+ return (
+
+
+
+
+ );
+};
+
+export default Team;
diff --git a/lib/teams/getTeam.ts b/lib/teams/getTeam.ts
new file mode 100644
index 00000000..60939d07
--- /dev/null
+++ b/lib/teams/getTeam.ts
@@ -0,0 +1,54 @@
+import { Team } from "@prisma/client";
+import prisma from "@lib/prisma";
+import logger from "@lib/logger";
+
+const log = logger.getChildLogger({ prefix: ["[lib] getTeam"] });
+export const getTeam = async (idOrSlug: string): Promise => {
+ const teamIdOrSlug = idOrSlug;
+
+ let team = null;
+
+ log.debug(`{teamIdOrSlug} ${teamIdOrSlug}`);
+
+ const teamSelectInput = {
+ id: true,
+ name: true,
+ slug: true,
+ members: {
+ where: {
+ accepted: true,
+ },
+ select: {
+ user: {
+ select: {
+ id: true,
+ username: true,
+ email: true,
+ name: true,
+ bio: true,
+ avatar: true,
+ theme: true,
+ },
+ },
+ },
+ },
+ };
+
+ team = await prisma.team.findFirst({
+ where: {
+ OR: [
+ {
+ id: parseInt(teamIdOrSlug) || undefined,
+ },
+ {
+ slug: teamIdOrSlug,
+ },
+ ],
+ },
+ select: teamSelectInput,
+ });
+
+ log.debug(`{team}`, { team });
+
+ return team;
+};
diff --git a/pages/team/[idOrSlug].tsx b/pages/team/[idOrSlug].tsx
new file mode 100644
index 00000000..ab0d9614
--- /dev/null
+++ b/pages/team/[idOrSlug].tsx
@@ -0,0 +1,54 @@
+import { GetServerSideProps } from "next";
+import Head from "next/head";
+
+import Theme from "@components/Theme";
+import { getTeam } from "@lib/teams/getTeam";
+import Team from "@components/team/screens/Team";
+
+export default function Page(props) {
+ const { isReady } = Theme();
+
+ return (
+ isReady && (
+
+
+
{props.team.name} | Calendso
+
+
+
+
+
+
+
+ )
+ );
+}
+
+export const getServerSideProps: GetServerSideProps = async (context) => {
+ const teamIdOrSlug = Array.isArray(context.query?.idOrSlug)
+ ? context.query.idOrSlug.pop()
+ : context.query.idOrSlug;
+
+ const team = await getTeam(teamIdOrSlug);
+
+ if (!team) {
+ return {
+ notFound: true,
+ };
+ }
+
+ return {
+ props: {
+ team,
+ },
+ };
+};
+
+// Auxiliary methods
+export function getRandomColorCode(): string {
+ let color = "#";
+ for (let idx = 0; idx < 6; idx++) {
+ color += Math.floor(Math.random() * 10);
+ }
+ return color;
+}
diff --git a/tailwind.config.js b/tailwind.config.js
index 73d36b92..ccdace05 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -95,22 +95,28 @@ module.exports = {
inter: ["Inter", "sans-serif"],
kollektif: ["Kollektif", "sans-serif"],
},
- maxHeight: (theme) => ({
+ maxHeight: (theme, { breakpoints }) => ({
0: "0",
97: "25rem",
...theme("spacing"),
+ ...breakpoints(theme("screens")),
+ ...theme("screens"),
full: "100%",
screen: "100vh",
}),
- minHeight: (theme) => ({
+ minHeight: (theme, { breakpoints }) => ({
0: "0",
...theme("spacing"),
+ ...breakpoints(theme("screens")),
+ ...theme("screens"),
full: "100%",
screen: "100vh",
}),
- minWidth: (theme) => ({
+ minWidth: (theme, { breakpoints }) => ({
0: "0",
...theme("spacing"),
+ ...breakpoints(theme("screens")),
+ ...theme("screens"),
full: "100%",
screen: "100vw",
}),
@@ -118,9 +124,23 @@ module.exports = {
0: "0",
...theme("spacing"),
...breakpoints(theme("screens")),
+ ...theme("screens"),
full: "100%",
screen: "100vw",
}),
+ opacity: {
+ 0: "0",
+ 8: "0.08",
+ 10: "0.10",
+ 20: "0.20",
+ 40: "0.40",
+ 60: "0.60",
+ 80: "0.80",
+ 25: "0.25",
+ 50: "0.5",
+ 75: "0.75",
+ 100: "1",
+ },
},
},
variants: {