Skip to content

Commit b800a6f

Browse files
authored
Merge pull request #2401 from garden-co/feat/snippet-improvements
Feat/snippet improvements
2 parents c3912fd + 1b6dbfd commit b800a6f

File tree

10 files changed

+88
-50
lines changed

10 files changed

+88
-50
lines changed

homepage/design-system/src/components/atoms/Icon.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
ChevronLeftIcon,
1313
ChevronRight,
1414
ChevronRightIcon,
15+
ClipboardCheckIcon,
1516
ClipboardIcon,
1617
CodeIcon,
1718
Eye,
@@ -66,6 +67,7 @@ export const icons = {
6667
close: XIcon,
6768
code: CodeIcon,
6869
copy: ClipboardIcon,
70+
copySuccess: ClipboardCheckIcon,
6971
cursor: MousePointer2Icon,
7072
darkTheme: MoonIcon,
7173
delete: TrashIcon,

homepage/design-system/src/components/molecules/CodeGroup.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export function CopyButton({
1111
onCopy,
1212
}: {
1313
code: string;
14-
size: "md" | "lg";
14+
size: "sm" | "md" | "lg";
1515
className?: string;
1616
onCopy?: () => void;
1717
}) {
@@ -32,13 +32,13 @@ export function CopyButton({
3232
type="button"
3333
className={clsx(
3434
className,
35-
"group/button absolute overflow-hidden rounded text-2xs font-medium md:opacity-0 backdrop-blur transition md:focus:opacity-100 group-hover:opacity-100",
35+
"group/button absolute overflow-hidden rounded text-2xs font-medium md:opacity-0 backdrop-blur transition md:focus:opacity-100 group-hover:opacity-100 items-center align-middle p-0",
3636
copied
37-
? "bg-emerald-400/10 ring-1 ring-inset ring-emerald-400/20"
37+
? "bg-blue-400/10 ring-1 ring-inset ring-blue-400/20"
3838
: "bg-white/5 hover:bg-white/7.5 dark:bg-white/2.5 dark:hover:bg-white/5",
39-
size == "md"
39+
size === "md"
4040
? "right-[8.5px] top-[8.5px] py-[2px] pl-1 pr-2"
41-
: "right-2 top-2 py-1 pl-2 pr-3",
41+
: "right-2 top-2 py-1 pl-2 pr-2",
4242
)}
4343
onClick={() => {
4444
window.navigator.clipboard.writeText(code).then(() => {
@@ -60,18 +60,22 @@ export function CopyButton({
6060
className={clsx(
6161
size === "md" ? "size-3" : "size-4",
6262
"stroke-stone-500 transition-colors group-hover/button:stroke-stone-600 dark:group-hover/button:stroke-stone-400",
63+
copied && "stroke-primary",
6364
)}
6465
/>
65-
Copy
66+
{size !== "sm" && "Copy"}
6667
</span>
6768
<span
6869
aria-hidden={!copied}
6970
className={clsx(
70-
"pointer-events-none absolute inset-0 flex items-center justify-center text-emerald-600 transition duration-300 dark:text-emerald-400",
71+
"pointer-events-none absolute inset-0 flex items-center justify-center text-primary transition duration-300",
7172
!copied && "translate-y-1.5 opacity-0",
7273
)}
7374
>
74-
Copied!
75+
{size === "sm" && (
76+
<Icon name="copySuccess" size="xs" className="stroke-primary" />
77+
)}
78+
{size !== "sm" && "Copied!"}
7579
</span>
7680
</button>
7781
);

homepage/design-system/src/components/organisms/Dropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export function DropdownItem({
6060
let classes = clsx(
6161
className,
6262
// Base styles
63-
"group rounded-md space-x-2 focus:outline-none px-2.5 py-1.5",
63+
"group rounded-md space-x-2 focus:outline-none px-2.5 py-1.5",
6464
// Text styles
6565
"text-left text-sm/6 dark:text-white forced-colors:text-[CanvasText]",
6666
// Focus

homepage/design-system/src/utils/tailwindClassesMap.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export type Style =
2222
export const sizeClasses = {
2323
sm: "text-sm py-1 px-2",
2424
md: "py-1.5 px-3",
25-
lg: "md:text-lg py-2 px-3 md:px-8 md:py-3",
25+
lg: "py-2 px-5 md:px-6 md:py-2.5",
2626
};
2727

2828
export const styleToBorderMap = {

homepage/homepage/app/(others)/(home)/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ComingSoonSection } from "@/components/home/ComingSoonSection";
44
import { EarlyAdopterSection } from "@/components/home/EarlyAdopterSection";
55
import { EncryptionSection } from "@/components/home/EncryptionSection";
66
import { FeaturesSection } from "@/components/home/FeaturesSection";
7+
import { GetStartedSnippetSelect } from "@/components/home/GetStartedSnippetSelect";
78
import { HeroSection } from "@/components/home/HeroSection";
89
import { HowJazzWorksSection } from "@/components/home/HowJazzWorksSection";
910
import { LocalFirstFeaturesSection } from "@/components/home/LocalFirstFeaturesSection";
@@ -16,7 +17,8 @@ export default function Home() {
1617
<>
1718
<HeroSection />
1819

19-
<div className="container flex flex-col gap-12 mt-12 lg:gap-20 lg:mt-20">
20+
<div className="container flex flex-col gap-12 lg:gap-20">
21+
<GetStartedSnippetSelect />
2022
<SupportedEnvironmentsSection />
2123
<HowJazzWorksSection />
2224

homepage/homepage/components/SideNavItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function SideNavItem({
1717
}) {
1818
const classes = clsx(
1919
className,
20-
"py-1 px-2 -mx-2 group rounded-md flex items-center transition-colors",
20+
"py-1 px-2 group rounded-md flex items-center transition-colors",
2121
);
2222
const path = usePathname();
2323

@@ -28,7 +28,7 @@ export function SideNavItem({
2828
className={clsx(
2929
classes,
3030
path === href
31-
? "text-stone-900 font-medium bg-stone-100 dark:text-white dark:bg-stone-900"
31+
? "text-stone-900 font-medium bg-stone-200/50 dark:text-white dark:bg-stone-800/50"
3232
: "hover:text-stone-900 dark:hover:text-stone-200",
3333
)}
3434
>

homepage/homepage/components/docs/FrameworkSelect.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,21 @@ import {
1010
DropdownItem,
1111
DropdownMenu,
1212
} from "@garden-co/design-system/src/components/organisms/Dropdown";
13+
import clsx from "clsx";
1314
import { usePathname, useRouter } from "next/navigation";
1415
import { useState } from "react";
1516

16-
export function FrameworkSelect() {
17+
export function FrameworkSelect({
18+
onSelect,
19+
size = "md",
20+
routerPush = true,
21+
className,
22+
}: {
23+
onSelect?: (framework: Framework) => void;
24+
size?: "sm" | "md";
25+
routerPush?: boolean;
26+
className?: string;
27+
}) {
1728
const router = useRouter();
1829
const defaultFramework = useFramework();
1930
const [selectedFramework, setSelectedFramework] =
@@ -23,26 +34,26 @@ export function FrameworkSelect() {
2334

2435
const selectFramework = (newFramework: Framework) => {
2536
setSelectedFramework(newFramework);
26-
router.push(path.replace(defaultFramework, newFramework));
37+
onSelect && onSelect(newFramework);
38+
routerPush && router.push(path.replace(defaultFramework, newFramework));
2739
};
2840

2941
return (
3042
<Dropdown>
3143
<DropdownButton
32-
className="w-full justify-between"
44+
className={clsx("w-full justify-between overflow-hidden text-nowrap", size === "sm" && "text-sm", className)}
3345
as={Button}
3446
variant="outline"
3547
intent="default"
3648
>
37-
{frameworkNames[selectedFramework].label}
49+
<span className="text-nowrap max-w-full overflow-hidden text-ellipsis">{frameworkNames[selectedFramework].label}</span>
3850
<Icon name="chevronDown" size="sm" />
3951
</DropdownButton>
4052
<DropdownMenu className="w-[--button-width] z-50" anchor="bottom start">
4153
{Object.entries(frameworkNames)
42-
.filter(([_, framework]) => !framework.hidden)
4354
.map(([key, framework]) => (
4455
<DropdownItem
45-
className="items-baseline"
56+
className={clsx("items-baseline", size === "sm" && "text-xs text-nowrap", selectedFramework === key && "text-primary dark:text-primary")}
4657
key={key}
4758
onClick={() => selectFramework(key as Framework)}
4859
>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
'use client'
2+
3+
import { Framework } from "@/content/framework";
4+
import { useFramework } from "@/lib/use-framework";
5+
import NpxCreateJazzApp from "@/components/home/NpxCreateJazzApp.mdx";
6+
import { CopyButton } from "@garden-co/design-system/src/components/molecules/CodeGroup";
7+
import { useState } from "react";
8+
import { Button } from "@garden-co/design-system/src/components/atoms/Button";
9+
import Link from "next/link";
10+
import { FrameworkSelect } from "../docs/FrameworkSelect";
11+
import clsx from "clsx";
12+
import { track } from "@vercel/analytics";
13+
import { GappedGrid } from "@garden-co/design-system/src/components/molecules/GappedGrid";
14+
15+
export function GetStartedSnippetSelect() {
16+
const defaultFramework = useFramework();
17+
const [selectedFramework, setSelectedFramework] =
18+
useState<Framework>(defaultFramework);
19+
20+
return (
21+
<GappedGrid>
22+
<div className="relative w-full col-span-2 lg:col-span-3 border-2 border-primary rounded-lg overflow-hidden">
23+
<CopyButton
24+
code="npx create-jazz-app@latest"
25+
size="sm"
26+
className={clsx("mt-0.5 mr-0.5 z-100 md:opacity-100 hidden md:block")}
27+
onCopy={() => track("create-jazz-app command copied from hero")}
28+
/>
29+
<NpxCreateJazzApp />
30+
</div>
31+
<div className="col-span-2 lg:col-span-3 flex flex-row gap-2">
32+
<div className="h-full items-center w-[175px]">
33+
<FrameworkSelect onSelect={setSelectedFramework} size="md" routerPush={false} className="h-full md:px-4" />
34+
</div>
35+
<div className="flex h-full items-center">
36+
<Button intent="primary" size="lg" className="w-full">
37+
<Link className="my-[0.11rem]" href={`/docs/${selectedFramework}`}>Get started</Link>
38+
</Button>
39+
</div>
40+
</div>
41+
</GappedGrid>
42+
);
43+
}

homepage/homepage/components/home/HeroSection.tsx

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
"use client";
22

3-
import CreateJazzApp from "@/components/home/CreateJazzApp.mdx";
43
import { marketingCopy } from "@/content/marketingCopy";
54
import { H1 } from "@garden-co/design-system/src/components/atoms/Headings";
65
import {
76
Icon,
87
type IconName,
98
} from "@garden-co/design-system/src/components/atoms/Icon";
109
import { Kicker } from "@garden-co/design-system/src/components/atoms/Kicker";
11-
import { CopyButton } from "@garden-co/design-system/src/components/molecules/CodeGroup";
1210
import { Prose } from "@garden-co/design-system/src/components/molecules/Prose";
13-
import { SectionHeader } from "@garden-co/design-system/src/components/molecules/SectionHeader";
14-
import { track } from "@vercel/analytics";
1511
import Link from "next/link";
12+
import { GetStartedSnippetSelect } from "./GetStartedSnippetSelect";
13+
1614

1715
const features: Array<{
1816
title: string;
@@ -54,8 +52,8 @@ const features: Array<{
5452

5553
export function HeroSection() {
5654
return (
57-
<div className="container grid items-center gap-x-8 gap-y-12 my-12 md:my-16 lg:my-24 lg:gap-x-10 lg:grid-cols-3">
58-
<div className="flex flex-col justify-center gap-5 lg:col-span-2 lg:gap-8">
55+
<div className="container grid items-center gap-x-8 gap-y-12 my-12 md:my-16 lg:my-24 lg:gap-x-10 lg:grid-cols-12">
56+
<div className="flex flex-col justify-center gap-5 lg:col-span-11 lg:gap-8">
5957
<Kicker>Toolkit for backendless apps</Kicker>
6058
<H1>
6159
<span className="inline-block text-highlight">
@@ -94,31 +92,6 @@ export function HeroSection() {
9492
))}
9593
</div>
9694
</div>
97-
98-
<div className="h-full group grid md:grid-cols-2 items-center lg:grid-cols-1 lg:pt-36">
99-
<SectionHeader
100-
className="md:col-span-2 lg:sr-only"
101-
title="Get a Jazz app running in minutes."
102-
/>
103-
<div className="overflow-hidden sm:rounded-xl sm:border h-full sm:px-8 sm:pt-6 bg-stone-50 dark:bg-stone-950">
104-
<div className="rounded-lg bg-white dark:bg-stone-925 sm:ring-4 ring-stone-400/20 sm:shadow-xl sm:shadow-blue/20 border relative sm:top-2 h-full w-full">
105-
<div className="py-4 flex items-center gap-2.5 px-6 border-b">
106-
<span className="rounded-full size-3 bg-stone-200 dark:bg-stone-900" />
107-
<span className="rounded-full size-3 bg-stone-200 dark:bg-stone-900" />
108-
<span className="rounded-full size-3 bg-stone-200 dark:bg-stone-900" />
109-
<CopyButton
110-
code="npx create-jazz-app@latest"
111-
size="md"
112-
className="mt-0.5 mr-0.5"
113-
onCopy={() => track("create-jazz-app command copied from hero")}
114-
/>
115-
</div>
116-
<div className="p-3">
117-
<CreateJazzApp />
118-
</div>
119-
</div>
120-
</div>
121-
</div>
12295
</div>
12396
);
12497
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```sh
2+
npx create-jazz-app@latest
3+
```

0 commit comments

Comments
 (0)