Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
},
{
"name": "18.x",
"branch": "branch/v18",
"branch": "aatuvai/enrollment-methods-changes",
"repo_path": "aatuvai/teleport",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revert before merge

"isDefault": true
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,17 @@
@media (--md-scr) {
font-size: var(--lp-header-2);
}

&.rowsVariant {
font-size: var(--fs-header-4);

@media (--md-scr) {
font-size: var(--fs-header-3);
}
}
}

.methodsList {
list-style: none;
padding: 0;
margin: 0;
display: grid;
Expand All @@ -32,13 +39,52 @@
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--m-3);
}

&.rowsVariant {
display: flex;
flex-direction: column;
gap: var(--m-4);
}
}

.method {
padding: var(--m-3);
border-radius: 12px;
border-radius: var(--m-1-5);
border: 1.5px solid var(--color-tonal-neutral-0);
margin-top: 0 !important;

&.rowsVariant {
border: none;
padding: 0;
}

&.innerMethodRowsVariant {
border-radius: var(--m-2);
padding: var(--m-3);
border: 1.5px solid var(--color-tonal-neutral-0);
display: grid;
gap: var(--m-1);
grid-template-columns: minmax(0, 1fr);
margin-top: var(--m-2) !important;

@media (--md-scr) {
gap: var(--m-3);
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
}

.methodHeader {
display: flex;
flex-direction: column;
gap: var(--m-1);

&.rowsVariant {
@media (--md-scr) {
gap: var(--m-2);
flex-direction: row;
}
}
}

.methodTitle {
Expand Down Expand Up @@ -80,12 +126,42 @@
}
}
}

&.innerMethodRowsVariant {
font-size: var(--fs-text-xl);
font-weight: var(--fw-bold);
display: flex;
margin: 0;

@media (--md-scr) {
font-size: var(--fs-header-4);
margin: 0 0 var(--m-1) 0;
}

a {
text-decoration: none;
font-weight: var(--fw-bold);
color: var(--color-dark-purple);
}
}
}

.methodSubtitle {
font-size: var(--fs-text-lg);
color: var(--color-foreground-slightly-muted);
margin-bottom: var(--m-2);
}

.methodIcon {
width: var(--m-6);
height: var(--m-6);
aspect-ratio: 1 / 1;

&.rowsVariant {
width: var(--m-5);
height: var(--m-5);
margin-right: 0;
}
}

.methodDescription {
Expand All @@ -103,7 +179,9 @@
p,
ul,
ol {
margin-bottom: var(--m-2);
&:not(:last-child) {
margin-bottom: var(--m-2);
}
}

a {
Expand All @@ -115,6 +193,17 @@
color: var(--color-dark-purple);
}
}

&.innerMethodRowsVariant {
p {
margin-bottom: 0;
}

b,
strong {
margin-bottom: var(--m-1);
}
}
}

.tagList {
Expand Down
188 changes: 131 additions & 57 deletions src/components/Pages/Landing/EnrollmentMethods/EnrollmentMethods.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import React from "react";
import Icon, { IconName } from "@site/src/components/Icon";
import styles from "./EnrollmentMethods.module.css";
import Link from "@docusaurus/Link";
import ArrowRightSvg from "@site/src/components/Icon/teleport-svg/arrow-right.svg";
import cn from "classnames";

interface Tag {
name: string;
Expand All @@ -17,94 +19,166 @@ interface TagList {

interface EnrollmentMethod {
title: string;
description?: string;
icon: any;
href?: string;
tagLists: TagList[];
children?: React.ReactNode;
variant?: "default" | "rows";
innerMethod?: boolean;
}

interface EnrollmentMethodsProps {
title?: string;
children?: React.ReactNode;
variant?: "default" | "rows";
}

export const Method: React.FC<EnrollmentMethod> = ({
title,
description,
href,
tagLists = [],
children,
icon: IconComponent,
variant,
innerMethod = false,
}) => {
return (
<li className={styles.method}>
<IconComponent className={styles.methodIcon} />
<h3 className={styles.methodTitle}>
{href ? (
// @ts-ignore
<Link to={href} className={styles.methodLink}>
{title}
</Link>
) : (
title
<div
className={cn(styles.method, {
[styles.rowsVariant]: variant === "rows",
[styles.innerMethodRowsVariant]: innerMethod && variant === "rows",
})}
>
<div
className={cn(styles.methodHeader, {
[styles.rowsVariant]: variant === "rows",
})}
>
{IconComponent && (
<IconComponent
className={cn(styles.methodIcon, {
[styles.rowsVariant]: variant === "rows",
})}
/>
)}
</h3>
<div className={styles.methodDescription}>{children}</div>
{tagLists.length > 0 &&
tagLists.map((tagList, index) => (
<div key={index} className={styles.tagList}>
{tagList.title && (
<h4 className={styles.tagListTitle}>{tagList.title}</h4>
<div>
<h3
className={cn(styles.methodTitle, {
[styles.innerMethodRowsVariant]:
innerMethod && variant === "rows",
})}
>
{href ? (
// @ts-ignore
<Link to={href} className={styles.methodLink}>
{title}
</Link>
) : (
title
)}
<ul className={styles.tags}>
{tagList.tags.map((tag, tagIndex) => (
<li key={tagIndex}>
{tag.href ? (
<Link className={styles.tag} to={tag.href}>
{tag.icon && (
<Icon
name={tag.icon}
size="md"
className={styles.tagIcon}
/>
)}
{tag.name}
{tag.arrow && (
<ArrowRightSvg className={styles.tagArrow} />
)}
</Link>
) : (
<span className={styles.tag}>
{tag.icon && (
<Icon
name={tag.icon}
size="md"
className={styles.tagIcon}
/>
)}
{tag.name}
{tag.arrow && (
<ArrowRightSvg className={styles.tagArrow} />
)}
</span>
)}
</li>
))}
</ul>
</div>
))}
</li>
</h3>
{description && (
<div className={styles.methodSubtitle}>{description}</div>
)}
</div>
</div>
<div>
<div
className={cn(styles.methodDescription, {
[styles.innerMethodRowsVariant]: innerMethod && variant === "rows",
})}
>
{React.Children.map(children, (child) => {
if (React.isValidElement(child) && child.type === Method) {
return React.cloneElement(child as React.ReactElement<any>, {
innerMethod: true,
variant,
});
}
return child;
})}
</div>
{tagLists.length > 0 &&
tagLists.map((tagList, index) => (
<div key={index} className={styles.tagList}>
{tagList.title && (
<h4 className={styles.tagListTitle}>{tagList.title}</h4>
)}
<ul className={styles.tags}>
{tagList.tags.map((tag, tagIndex) => (
<li key={tagIndex}>
{tag.href ? (
<Link className={styles.tag} to={tag.href}>
{tag.icon && (
<Icon
name={tag.icon}
size="md"
className={styles.tagIcon}
/>
)}
{tag.name}
{tag.arrow && (
<ArrowRightSvg className={styles.tagArrow} />
)}
</Link>
) : (
<span className={styles.tag}>
{tag.icon && (
<Icon
name={tag.icon}
size="md"
className={styles.tagIcon}
/>
)}
{tag.name}
{tag.arrow && (
<ArrowRightSvg className={styles.tagArrow} />
)}
</span>
)}
</li>
))}
</ul>
</div>
))}
</div>
</div>
);
};

const EnrollmentMethods: React.FC<EnrollmentMethodsProps> = ({
title,
children,
variant = "default",
}) => {
return (
<section className={styles.enrollmentMethods}>
<div className={styles.container}>
{title && <h2 className={styles.title}>{title}</h2>}
<ul className={styles.methodsList}>{children}</ul>
{title && (
<h2
className={cn(styles.title, {
[styles.rowsVariant]: variant === "rows",
})}
>
{title}
</h2>
)}
<div
className={cn(styles.methodsList, {
[styles.rowsVariant]: variant === "rows",
})}
>
{React.Children.map(children, (child) => {
if (React.isValidElement(child) && child.type === Method) {
return React.cloneElement(child as React.ReactElement<any>, {
variant,
});
}
return child;
})}
</div>
</div>
</section>
);
Expand Down
Loading