Skip to content

Commit 4b976e3

Browse files
chore(ci): 🤖 remove contributors workflow file (#98)
1 parent fa059bb commit 4b976e3

File tree

8 files changed

+150
-46
lines changed

8 files changed

+150
-46
lines changed

‎.github/workflows/contributors.yml‎

Lines changed: 0 additions & 16 deletions
This file was deleted.

‎README.md‎

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div align="center">
2-
<h1 align="center"><a aria-label="Frappe UI React" href="https://github.com/timelessco/frappe-ui-react">Frappe UI React</a></h1>
2+
<h1 align="center"><a aria-label="Frappe UI React" href="https://github.com/timelessco/frappe-ui-react">Frappe UI React & React Native</a></h1>
33
<p align="center">A React component library implementing Frappe's Espresso UI design system.</p>
44
</div>
55

@@ -20,13 +20,13 @@
2020

2121
## Overview
2222

23-
frappe-ui-react is a comprehensive React component library that implements Frappe's Espresso UI design system. While Frappe officially uses Vue.js internally, this library bridges the gap for React developers in the Frappe ecosystem who want to maintain consistent design language across their applications.
23+
frappe-ui-react is a comprehensive React & React Native component library that implements Frappe's Espresso UI design system. While Frappe officially uses Vue.js internally, this library bridges the gap for React developers in the Frappe ecosystem who want to maintain consistent design language across their applications.
2424

2525
## Why This Library?
2626

2727
### Community Need
2828

29-
The Frappe ecosystem provides excellent tools including a [React SDK](https://github.com/The-Commit-Company/frappe-react-sdk) for backend interactions, but lacks official React UI components. This forces React developers to either:
29+
The Frappe ecosystem provides excellent tools including a [React SDK](https://github.com/The-Commit-Company/frappe-react-sdk) for backend interactions, but lacks official React components. This forces React developers to either:
3030

3131
- Build UI components from scratch
3232
- Use inconsistent UI libraries that don't match Frappe's design language
@@ -58,10 +58,29 @@ This library ensures React applications can maintain the same look and feel as o
5858
### Built With
5959

6060
- React 18+
61+
- React Native
6162
- TypeScript
6263
- Tailwind CSS
6364
- Radix UI (for accessible primitives)
6465

66+
### Build the nextjs registry with docs website
67+
68+
```bash
69+
turbo run build
70+
```
71+
72+
### Build and start the nextjs registry with docs website
73+
74+
```bash
75+
turbo run start
76+
```
77+
78+
## Available demos
79+
80+
- [`/gameplan`](https://frappe-ui-react.tmls.dev/gameplan) - showcases the Frappe Gameplan app block
81+
- [`/lms`](https://frappe-ui-react.tmls.dev/lms) - showcases the Frappe LMS app block
82+
- [`/kitchen-sink`](https://frappe-ui-react.tmls.dev/kitchen-sink) - showcases all components
83+
6584
### Design System
6685

6786
Components are built following the [Espresso UI Design System](https://www.figma.com/community/file/1407648399328528443) specifications, ensuring:
@@ -76,13 +95,15 @@ Components are built following the [Espresso UI Design System](https://www.figma
7695

7796
```txt
7897
.
79-
└── apps
80-
└── registry (shadcn component registry with nextjs website)
98+
├── apps
99+
│ └── registry (shadcn component registry with nextjs website)
100+
└── native-app (react native app)
81101
```
82102

83103
## Apps
84104

85105
- [apps/registry](./apps/registry): Next.js, Typescript [README](./apps/registry/README.md) | [CHANGELOG](./apps/registry/CHANGELOG.md)
106+
- [native-app](./native-app): Frappe UI React Native, Typescript [README](./native-app/README.md)
86107

87108
## Development
88109

‎apps/registry/README.md‎

Lines changed: 73 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,82 @@
1-
# registry-template
1+
# Frappe UI React Registry
22

3-
You can use the `shadcn` CLI to run your own component registry. Running your own
4-
component registry allows you to distribute your custom components, hooks, pages, and
5-
other files to any React project.
3+
A design-driven React component collection built with Espresso UI principles and Shadcn compatibility. Offers a distributed library of accessible, beautifully-crafted UI elements.
4+
5+
## Features
6+
7+
- Built on Next.js and TypeScript
8+
- Fully compatible with Shadcn CLI
9+
- Dark/light theme support
10+
- Comprehensive design tokens system
11+
- Component distribution via registry.json
12+
- Built-in documentation and kitchen sink demo
613

714
## Getting Started
815

916
This is a template for creating a custom registry using Next.js.
1017

11-
- The template uses a `registry.json` file to define components and their files.
12-
- The `shadcn build` command is used to build the registry.
13-
- The registry items are served as static files under `public/r/[name].json`.
14-
- The template also includes a route handler for serving registry items.
15-
- Every registry item are compatible with the `shadcn` CLI.
16-
- We have also added v0 integration using the `Open in v0` api.
18+
```bash
19+
pnpm install
20+
pnpm dev
21+
```
22+
23+
## Project Structure
24+
25+
```bash
26+
.
27+
├── app
28+
│   ├── docs # Documentation
29+
│   ├── favicon.ico
30+
│   ├── gameplan # /gameplan block demo
31+
│   ├── kitchen-sink # /kitchen-sink block demo
32+
│   ├── lms # /lms block demo
33+
│   ├── page.tsx
34+
├── components
35+
│   └── ui # Component library
36+
│   ├── avatar-group.tsx
37+
│   ├── avatar.tsx
38+
│   ├── badge.tsx
39+
│   ├── button-group.tsx
40+
│   ├── button.tsx
41+
│   ├── dropdown-menu.tsx
42+
│   ├── icon.tsx
43+
│   └── input.tsx
44+
├── icons # Icon components
45+
├── components/ # React components
46+
├── lib/ # Utility functions
47+
├── public/ # Static files
48+
└── registry.json # Component registry config
49+
```
50+
51+
## Build and deploy
52+
53+
Build the registry:
54+
55+
```shell
56+
pnpm run registry:build
57+
```
58+
59+
Then build the registry app:
60+
61+
```shell
62+
pnpm run build
63+
```
64+
65+
## Available demos
66+
67+
- [`/gameplan`](https://frappe-ui-react.tmls.dev/gameplan) - showcases the Frappe Gameplan app block
68+
- [`/lms`](https://frappe-ui-react.tmls.dev/lms) - showcases the Frappe LMS app block
69+
- [`/kitchen-sink`](https://frappe-ui-react.tmls.dev/kitchen-sink) - showcases all components
1770

1871
## Documentation
1972

20-
Visit the [shadcn documentation](https://ui.shadcn.com/docs/registry) to view the full documentation.
73+
Visit the [shadcn documentation](https://ui.shadcn.com/docs/registry) to learn more about:
74+
75+
- Registry configuration
76+
- Component development
77+
- Distribution setup
78+
- CLI usage
79+
80+
## License
81+
82+
MIT License - See [LICENSE](LICENSE) for details.

‎apps/registry/app/docs/layout.tsx‎

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { redirect, usePathname } from "next/navigation";
44

55
import { DocsSidebarNav } from "@/components/docs-sidebar";
6+
import { Navbar } from "@/components/navbar";
67
import registry from "@/registry.json";
78

89
interface RegistryItem {
@@ -79,6 +80,10 @@ export default function DocsLayout({
7980
title: "LMS",
8081
href: "/lms",
8182
},
83+
{
84+
title: "All Components",
85+
href: "/kitchen-sink",
86+
},
8287
],
8388
},
8489
...Object.entries(categoryGroups).map(([category, categoryItems]) => {
@@ -102,13 +107,16 @@ export default function DocsLayout({
102107
];
103108

104109
return (
105-
<div className="relative mx-auto w-full max-w-[540px] px-4 md:max-w-[720px] lg:max-w-[960px] xl:max-w-[1140px]">
106-
<div className="grid grid-cols-1 gap-8 py-8 md:grid-cols-[250px_1fr]">
107-
<aside className="border-r pr-4">
108-
<DocsSidebarNav items={items} />
109-
</aside>
110-
<main className="prose max-w-none dark:prose-invert">{children}</main>
110+
<>
111+
<Navbar />
112+
<div className="relative mx-auto w-full max-w-[540px] px-4 md:max-w-[720px] lg:max-w-[960px] xl:max-w-[1140px]">
113+
<div className="grid grid-cols-1 gap-8 py-8 md:grid-cols-[250px_1fr]">
114+
<aside className="border-r pr-4">
115+
<DocsSidebarNav items={items} />
116+
</aside>
117+
<main className="prose max-w-none dark:prose-invert">{children}</main>
118+
</div>
111119
</div>
112-
</div>
120+
</>
113121
);
114122
}

‎apps/registry/app/kitchen-sink/page.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default function Home() {
2727
return (
2828
<div className="relative mx-auto w-full max-w-[540px] px-4 py-8 md:max-w-[720px] lg:max-w-[960px] xl:max-w-[1140px]">
2929
<header className="relative flex flex-col gap-1 py-8">
30-
<h1 className="text-3xl font-bold tracking-tight">Kitchen Sink</h1>
30+
<h1 className="text-3xl font-bold tracking-tight">All Components</h1>
3131
<p className="text-outline-gray-5">
3232
A collection of components to test the frappe-ui-react library.
3333
</p>

‎apps/registry/app/page.tsx‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { PeopleIcon } from "@/icons/line/people";
1414
import { SmallDownIcon } from "@/icons/line/small-down";
1515
import { SmallRightChevronIcon } from "@/icons/line/small-right-chevron";
1616
import { SortIcon } from "@/icons/line/sort";
17+
import Logo from "@/icons/logo";
1718

1819
import CourseImg1 from "./lms/_images/course-img-1.png";
1920

@@ -123,15 +124,18 @@ export default function IndexPage() {
123124
size="sm"
124125
prefix={<SmallRightChevronIcon />}
125126
>
126-
<Link href="/gameplan">Browse examples</Link>
127+
<Link href="/gameplan">
128+
Browse examples
129+
<SmallRightChevronIcon />
130+
</Link>
127131
</Badge>
128132
<h1 className="pb-4 text-[42px] font-ef-bold leading-[115%] tracking-[0.18px] text-ink-gray-8">
129133
Frappe UI Component Registry
130134
</h1>
131135
<p className="max-w-[555px] text-[18px] font-ef-regular leading-[150%] tracking-[0.18px] text-ink-gray-7">
132-
A design-driven React component collection built with Espresso UI
133-
principles and Shadcn compatibility. Offers a distributed library of
134-
accessible, beautifully-crafted UI elements.
136+
A design-driven React and React Native component collection built
137+
with Espresso UI principles and Shadcn compatibility. Offers a
138+
distributed library of accessible, beautifully-crafted UI elements.
135139
</p>
136140
<div className="mt-5 flex items-center space-x-2">
137141
<Button variant="solid" size="lg" asChild>
@@ -686,7 +690,8 @@ function Navbar() {
686690
return (
687691
<header className="sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
688692
<div className="container relative mx-auto flex items-center justify-between p-4">
689-
<div className="flex items-center gap-6">
693+
<div className="flex items-center gap-2">
694+
<Logo className="text-lg" />
690695
<Link href="/" className="font-semibold">
691696
Frappe UI React
692697
</Link>

‎apps/registry/components/navbar.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ import Link from "next/link";
22
import { GithubIcon } from "lucide-react";
33

44
import { ModeToggle } from "@/components/mode-toggle";
5+
import Logo from "@/icons/logo";
56

67
import { Button } from "./ui/button";
78

89
export function Navbar() {
910
return (
1011
<header className="sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
1112
<div className="relative mx-auto flex w-full max-w-[540px] items-center justify-between p-4 md:max-w-[720px] lg:max-w-[960px] xl:max-w-[1140px]">
12-
<div className="flex items-center gap-6">
13+
<div className="flex items-center gap-2">
14+
<Logo className="text-lg" />
1315
<Link href="/" className="font-semibold">
1416
Frappe UI React
1517
</Link>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import * as React from "react";
2+
3+
import { Icon } from "@/components/ui/icon";
4+
5+
function Logo(props: React.SVGProps<SVGSVGElement>) {
6+
return (
7+
<Icon
8+
viewBox="0 0 24 20"
9+
fill="none"
10+
xmlns="http://www.w3.org/2000/svg"
11+
{...props}
12+
>
13+
<path
14+
d="M5.446 1.873c.86-.499 11.98-.81 12.962 0 1.014.842 4.454 6.173 4.27 6.828-.522 1.777-9.276 9.79-10.75 9.79-1.598 0-10.352-8.169-10.751-9.79-.154-.592 3.378-6.298 4.27-6.828zM17.547 8.596l-5.61 10.029m5.61-10.029h5.282m-5.282 0L14.46 1.375m3.086 7.221H1.418"
15+
stroke="#050505"
16+
strokeWidth={1.5}
17+
/>
18+
</Icon>
19+
);
20+
}
21+
22+
export default Logo;

0 commit comments

Comments
 (0)