Merge pull request #269 from sailpoint-oss/feature/ambassador
Feature/ambassador
19
src/components/ambassador/AmbassadorBanner/index.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import clsx from 'clsx';
|
||||||
|
import styles from './styles.module.css';
|
||||||
|
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||||
|
import Link from '@docusaurus/Link';
|
||||||
|
|
||||||
|
export default function AmbassadorBanner() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div className={styles.imageContainer}>
|
||||||
|
<img className={styles.headerImage} src={useBaseUrl('/ambassador/ambassador_banner_template.png')}></img>
|
||||||
|
<div className={styles.ambassadorHeaderText}>
|
||||||
|
Ambassadors
|
||||||
|
</div>
|
||||||
|
</div >
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
28
src/components/ambassador/AmbassadorBanner/styles.module.css
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
.ambassadorHeaderText {
|
||||||
|
position: relative;
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 48px;
|
||||||
|
max-width: 396px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 133%;
|
||||||
|
top: -84px;
|
||||||
|
left: 92px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background {
|
||||||
|
width: 100%;
|
||||||
|
object-fit: repeat;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imageContainer {
|
||||||
|
width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
background: rgb(0,51,161);
|
||||||
|
background: linear-gradient(90deg, rgba(0,51,161,1) 0%, rgba(84,192,232,1) 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.headerImage {
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
38
src/components/ambassador/AmbassadorCard/index.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import styles from './styles.module.css';
|
||||||
|
import Link from '@docusaurus/Link';
|
||||||
|
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||||
|
import ThemedImage from '@theme/ThemedImage';
|
||||||
|
import {addDarkToFileName} from '../../../util/util';
|
||||||
|
export default function AmbassadorCard({
|
||||||
|
data
|
||||||
|
}) {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Link to={data.link} className={styles.link}>
|
||||||
|
|
||||||
|
|
||||||
|
<div className={styles.card}>
|
||||||
|
<div className={styles.cardFaceContainer}>
|
||||||
|
<img className={styles.cardFace} src={useBaseUrl(data.creatorImage)}></img>
|
||||||
|
<div className={styles.cardNameContainer}>
|
||||||
|
<div className={styles.name}>{data.name}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.bio} dangerouslySetInnerHTML={{__html: data.bio}}></div>
|
||||||
|
|
||||||
|
<div className={styles.cardData}>
|
||||||
|
<img className={styles.cardEye} src={useBaseUrl('/icons/square-check-regular.svg')}></img>
|
||||||
|
<div className={styles.cardCommentText}>{data.answers} solutions</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.cardDataLower}>
|
||||||
|
<img className={styles.cardEye} src={useBaseUrl('/icons/calendar-clock-light.svg')}></img>
|
||||||
|
<div className={styles.cardCommentText}>member since {data.member_since}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
}
|
||||||
136
src/components/ambassador/AmbassadorCard/styles.module.css
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/* Getting Started Card */
|
||||||
|
|
||||||
|
.link:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
position: relative;
|
||||||
|
margin-top: 20px;
|
||||||
|
height: 500px;
|
||||||
|
max-width: 420px;
|
||||||
|
/* UI Properties */
|
||||||
|
background: var(--dev-card-background);
|
||||||
|
box-shadow: var(--dev-card-shadow);
|
||||||
|
border: 1px solid var(--dev-card-background);
|
||||||
|
border-radius: 40px;
|
||||||
|
opacity: 1;
|
||||||
|
transition: all 0.3s;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
transform: translate(0px, -5px);
|
||||||
|
box-shadow: var(--dev-card-selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cardFaceContainer {
|
||||||
|
display: flex;
|
||||||
|
margin: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardFace {
|
||||||
|
border-radius: 99px;
|
||||||
|
justify-content: center;
|
||||||
|
display: flex;
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardNameContainer {
|
||||||
|
margin-left: 15px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
font-size: 25px;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 100%;
|
||||||
|
top: 124px;
|
||||||
|
left: 0;
|
||||||
|
color: var(--dev-text-color-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.titleText {
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 400;
|
||||||
|
width: 100%;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
top: 150px;
|
||||||
|
left: 0;
|
||||||
|
color: var(--dev-text-color-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.location {
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 100%;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
top: 141px;
|
||||||
|
left: 0;
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardArrow {
|
||||||
|
position: absolute;
|
||||||
|
margin: 20px;
|
||||||
|
bottom: 5px;
|
||||||
|
right: 0;
|
||||||
|
width: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.bio {
|
||||||
|
position: absolute;
|
||||||
|
margin: 30px auto;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 100%;
|
||||||
|
top: 100px;
|
||||||
|
left: 0;
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
padding: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.cardData {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 50px;
|
||||||
|
left: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardEye {
|
||||||
|
fill: #96a9bb;
|
||||||
|
/* computed from codepen https://codepen.io/sosuke/pen/Pjoqqp */
|
||||||
|
filter: invert(79%) sepia(12%) saturate(484%) hue-rotate(168deg) brightness(84%) contrast(84%);
|
||||||
|
margin-left: 5px;
|
||||||
|
height: 18px;
|
||||||
|
width: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardCommentText {
|
||||||
|
color: #96a9ba;
|
||||||
|
/* computed from codepen https://codepen.io/sosuke/pen/Pjoqqp */
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
height: 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardDataLower {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 20px;
|
||||||
|
left: 22px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
109
src/components/ambassador/AmbassadorCards/index.js
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import styles from './styles.module.css';
|
||||||
|
import AmbassadorCard from '../AmbassadorCard';
|
||||||
|
import BounceLoader from 'react-spinners/BounceLoader';
|
||||||
|
|
||||||
|
import {getAmbassadors, getAmbassadorDetails} from '../../../services/DiscourseService';
|
||||||
|
export default function AmbassadorCards({
|
||||||
|
expert
|
||||||
|
}) {
|
||||||
|
const [cardData, setCardData] = React.useState();
|
||||||
|
const [loadingCards, setLoadingCards] = React.useState(true);
|
||||||
|
|
||||||
|
const getPosts = async () => {
|
||||||
|
const data = await getAmbassadors(expert);
|
||||||
|
|
||||||
|
const resultset = []
|
||||||
|
if (data.members) {
|
||||||
|
const memberDetails = await getAmbassadorDetails(data.members.map(item => item.id))
|
||||||
|
for (const member of data.members) {
|
||||||
|
const memberDetail = memberDetails.users.filter(item => item.id === member.id)[0]
|
||||||
|
if (member.avatar_template.includes("developer.sailpoint.com") && memberDetail.bio_excerpt && memberDetail.bio_excerpt.length > 60 && memberDetail.accepted_answers > 0) {
|
||||||
|
resultset.push(await getMemberList(member, memberDetail))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resultset.sort((a, b) => a.date - b.date)
|
||||||
|
setCardData(resultset);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
setCardData(undefined);
|
||||||
|
}
|
||||||
|
setLoadingCards(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
getPosts();
|
||||||
|
setCardData(undefined);
|
||||||
|
setLoadingCards(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (cardData) {
|
||||||
|
return (
|
||||||
|
<div className={styles.center}>
|
||||||
|
<div className={styles.gridContainer}>
|
||||||
|
{cardData.map(function(a, index){
|
||||||
|
return <AmbassadorCard
|
||||||
|
key={a.link}
|
||||||
|
data={a}
|
||||||
|
></AmbassadorCard>
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
} else if (loadingCards) {
|
||||||
|
return (
|
||||||
|
<BounceLoader
|
||||||
|
className={styles.spinnerCenter}
|
||||||
|
color={'#0033a1'}
|
||||||
|
loading={true}
|
||||||
|
size={150}
|
||||||
|
aria-label="Loading Spinner"
|
||||||
|
data-testid="loader"
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<div className={styles.noFound}>
|
||||||
|
{' '}
|
||||||
|
No Ambassadors Found with the Given Search Criteria
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMemberList(member, details) {
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: member.name,
|
||||||
|
creatorImage: getavatarURL(member.avatar_template),
|
||||||
|
title: member.title,
|
||||||
|
bio: details.bio_excerpt,
|
||||||
|
member_since: new Date(member.added_at).toLocaleString('default', {month: 'long'}) + ' ' + new Date(member.added_at).toISOString().slice(0, 4),
|
||||||
|
badge_count: details.badge_count,
|
||||||
|
answers: details.accepted_answers,
|
||||||
|
location: details.location,
|
||||||
|
website: details.website_name,
|
||||||
|
link:
|
||||||
|
'https://developer.sailpoint.com/discuss/u/' +
|
||||||
|
member.username +
|
||||||
|
'/summary',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getavatarURL(avatar) {
|
||||||
|
if (avatar.includes("developer.sailpoint.com")) {
|
||||||
|
return "https://developer.sailpoint.com" + avatar.replace("{size}", "120")
|
||||||
|
} else {
|
||||||
|
return avatar.replace("{size}", "120")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function styleExcerpt(excerpt) {
|
||||||
|
if (excerpt.length > 150) {
|
||||||
|
return excerpt.slice(0, 150) + "..."
|
||||||
|
} else {
|
||||||
|
return excerpt.replace("…", "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
35
src/components/ambassador/AmbassadorCards/styles.module.css
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/* Getting Started Card container */
|
||||||
|
.gridContainer {
|
||||||
|
display: grid;
|
||||||
|
place-content: center;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
||||||
|
grid-gap: 40px;
|
||||||
|
margin-left: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
margin: 0px auto;
|
||||||
|
max-width: 1300px;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.space {
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.noFound {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--dev-secondary-text);
|
||||||
|
padding: 8px;
|
||||||
|
margin: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.spinnerCenter {
|
||||||
|
margin: 100px auto;
|
||||||
|
max-width: 1300px;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
@@ -47,13 +47,13 @@ export default function BlogSidebar({
|
|||||||
if (tagProductData && tagTechnologyData) {
|
if (tagProductData && tagTechnologyData) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.sidebar}>
|
<div className={styles.sidebar}>
|
||||||
<div className={styles.tagHeader}>Posts by Product</div>
|
<div className={styles.tagHeader}>Blogs by Product</div>
|
||||||
<div className={styles.tagContainer}>
|
<div className={styles.tagContainer}>
|
||||||
{tagProductData.map(function(a, index){
|
{tagProductData.map(function(a, index){
|
||||||
return <BlogSidebarButton key={a} text={a} filterCallback={filterCallback}></BlogSidebarButton>
|
return <BlogSidebarButton key={a} text={a} filterCallback={filterCallback}></BlogSidebarButton>
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.tagHeader}>Posts by Identity Governance</div>
|
<div className={styles.tagHeader}>Blogs by Identity Governance</div>
|
||||||
<div className={styles.tagContainer}>
|
<div className={styles.tagContainer}>
|
||||||
{tagTechnologyData.map(function(a, index){
|
{tagTechnologyData.map(function(a, index){
|
||||||
return <div key={'div' + a} className={index > 10 && filterTags ? styles.hidden : ''} > <BlogSidebarButton key={a} text={a} filterCallback={filterCallback}></BlogSidebarButton></div>
|
return <div key={'div' + a} className={index > 10 && filterTags ? styles.hidden : ''} > <BlogSidebarButton key={a} text={a} filterCallback={filterCallback}></BlogSidebarButton></div>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tagHeader {
|
.tagHeader {
|
||||||
margin-top: 10px;
|
margin-top: 30px;
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,9 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
top: -2px;
|
top: -2px;
|
||||||
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.2);
|
||||||
background-color: #c552ae10;
|
background-color: var(--dev-button-hover);
|
||||||
color: #cc27b0;
|
color: #cc27b0;
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
@@ -56,6 +57,7 @@
|
|||||||
box-shadow: 0px 20px 60px #00000015;
|
box-shadow: 0px 20px 60px #00000015;
|
||||||
border: 2px solid #df61ca;
|
border: 2px solid #df61ca;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
transition: all 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
@@ -63,4 +65,5 @@
|
|||||||
}
|
}
|
||||||
.link:hover {
|
.link:hover {
|
||||||
color: #df61ca;
|
color: #df61ca;
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
grid-template-columns: repeat(auto-fit, minmax(520px, 1fr));
|
grid-template-columns: repeat(auto-fit, minmax(520px, 1fr));
|
||||||
/* UI Properties */
|
/* UI Properties */
|
||||||
background: var(--main-hero-card-background);
|
background: var(--main-hero-card-background);
|
||||||
box-shadow: var(--dev-card-shadow);
|
box-shadow: var(--dev-main-card-shadow);
|
||||||
border: 1px solid var(--dev-card-background);
|
border: 1px solid var(--dev-card-background);
|
||||||
border-radius: 40px;
|
border-radius: 40px;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|||||||
@@ -2,13 +2,14 @@
|
|||||||
.gridContainer {
|
.gridContainer {
|
||||||
display: grid;
|
display: grid;
|
||||||
place-content: center;
|
place-content: center;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
grid-template-columns: repeat(auto-fit, minmax(195px, 1fr));
|
||||||
grid-gap: 40px;
|
grid-gap: 40px;
|
||||||
margin-left: 40px;
|
margin-left: 40px;
|
||||||
margin-right: 40px;
|
margin-right: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.center {
|
.center {
|
||||||
margin: 50px auto;
|
margin: 0px auto;
|
||||||
max-width: 1000px;
|
max-width: 1300px;
|
||||||
|
margin-bottom: 50px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tagHeader {
|
.tagHeader {
|
||||||
margin-top: 10px;
|
margin-top: 30px;
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -249,9 +249,11 @@
|
|||||||
--text-on-primary: #ffffff;
|
--text-on-primary: #ffffff;
|
||||||
|
|
||||||
/*card css*/
|
/*card css*/
|
||||||
--dev-card-background: #ffffff;
|
--dev-card-background: #e9e9e963;
|
||||||
--dev-card-shadow: 0px 20px 60px #00000015;
|
--dev-card-shadow: 0px 0px 0px #6b6b6b15;
|
||||||
|
--dev-main-card-shadow: 0px 20px 60px #00000015;
|
||||||
--dev-card-selected: 0 4px 5px rgba(0, 0, 0, 0.2);
|
--dev-card-selected: 0 4px 5px rgba(0, 0, 0, 0.2);
|
||||||
|
--dev-button-hover: #c552ae10;
|
||||||
|
|
||||||
--ifm-github-logo: url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");
|
--ifm-github-logo: url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");
|
||||||
--ifm-medium-logo: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 1770 1000"><circle cx="500" cy="500" r="500"/><ellipse ry="475" rx="250" cy="501" cx="1296"/><ellipse cx="1682" cy="502" rx="88" ry="424"/></svg>');
|
--ifm-medium-logo: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 1770 1000"><circle cx="500" cy="500" r="500"/><ellipse ry="475" rx="250" cy="501" cx="1296"/><ellipse cx="1682" cy="502" rx="88" ry="424"/></svg>');
|
||||||
@@ -284,10 +286,12 @@
|
|||||||
|
|
||||||
/*card css*/
|
/*card css*/
|
||||||
--dev-card-background: #2a2b2d;
|
--dev-card-background: #2a2b2d;
|
||||||
--dev-card-shadow: 0 4px 5px rgba(0, 0, 0, 0.2);
|
--dev-card-shadow: 0 0px 0px rgba(0, 0, 0, 0.2);
|
||||||
--dev-card-selected: 0 5px 5px rgba(107, 107, 107, 0.2);
|
--dev-main-card-shadow: 0 4px 5px rgba(0, 0, 0, 0.2);
|
||||||
|
--dev-card-selected: 0 5px 5px rgba(151, 151, 151, 0.2);
|
||||||
--dev-secondary-text: #dae1e9;
|
--dev-secondary-text: #dae1e9;
|
||||||
--dev-tag-highlight: #00000075;
|
--dev-tag-highlight: #00000075;
|
||||||
|
--dev-button-hover: #c552ae40;
|
||||||
|
|
||||||
/*main hero card*/
|
/*main hero card*/
|
||||||
--main-hero-card-background: #202122;
|
--main-hero-card-background: #202122;
|
||||||
|
|||||||
64
src/pages/ambassador.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import clsx from 'clsx';
|
||||||
|
import Link from '@docusaurus/Link';
|
||||||
|
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||||
|
import Layout from '@theme/Layout';
|
||||||
|
import AmbassadorBanner from '../components/ambassador/AmbassadorBanner';
|
||||||
|
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||||
|
import styles from './ambassador.module.css';
|
||||||
|
import AmbassadorCards from '../components/ambassador/AmbassadorCards';
|
||||||
|
|
||||||
|
export default function Ambassador() {
|
||||||
|
const {siteConfig} = useDocusaurusContext();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout description="The SailPoint Developer Community has everything you need to build, extend, and automate scalable identity solutions.">
|
||||||
|
<main>
|
||||||
|
{/* <AmbassadorBanner /> */}
|
||||||
|
<div className={styles.ambassadorPurposeContainer}>
|
||||||
|
<img
|
||||||
|
className={styles.ambassadorPurposeImage}
|
||||||
|
src={useBaseUrl('/ambassador/Ambassador-Program-Banner.png')}></img>
|
||||||
|
<div className={styles.ambassadorPurposeText}>
|
||||||
|
Our Ambassador Program offers not just exclusive benefits but also
|
||||||
|
an enriching learning experience on SailPoint; it's a journey to
|
||||||
|
expertise. As an Ambassador, your contributions foster community
|
||||||
|
growth, enabling knowledge-sharing among experts like you.
|
||||||
|
<Link
|
||||||
|
className={styles.link}
|
||||||
|
to="https://developer.sailpoint.com/discuss/t/announcing-the-developer-community-ambassador-program/10634">
|
||||||
|
<div className={styles.button}>Become an Ambassador</div>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.headerText}>
|
||||||
|
<div className={styles.headerTextOne}>Expert Ambassadors</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.imageContainer}>
|
||||||
|
<div className={styles.spanLeft}></div>
|
||||||
|
<img
|
||||||
|
className={styles.ambassadorImage}
|
||||||
|
src={useBaseUrl('/icons/ExpertAmbassador.svg')}></img>
|
||||||
|
<div className={styles.spanLeft}></div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.ambassadorCardContainer}>
|
||||||
|
<AmbassadorCards expert={true} />
|
||||||
|
</div>
|
||||||
|
<div className={styles.headerText}>
|
||||||
|
<div className={styles.headerTextOne}>Ambassadors</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.imageContainer}>
|
||||||
|
<div className={styles.spanLeft}></div>
|
||||||
|
<img
|
||||||
|
className={styles.ambassadorImage}
|
||||||
|
src={useBaseUrl('/icons/Ambassador.svg')}></img>
|
||||||
|
<div className={styles.spanLeft}></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.ambassadorCardContainer}>
|
||||||
|
<AmbassadorCards expert={false} />
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
|
);
|
||||||
|
}
|
||||||
142
src/pages/ambassador.module.css
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
|
||||||
|
.gridContainer {
|
||||||
|
display: grid;
|
||||||
|
place-content: center;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
|
||||||
|
grid-gap: 40px;
|
||||||
|
margin-left: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
margin: 50px auto;
|
||||||
|
max-width: 1000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.headerText {
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
margin: 100px auto 0px auto;
|
||||||
|
width: calc(100% - 100px);
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.headerTextOne {
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
font-size: 30px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.spanLeft {
|
||||||
|
width: 35%;
|
||||||
|
margin: 14px;
|
||||||
|
position: relative;
|
||||||
|
top: -45px;
|
||||||
|
border-bottom-width:2px;
|
||||||
|
border-bottom-style:solid;
|
||||||
|
border-bottom-color:var(--ifm-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.imageContainer {
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ambassadorImage {
|
||||||
|
margin-left: 5px;
|
||||||
|
padding: 20px;
|
||||||
|
height: 120px;
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.ambassadorPurposeContainer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
width: calc(75% + 75px);
|
||||||
|
align-items: center;
|
||||||
|
margin: 0px auto 0px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.ambassadorPurposeText {
|
||||||
|
font-size: 21px;
|
||||||
|
padding: 50px 0px 50px 50px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--dev-text-color-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ambassadorPurposeImage {
|
||||||
|
width: 40%;
|
||||||
|
box-shadow: var(--dev-card-selected);
|
||||||
|
border-radius: 40px;
|
||||||
|
margin: 50px 50px 50px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1460px) {
|
||||||
|
.ambassadorPurposeContainer {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.ambassadorPurposeImage {
|
||||||
|
width: 80%;
|
||||||
|
margin: 50px 50px 50px 50px;
|
||||||
|
}
|
||||||
|
.ambassadorPurposeText {
|
||||||
|
padding: 50px 50px 50px 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.button:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
top: -2px;
|
||||||
|
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.2);
|
||||||
|
background-color: #c552ae10;
|
||||||
|
color: #cc27b0;
|
||||||
|
background-color: var(--dev-button-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
text-decoration: none;
|
||||||
|
text-align: center;
|
||||||
|
margin: 30px auto;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 100%;
|
||||||
|
|
||||||
|
/* Layout Properties */
|
||||||
|
width: 314px;
|
||||||
|
height: 61px;
|
||||||
|
line-height: 61px;
|
||||||
|
/* UI Properties */
|
||||||
|
background: transparent 0% 0% no-repeat padding-box;
|
||||||
|
opacity: 1;
|
||||||
|
|
||||||
|
box-shadow: 0px 20px 60px #00000015;
|
||||||
|
border: 2px solid #df61ca;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: all 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
color: #df61ca;
|
||||||
|
}
|
||||||
|
.link:hover {
|
||||||
|
color: #df61ca;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
@@ -8,6 +8,49 @@ export async function getTopPosts() {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
export async function getAmbassadors(expert) {
|
||||||
|
try {
|
||||||
|
if (expert) {
|
||||||
|
const response = await fetch(
|
||||||
|
'https://developer.sailpoint.com/discuss/groups/ambassador_expert/members.json',
|
||||||
|
);
|
||||||
|
return await response.json();
|
||||||
|
} else {
|
||||||
|
const response = await fetch(
|
||||||
|
'https://developer.sailpoint.com/discuss/groups/ambassador/members.json',
|
||||||
|
);
|
||||||
|
return await response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getAmbassadorDetails(id) {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
'https://developer.sailpoint.com/discuss/user-cards.json?user_ids=' + id.join(','),
|
||||||
|
);
|
||||||
|
return await response.json();
|
||||||
|
} catch (error) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function checkImage(url) {
|
||||||
|
try {
|
||||||
|
const response = await fetch(
|
||||||
|
url,
|
||||||
|
);
|
||||||
|
console.log(response)
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export async function getBlogPosts(tags) {
|
export async function getBlogPosts(tags) {
|
||||||
let url = ''
|
let url = ''
|
||||||
|
|||||||
BIN
static/ambassador/Ambassador-Program-Banner.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
static/ambassador/AmbassadorBadge-Pink-Hex.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
static/ambassador/AmbassadorBadge-QuadGrad-Squircle.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
static/ambassador/ambassador_banner_template.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
63
static/icons/Ambassador.svg
Normal file
|
After Width: | Height: | Size: 142 KiB |
63
static/icons/ExpertAmbassador.svg
Normal file
|
After Width: | Height: | Size: 86 KiB |
1
static/icons/calendar-clock-light.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M112 0c8.8 0 16 7.2 16 16V64H320V16c0-8.8 7.2-16 16-16s16 7.2 16 16V64h32c35.3 0 64 28.7 64 64v32 32 .7c-5.3-.5-10.6-.7-16-.7s-10.7 .2-16 .7V192H32V448c0 17.7 14.3 32 32 32H296.2c10 12.1 21.7 22.9 34.6 32H64c-35.3 0-64-28.7-64-64V192 160 128C0 92.7 28.7 64 64 64H96V16c0-8.8 7.2-16 16-16zM384 96H64c-17.7 0-32 14.3-32 32v32H416V128c0-17.7-14.3-32-32-32zm48 384a112 112 0 1 0 0-224 112 112 0 1 0 0 224zm0-256a144 144 0 1 1 0 288 144 144 0 1 1 0-288zm0 64c8.8 0 16 7.2 16 16v48h32c8.8 0 16 7.2 16 16s-7.2 16-16 16H432c-8.8 0-16-7.2-16-16V304c0-8.8 7.2-16 16-16z"/></svg>
|
||||||
|
After Width: | Height: | Size: 807 B |
1
static/icons/square-check-regular.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M64 80c-8.8 0-16 7.2-16 16V416c0 8.8 7.2 16 16 16H384c8.8 0 16-7.2 16-16V96c0-8.8-7.2-16-16-16H64zM0 96C0 60.7 28.7 32 64 32H384c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96zM337 209L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"/></svg>
|
||||||
|
After Width: | Height: | Size: 595 B |