Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web release 3 #655

Open
wants to merge 59 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
7c5c331
Standardize List Display with Card Component (#433) (#460)
Michael-Obele Mar 11, 2024
3c3c5f6
feat: added Faq section (#534)
Akshaybagai52 Mar 16, 2024
46a922b
Fix faq
benjagm Mar 20, 2024
ee6bfdf
Added Case Studies page in Overview Section (#473)
TamannaVerma99 Mar 20, 2024
023a3c0
feat: added resource section (#509)
Akshaybagai52 Mar 20, 2024
8cb617e
Feat: Add the Newsletter feature to the website. (#489)
ayushnau Mar 20, 2024
8a32db3
Added welcome page (#566)
TamannaVerma99 Mar 21, 2024
3647457
Added Use-cases page (#589)
VivekJaiswal18 Apr 8, 2024
2cda0bc
Change docs link
benjagm Apr 8, 2024
f45b548
fix: spacing between buttons (#575)
Akshaybagai52 Apr 8, 2024
a22a799
community-page (#646)
officeneerajsaini Apr 15, 2024
abbcc0a
Merge branch 'main' into web-release-3
benjagm Apr 15, 2024
fb98b60
Update Sidebar.tsx
benjagm Apr 15, 2024
3958b6d
Add resources file
benjagm Apr 15, 2024
c8599e0
Update Sidebar.tsx
benjagm Apr 15, 2024
373f64e
Update case-studies.json
benjagm Apr 15, 2024
f7e6fd5
Text colours for dark theme
benjagm Apr 15, 2024
7995844
New version of the implementers page
benjagm Apr 19, 2024
c04d577
Feat: Replacing Axios to fs fetching in resources page (#657)
DhairyaMajmudar Apr 23, 2024
886ee85
Improve Case Studies and Use Cases welcome messages
benjagm May 20, 2024
ee91a74
adding codeowners
DhairyaMajmudar May 21, 2024
69a1eae
Fixing bugs and adding back lost files
DhairyaMajmudar May 22, 2024
989ded0
fix sidebar dropdown for FAQ
benjagm May 22, 2024
290e4de
community page major changes and faq bug fix
DhairyaMajmudar May 22, 2024
515f95c
community page bug fixes and responsive issues in several pages
DhairyaMajmudar May 23, 2024
d8ef58c
Update index.page.tsx (#684)
kwennB May 23, 2024
3991da0
Feat: Removing resources and newletter from web-release-3 branch (#698)
DhairyaMajmudar May 23, 2024
15a1ca8
case-studies bug fix and hover delay fix
DhairyaMajmudar May 23, 2024
2927056
adding ts comment
DhairyaMajmudar May 23, 2024
56a54d3
Small corrections
benjagm May 23, 2024
52c7c5a
Update blogs link
benjagm May 23, 2024
d66d2d5
Ambassadors button aligned to the left
benjagm May 23, 2024
0b7946c
Feat: Fixing responsive bugs from community page
DhairyaMajmudar May 26, 2024
6caf9c0
community page bug fixes
DhairyaMajmudar May 26, 2024
2ad9a42
Added uses cases texts
benjagm May 27, 2024
3de5ecb
Last changes to use-cases
benjagm May 27, 2024
71a8630
Add html to the use cases definition
benjagm May 27, 2024
7049fc7
feat:adding html parser for use-cases page
DhairyaMajmudar May 27, 2024
c400a71
removing links from images
DhairyaMajmudar May 28, 2024
f155ea9
improved FAQ description text (#709)
kwennB May 28, 2024
e8dc9bc
Improvement for case studies
benjagm May 28, 2024
2954b0c
Merge branch 'web-release-3' of https://github.com/json-schema-org/we…
benjagm May 28, 2024
a00c819
merge confilts
DhairyaMajmudar May 28, 2024
7b13f8e
removing merge conflicts
DhairyaMajmudar May 28, 2024
c3f2a06
Fix:community card gap
DhairyaMajmudar May 28, 2024
5c4acaa
Align with main branch
benjagm May 30, 2024
0898f7b
Align with main branch
benjagm May 30, 2024
3af14b5
Align with main branch
benjagm May 30, 2024
647d52c
Update pages/overview/what-is-jsonschema.md
DhairyaMajmudar May 30, 2024
ae04e43
Remove welcome data file
benjagm May 30, 2024
46e4dcd
Merge branch 'main' into web-release-3
benjagm Jun 1, 2024
1f56a4a
Move welcome outside overview section
benjagm Jun 1, 2024
73aec68
Change welcome text
benjagm Jun 1, 2024
b1e68ad
Feat: Replaced axios with fetch
DhairyaMajmudar Jun 1, 2024
4a53960
moved path to function
DhairyaMajmudar Jun 2, 2024
0b0fb2d
Updating community filters
DhairyaMajmudar Jun 2, 2024
6b51f02
Update pages/community/index.page.tsx
DhairyaMajmudar Jun 2, 2024
0662ac9
Fix the menu links
benjagm Jun 2, 2024
c3478f4
Update the JSON Schema calendar link
benjagm Jun 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
94 changes: 94 additions & 0 deletions components/Accordion.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/router';

interface AccordionItem {
question: string;
answer: string;
id: number;
}

interface AccordionProps {
items: AccordionItem[];
}

const Accordion: React.FC<AccordionProps> = ({ items }) => {
const [activeIndex, setActiveIndex] = useState<number | null>(null);
const router = useRouter();

const handleToggle = (index: number) => {
setActiveIndex((prevIndex) => (prevIndex === index ? null : index));
};

useEffect(() => {
const hash = router.asPath.split('#')[1];
if (hash) {
const id = parseInt(hash, 10);
const index = items.findIndex((item) => item.id === id);
if (index !== -1) {
setActiveIndex(index);

setTimeout(() => {
const element = document.getElementById(hash);
if (element) {
const navbarHeight = 150;
const offset = element.offsetTop - navbarHeight;
window.scrollTo({ top: offset, behavior: 'smooth' });
}
}, 0);
}
}
}, [items, router.asPath]);

const handleLinkClick = (id: number) => {
const index = items.findIndex((item) => item.id === id);
setActiveIndex(index);

const newUrl = `#${id}`;
router.push(newUrl, undefined, { shallow: true });
};

return (
<div>
{items.map((item, index) => (
<div
key={item.id || index}
className={`overflow-hidden transition-max-height border-t-2 ${
activeIndex === index ? 'max-h-96' : 'max-h-20'
} ${index === items.length - 1 ? 'border-b-2' : ''}`}
>
<div className='flex justify-between p-4 pl-2 cursor-pointer'>
<div className='text-[20px]'>
<a
href={`#${item.id}`}
onClick={(e) => {
e.preventDefault();
handleLinkClick(item.id);
}}
>
{item.question}
</a>
</div>
<div
className={`transform transition-transform duration-200 max-h-7 text-[20px] ${
activeIndex === index ? 'rotate-45' : ''
}`}
onClick={() => handleToggle(index)}
>
&#43;
</div>
</div>
{activeIndex === index && (
<div
id={`${item.id}`}
className='p-2 text-gray-500 dark:text-slate-200 pb-4'
>
{item.answer}
</div>
)}
</div>
))}
</div>
);
};

export default Accordion;
113 changes: 113 additions & 0 deletions components/Card.tsx
Copy link
Member

Choose a reason for hiding this comment

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

Cards are the Call to Action in many cases. Having "read more" hidden until hover is not good. Users need to know it's clickable.

In many cases, we want to make the CTA more prominent, such as on the case studies page.

Consider a comparison with that of CNCF. Their case study CTAs are clear and strong.
We don't need to copy them with the layout, but our design should cause people to be drawn to the CTA.

Screenshot 2024-05-30 at 12 27 58

Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import React from 'react';
import Link from 'next/link';
import TextTruncate from 'react-text-truncate';
interface CardProps {
title: string;
body: string;
icon?: string;
link?: string;
image?: string;
extended?: boolean;
headerSize?: 'small' | 'medium' | 'large';
bodyTextSize?: 'small' | 'medium' | 'large';
}

const CardBody = ({
title,
body,
icon,
link,
image,
extended,
headerSize,
bodyTextSize,
}: CardProps) => {
const headerSizeClasses: Record<string, string> = {
small: 'text-[0.9rem]',
medium: 'text-[1.3rem]',
large: 'text-[2rem]',
};
const bodyTextSizeClasses: Record<string, string> = {
small: 'text-[0.85rem]',
medium: 'text-[1rem]',
large: 'text-[1.5rem]',
};
return (
<div className='group relative h-full w-full rounded-lg border border-gray-200 bg-white p-6 px-12 shadow-3xl dark:shadow-2xl dark:shadow-slate-900 transition-colors ease-in-out hover:bg-slate-100 dark:bg-slate-800 hover:dark:bg-slate-900/30'>
<div className='flex justify-center '>
{image && <img src={image} className='h-32 p-2' />}
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think it is better to use Next.js prebuilt Image Component. It does some optimization under the hood.

https://nextjs.org/learn-pages-router/seo/improve/images
https://nextjs.org/docs/pages/building-your-application/optimizing/images

</div>
<div className='flex flex-row items-start mb-6'>
{icon && (
<span className='mr-6 flex h-14 w-14 flex-shrink-0 items-center justify-center rounded-lg border bg-blue-200 px-3 text-gray-900 dark:text-white'>
<img src={icon} alt={title} className='h-full w-full' />
Copy link
Collaborator

Choose a reason for hiding this comment

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

Better to use Next.js prebuilt Image Component.

</span>
)}
<p
className={`mb-1 mt-1 items-center font-bold text-gray-900 dark:text-white ${headerSizeClasses[headerSize || 'medium']}`}
>
{title}
</p>
</div>
<hr className='mb-4 mt-3.5 h-px border-0 bg-gray-400' />
<p
className={`mb-8 text-black mt-5 dark:text-white ${bodyTextSizeClasses[bodyTextSize || 'medium']} `}
>
{extended && <span dangerouslySetInnerHTML={{ __html: body }} />}
{!extended && <TextTruncate element='span' line={3} text={body} />}
</p>
{link && (
<p className='absolute bottom-3 right-5 font-medium opacity-0 transition-opacity delay-150 ease-in-out group-hover:opacity-100 text-black dark:text-white '>
Read More
</p>
)}
</div>
);
};

const Card: React.FC<CardProps> = ({
title,
body,
icon,
link,
image,
extended,
headerSize,
bodyTextSize,
}) => {
return (
<>
{link ? (
<Link href={link}>
<CardBody
{...{
title,
body,
icon,
link,
image,
extended,
headerSize,
bodyTextSize,
}}
/>
</Link>
) : (
<CardBody
{...{
title,
body,
icon,
link,
image,
extended,
headerSize,
bodyTextSize,
}}
/>
)}
</>
);
};

export default Card;
18 changes: 18 additions & 0 deletions components/Faq.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import React from 'react';
import faqData from '../data/faq.json';
import Accordion from '~/components/Accordion';

export default function Faq({ category }: { category: string }) {
const filteredFAQs = faqData.filter((item) => item.category === category);

return (
<section>
<div className='max-w-screen-md mx-auto p-8 px-0 ml-0'>
<h2 className='text-2xl font-bold text-[24px] mb-4'>
{category.toUpperCase()}
</h2>
<Accordion items={filteredFAQs} />
</div>
</section>
);
}
12 changes: 6 additions & 6 deletions components/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ export default function Layout({
);

useEffect(() => {
// Check if the URL contains "#community"
if (window.location.hash === '#community') {
// Check if the URL contains "community"
if (window.location.hash === 'community') {
// Find the anchor element by its ID
const target = document.getElementById('community');

Expand Down Expand Up @@ -195,7 +195,7 @@ const MainNavigation = () => {
/>
<MainNavLink
className='hidden lg:block hover:underline'
uri='/learn/getting-started-step-by-step'
uri='/docs'
label='Docs'
isActive={section === 'docs'}
/>
Expand All @@ -214,12 +214,12 @@ const MainNavigation = () => {
/>
<MainNavLink
className='hidden lg:block hover:underline'
uri='/#community'
uri='/community'
label='Community'
isActive={section === 'community'}
/>

<div className='flex items-center max-sm:ml-4 mr-8 gap-6 md:gap-4 dark:bg-slate-800'>
<div className='flex items-center max-sm:ml-4 mr-8 gap-6 md:gap-4 dark:bg-slate-800'>
<div
className={`rounded-md dark:hover:bg-gray-700 hover:bg-gray-100 focus:bg-gray-100 focus:outline-none transition duration-150 md:block border-gray-100 ml-0 ${icon}`}
onClick={() => {
Expand Down Expand Up @@ -298,7 +298,7 @@ const MobileNav = () => {
/>
<MainNavLink uri='/blog' label='Blog' isActive={section === 'blog'} />
<MainNavLink
uri='/#community'
uri='/community'
label='Community'
isActive={section === 'community'}
/>
Expand Down
17 changes: 15 additions & 2 deletions components/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,11 @@ const SegmentSubtitle = ({ label }: { label: string }) => {
const getDocsPath = [
'/overview/what-is-jsonschema',
'/overview/sponsors',
'/overview/case-studies',
'/overview/similar-technologies',
'/overview/use-cases',
'/overview/code-of-conduct',
'/overview/faq',
];
const getStartedPath = [
'/learn/json-schema-examples',
Expand Down Expand Up @@ -140,6 +143,7 @@ const getSpecificationPath = [
'/specification-links',
'/specification',
];

export const SidebarLayout = ({ children }: { children: React.ReactNode }) => {
const router = useRouter();
const [open, setOpen] = useState(false);
Expand Down Expand Up @@ -214,7 +218,6 @@ export const SidebarLayout = ({ children }: { children: React.ReactNode }) => {
<DocsNav open={open} setOpen={setOpen} />
</div>
</div>

<div className='dark:bg-slate-800 max-w-[1400px] grid grid-cols-1 lg:grid-cols-4 mx-4 md:mx-12'>
<div className='hidden lg:block mt-24'>
<DocsNav open={open} setOpen={setOpen} />
Expand Down Expand Up @@ -287,7 +290,6 @@ export const DocsNav = ({
const [reference_icon, setReference_icon] = useState('');
const [spec_icon, setSpec_icon] = useState('');
const [overview_icon, setOverview_icon] = useState('');

useEffect(() => {
if (theme === 'dark') {
setOverview_icon('/icons/eye-dark.svg');
Expand Down Expand Up @@ -348,6 +350,17 @@ export const DocsNav = ({
label='Sponsors'
setOpen={setOpen}
/>
<DocLink
uri='/overview/use-cases'
label='Use Cases'
setOpen={setOpen}
/>
<DocLink
uri='/overview/case-studies'
label='Case Studies'
setOpen={setOpen}
/>
<DocLink uri='/overview/faq' label='FAQ' setOpen={setOpen} />
<DocLink
uri='/overview/similar-technologies'
label='Similar Technologies'
Expand Down
65 changes: 65 additions & 0 deletions data/case-studies.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
[
{
"title": "How JSON Schema Was an Obvious Choice at GitHub",
"summary": "At GitHub's Docs Engineering team, while shipping releases to production 20 times per day or more, JSON Schema is critical in increasing confidence in changes to data, content and APIs.",
"logo": "/img/logos/github-logo.png",
"links": {
"lang": "URL1",
"url": "/blog/posts/github-case-study"
}
},
{
"title": "How 6 River Systems saves time and boosts collaboration with JSON Schema",
"summary": "Explore the powerful impact of JSON Schema on 6 River Systems' fulfillment operations. Discover how they enabled enhanced collaboration, time savings, and data quality assurance, propelling their successful scaling journey.",
"logo": "/img/logos/6river-logo.svg",
"links": {
"lang": "URL1",
"url": "/blog/posts/6-river-systems-case-study"
}
},
{
"title": "Transforming the technical recruiting industry with JSON Schema",
"summary": "Learn how Manfred used JSON Schema to transform the technical recruiting industry.",
"logo": "/img/logos/manfred-color.svg",
"links": {
"lang": "URL1",
"url": "/blog/posts/manfred-case-study"
}
},
{
"title": "How Postman uses JSON Schema",
"summary": "Learn how JSON Schema continues to be a crucial component of the Postman API Platform and the API ecosystem.",
"logo": "/img/logos/sponsors/postman_logo-orange.svg",
"links": {
"lang": "URL1",
"url": "/blog/posts/postman-case-study"
}
},
{
"title": "Using JSON Schema at Remote to scale forms and data validations",
"summary": "Using JSON Schema at Remote was the first step to solving data validation and form generation problems across all levels at Remote.",
"logo": "/img/logos/remote-logo.png",
"links": {
"lang": "URL1",
"url": "/blog/posts/remote-case-study"
}
},
{
"title": "How Tyler Technologies reduced its client feedback loop with JSON Schema",
"summary": "Using JSON Schema at Tyler Technologies meant showing added value to clients could take minutes rather than days or in some cases weeks.",
"logo": "/img/logos/tyler-tech-logo.svg",
"links": {
"lang": "URL1",
"url": "/blog/posts/tyler-technologies-case-study"
}
},
{
"title": "How the W3C Web of Things brings JSON Schema to the Internet of Things",
"summary": "Using JSON Schema at the W3C Web of Things to create an interoperability layer so that different IoT platforms, protocols and standards can operate together.",
"logo": "/img/logos/wot-logo.png",
"links": {
"lang": "URL1",
"url": "/blog/posts/w3c-wot-case-study"
}
}
]