Skip to content

Commit

Permalink
ui: standalone UIKit and refactor (janhq#557)
Browse files Browse the repository at this point in the history
* Eslint import order

* Initial Uikit

* Rename file with camelCase

* Remove unused code

* Remove unused code

* Set position traficlight mac

* Grouping Ribbon, Topbar and Bottombar as layout

* Added image brand

* Moving feature toggle into context folder

* Fix active state of setting menu

* Cleanup downloadModel atom helper

* Cleanup useGetConfigureModel

* Added wave animation

* Create useMainViewState intead of import helper atom

* Remove unused code

* Take a back switch ui

* Toggle using switch component

* Add dynamic primary color

* Cleanup import

* Added uikit scroll area

* Add best practice form

* Added toaster container

* Fix loader container

* Add hooks useDownloadState

* Added tooltip on ribbon menu

* Added case user multiple download model

* Adjust input style with bigger ring

* Restyle my model screen

* Replace useStartStop model with useActiveModel

* Import icon using Icon name

* Fix missing login loading start and stop model

* WIP integrate with cmdk

* Move layout search bar on middle of app

* Added function cancel download

* Cleanup model explore

* Cleanup unused code

* Move app version in bototmbar or footer

* WIP chat screen

* WIP chat screen

* Cleanup style and remove unsed code

* Added command for showing downloaded model

* Fix missing keyframe loader dot animation

* Conditional loader of plugin setting

* WIP history list message

* chore: rebase main

* Adding script ui into root package

* Fix different version react hooks form

* Add close toaster

* Added status model active or not on list of command

* Conditional showing info if user don't have a model

* Disabled toolbar chat when user not yet have convo

* chore: fix state

* fix: get resource atom

* Fix conditional bottom bar

* fix: model download state

* Fix font

* Improve icon my model

* Add toaster delete chat

* Remove test classname

* Fix scroll chat body

* Fix scrolling chat body

* chore: add message update

* Add uikit into depedencies on root package

* Update chat flow

* Fix hot reload ui changes

* Increate background color chat screen light mode

* Added visual conversation active state

* Added build:uikit on gh actions

* chore: attempt to fix CI

* fix: deps

* fix: tests

* chore: attempt to fix CI

---------

Co-authored-by: Louis <[email protected]>
  • Loading branch information
urmauur and louis-jan authored Nov 7, 2023
1 parent fc3352b commit 2394c13
Show file tree
Hide file tree
Showing 267 changed files with 4,404 additions and 6,488 deletions.
46 changes: 33 additions & 13 deletions .github/workflows/jan-electron-linter-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,31 @@ on:
branches:
- main
paths:
- 'electron/**'
- "electron/**"
- .github/workflows/jan-electron-linter-and-test.yml
- 'web/**'
- 'package.json'
- 'node_modules/**'
- 'yarn.lock'
- "web/**"
- "uikit/**"
- "package.json"
- "node_modules/**"
- "yarn.lock"

pull_request:
branches:
- main
paths:
- 'electron/**'
- "electron/**"
- .github/workflows/linter-and-test.yml
- 'web/**'
- 'package.json'
- 'node_modules/**'
- 'yarn.lock'
- "web/**"
- "uikit/**"
- "package.json"
- "node_modules/**"
- "yarn.lock"

jobs:
test-on-macos:
runs-on: [self-hosted, macOS, macos-desktop]
steps:
- name: 'Cleanup build folder'
- name: "Cleanup build folder"
run: |
ls -la ./
rm -rf ./* || true
Expand All @@ -41,6 +43,12 @@ jobs:
with:
node-version: 20

- name: Build uikit
run: |
cd uikit
yarn install
yarn build
- name: Linter and test
run: |
yarn config set network-timeout 300000
Expand Down Expand Up @@ -73,6 +81,12 @@ jobs:
with:
node-version: 20

- name: Build uikit
run: |
cd uikit
yarn install
yarn build
- name: Linter and test
run: |
yarn config set network-timeout 300000
Expand All @@ -85,7 +99,7 @@ jobs:
test-on-ubuntu:
runs-on: [self-hosted, Linux, ubuntu-desktop]
steps:
- name: 'Cleanup build folder'
- name: "Cleanup build folder"
run: |
ls -la ./
rm -rf ./* || true
Expand All @@ -100,6 +114,12 @@ jobs:
with:
node-version: 20

- name: Build uikit
run: |
cd uikit
yarn install
yarn build
- name: Linter and test
run: |
export DISPLAY=$(w -h | awk 'NR==1 {print $2}')
Expand All @@ -109,4 +129,4 @@ jobs:
yarn install
yarn build:plugins
yarn build:test-linux
yarn test
yarn test
5 changes: 3 additions & 2 deletions electron/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,12 @@ app.on("quit", () => {
function createMainWindow() {
mainWindow = new BrowserWindow({
width: 1200,
minWidth: 800,
height: 800,
show: false,
trafficLightPosition: {
x: 16,
y: 10,
x: 10,
y: 15,
},
titleBarStyle: "hidden",
vibrancy: "sidebar",
Expand Down
8 changes: 1 addition & 7 deletions electron/tests/explore.e2e.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,6 @@ test.afterAll(async () => {

test("explores models", async () => {
await page.getByTestId("Explore Models").first().click();
const header = await page
.getByRole("heading")
.filter({ hasText: "Explore Models" })
.first()
.isDisabled();
expect(header).toBe(false);

await page.getByTestId("testid-explore-models").isVisible();
// More test cases here...
});
2 changes: 1 addition & 1 deletion electron/tests/my-models.e2e.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ test.afterAll(async () => {

test("shows my models", async () => {
await page.getByTestId("My Models").first().click();
await page.getByTestId("testid-mymodels-header").isVisible();
await page.getByTestId("testid-my-models").isVisible();
// More test cases here...
});
19 changes: 12 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,17 @@
"private": true,
"workspaces": {
"packages": [
"uikit",
"core",
"electron",
"web",
"server"
],
"nohoist": [
"uikit",
"uikit/*",
"core",
"core/*",
"electron",
"electron/**",
"web",
Expand All @@ -23,13 +29,15 @@
"dev:web": "yarn workspace jan-web dev",
"dev": "concurrently --kill-others \"yarn dev:web\" \"wait-on http://localhost:3000 && yarn dev:electron\"",
"test-local": "yarn lint && yarn build:test && yarn test",
"dev:uikit": "yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit dev",
"build:uikit": "yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit build",
"build:core": "cd core && yarn install && yarn run build",
"build:web": "yarn workspace jan-web build && cpx \"web/out/**\" \"electron/renderer/\"",
"build:electron": "yarn workspace jan build",
"build:electron:test": "yarn workspace jan build:test",
"build:pull-plugins": "rimraf ./electron/core/pre-install/*.tgz && cd ./electron/core/pre-install && npm pack @janhq/inference-plugin @janhq/monitoring-plugin",
"build:plugins": "rimraf ./electron/core/pre-install/*.tgz && concurrently --kill-others-on-fail \"cd ./plugins/conversational-plugin && npm install && npm run postinstall && npm run build:publish\" \"cd ./plugins/inference-plugin && npm install --ignore-scripts && npm run postinstall:dev && npm run build:publish\" \"cd ./plugins/model-plugin && npm install && npm run postinstall && npm run build:publish\" \"cd ./plugins/monitoring-plugin && npm install && npm run postinstall && npm run build:publish\"",
"build:plugins-web": "rimraf ./electron/core/pre-install/*.tgz && concurrently --kill-others-on-fail \"cd ./plugins/conversational-plugin && npm install && npm run build:deps && npm run postinstall\" \"cd ./plugins/inference-plugin && npm install && npm run postinstall\" \"cd ./plugins/model-plugin && npm install && npm run postinstall\" \"cd ./plugins/monitoring-plugin && npm install && npm run postinstall\" && concurrently --kill-others-on-fail \"cd ./plugins/conversational-plugin && npm run build:publish\" \"cd ./plugins/inference-plugin && npm run build:publish\" \"cd ./plugins/model-plugin && npm run build:publish\" \"cd ./plugins/monitoring-plugin && npm run build:publish\"",
"build:plugins": "rimraf ./electron/core/pre-install/*.tgz && concurrently --kill-others-on-fail \"cd ./plugins/conversational-json && npm install && npm run postinstall && npm run build:publish\" \"cd ./plugins/inference-plugin && npm install --ignore-scripts && npm run postinstall:dev && npm run build:publish\" \"cd ./plugins/model-plugin && npm install && npm run postinstall && npm run build:publish\" \"cd ./plugins/monitoring-plugin && npm install && npm run postinstall && npm run build:publish\"",
"build:plugins-web": "rimraf ./electron/core/pre-install/*.tgz && concurrently --kill-others-on-fail \"cd ./plugins/conversational-json && npm install && npm run build:deps && npm run postinstall\" \"cd ./plugins/inference-plugin && npm install && npm run postinstall\" \"cd ./plugins/model-plugin && npm install && npm run postinstall\" \"cd ./plugins/monitoring-plugin && npm install && npm run postinstall\" && concurrently --kill-others-on-fail \"cd ./plugins/conversational-json && npm run build:publish\" \"cd ./plugins/inference-plugin && npm run build:publish\" \"cd ./plugins/model-plugin && npm run build:publish\" \"cd ./plugins/monitoring-plugin && npm run build:publish\"",
"build": "yarn build:web && yarn build:electron",
"build:test": "yarn build:web && yarn build:electron:test",
"build:test-darwin": "yarn build:web && yarn workspace jan build:test-darwin",
Expand All @@ -42,7 +50,7 @@
"build:publish-darwin": "yarn build:web && yarn workspace jan build:publish-darwin",
"build:publish-win32": "yarn build:web && yarn workspace jan build:publish-win32",
"build:publish-linux": "yarn build:web && yarn workspace jan build:publish-linux",
"build:web-plugins": "yarn build:web && yarn build:plugins-web && mkdir -p \"./web/out/plugins/conversational-plugin\" && cp \"./plugins/conversational-plugin/dist/index.js\" \"./web/out/plugins/conversational-plugin\" && mkdir -p \"./web/out/plugins/inference-plugin\" && cp \"./plugins/inference-plugin/dist/index.js\" \"./web/out/plugins/inference-plugin\" && mkdir -p \"./web/out/plugins/model-plugin\" && cp \"./plugins/model-plugin/dist/index.js\" \"./web/out/plugins/model-plugin\" && mkdir -p \"./web/out/plugins/monitoring-plugin\" && cp \"./plugins/monitoring-plugin/dist/index.js\" \"./web/out/plugins/monitoring-plugin\"",
"build:web-plugins": "yarn build:web && yarn build:plugins-web && mkdir -p \"./web/out/plugins/conversational-json\" && cp \"./plugins/conversational-json/dist/index.js\" \"./web/out/plugins/conversational-json\" && mkdir -p \"./web/out/plugins/inference-plugin\" && cp \"./plugins/inference-plugin/dist/index.js\" \"./web/out/plugins/inference-plugin\" && mkdir -p \"./web/out/plugins/model-plugin\" && cp \"./plugins/model-plugin/dist/index.js\" \"./web/out/plugins/model-plugin\" && mkdir -p \"./web/out/plugins/monitoring-plugin\" && cp \"./plugins/monitoring-plugin/dist/index.js\" \"./web/out/plugins/monitoring-plugin\"",
"server:prod": "yarn workspace server build && yarn build:web-plugins && cpx \"web/out/**\" \"server/build/renderer/\" && mkdir -p ./server/build/@janhq && cp -r ./plugins/* ./server/build/@janhq",
"start:server": "yarn server:prod && node server/build/main.js"
},
Expand All @@ -52,8 +60,5 @@
"rimraf": "^3.0.2",
"wait-on": "^7.0.1"
},
"version": "0.0.0",
"dependencies": {
"@janhq/core": "file:core"
}
"version": "0.0.0"
}
5 changes: 5 additions & 0 deletions uikit/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.next/
node_modules/
dist/
*.hbs
*.mdx
8 changes: 8 additions & 0 deletions uikit/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"semi": false,
"singleQuote": true,
"quoteProps": "consistent",
"trailingComma": "es5",
"endOfLine": "lf",
"plugins": ["prettier-plugin-tailwindcss"]
}
53 changes: 53 additions & 0 deletions uikit/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"name": "@janhq/uikit",
"version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist/**"
],
"scripts": {
"build:styles": "postcss src/main.scss -o dist/index.css --use postcss-import",
"build:react": "tsup src/index.{ts,tsx} --format cjs,esm --dts --external react react-dom --minify terser --splitting --sourcemap",
"dev:react": "tsup src/index.{ts,tsx} --format cjs,esm --watch --dts",
"dev:styles": "postcss src/main.scss -o dist/index.css -u postcss-import -w",
"build": "yarn build:styles && yarn build:react",
"dev": "concurrently --kill-others \"yarn dev:styles\" \"yarn dev:react\""
},
"dependencies": {
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-context": "^1.0.1",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-progress": "^1.0.3",
"@radix-ui/react-scroll-area": "^1.0.5",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-toast": "^1.1.5",
"@radix-ui/react-tooltip": "^1.0.7",
"autoprefixer": "^10.4.16",
"class-variance-authority": "^0.7.0",
"cmdk": "^0.2.0",
"lucide-react": "^0.292.0",
"postcss": "^8.4.31",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.47.0",
"scss": "^0.2.4",
"tailwindcss": "^3.3.5"
},
"devDependencies": {
"concurrently": "^8.2.2",
"postcss-cli": "^10.1.0",
"postcss-import": "^15.1.0",
"prejss-cli": "^0.3.3",
"prettier": "^3.0.3",
"prettier-plugin-tailwindcss": "^0.5.6",
"tailwind-merge": "^2.0.0",
"terser": "^5.24.0",
"tsup": "^7.2.0",
"typescript": "^5.2.2"
}
}
8 changes: 8 additions & 0 deletions uikit/postcss.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
plugins: {
"tailwindcss/nesting": {},
tailwindcss: {},
autoprefixer: {},
"postcss-import": {},
},
};
43 changes: 43 additions & 0 deletions uikit/src/avatar/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
'use client'

import { forwardRef, ElementRef, ComponentPropsWithoutRef } from 'react'
import * as AvatarPrimitive from '@radix-ui/react-avatar'
import { twMerge } from 'tailwind-merge'

const Avatar = forwardRef<
ElementRef<typeof AvatarPrimitive.Root>,
ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
>(({ className, ...props }, ref) => (
<AvatarPrimitive.Root
ref={ref}
className={twMerge('avatar', className)}
{...props}
/>
))
Avatar.displayName = AvatarPrimitive.Root.displayName

const AvatarImage = forwardRef<
ElementRef<typeof AvatarPrimitive.Image>,
ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
>(({ className, ...props }, ref) => (
<AvatarPrimitive.Image
ref={ref}
className={twMerge('avatar-image', className)}
{...props}
/>
))
AvatarImage.displayName = AvatarPrimitive.Image.displayName

const AvatarFallback = forwardRef<
ElementRef<typeof AvatarPrimitive.Fallback>,
ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
>(({ className, ...props }, ref) => (
<AvatarPrimitive.Fallback
ref={ref}
className={twMerge('avatar-fallback', className)}
{...props}
/>
))
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName

export { Avatar, AvatarImage, AvatarFallback }
11 changes: 11 additions & 0 deletions uikit/src/avatar/styles.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.avatar {
@apply relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full;

&-image {
@apply aspect-square h-full w-full;
}

&-fallback {
@apply bg-muted flex h-full w-full items-center justify-center rounded-full font-bold uppercase;
}
}
30 changes: 30 additions & 0 deletions uikit/src/badge/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import * as React from 'react'
import { cva, type VariantProps } from 'class-variance-authority'
import { twMerge } from 'tailwind-merge'

const badgeVariants = cva('badge', {
variants: {
themes: {
primary: 'badge-primary',
success: 'badge-success',
secondary: 'badge-secondary',
danger: 'badge-danger',
outline: 'badge-outline',
},
},
defaultVariants: {
themes: 'primary',
},
})

export interface BadgeProps
extends React.HTMLAttributes<HTMLDivElement>,
VariantProps<typeof badgeVariants> {}

function Badge({ className, themes, ...props }: BadgeProps) {
return (
<div className={twMerge(badgeVariants({ themes }), className)} {...props} />
)
}

export { Badge, badgeVariants }
23 changes: 23 additions & 0 deletions uikit/src/badge/styles.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
.badge {
@apply focus:ring-ring border-border inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2;

&-primary {
@apply bg-primary text-primary-foreground hover:bg-primary/80 border-transparent;
}

&-success {
@apply border-transparent bg-green-500 text-green-900 hover:bg-green-500/80;
}

&-secondary {
@apply bg-secondary text-secondary-foreground hover:bg-secondary/80;
}

&-danger {
@apply bg-danger text-danger-foreground hover:bg-danger/80 border-transparent;
}

&-outline {
@apply text-foreground border-border border;
}
}
Loading

0 comments on commit 2394c13

Please sign in to comment.