diff --git a/package.json b/package.json
index 64bbd45a..c9fd20fd 100644
--- a/package.json
+++ b/package.json
@@ -24,7 +24,10 @@
"@electron-toolkit/preload": "^3.0.0",
"@electron-toolkit/utils": "^3.0.0",
"electron-updater": "^6.1.7",
- "electron-window-state": "^5.0.3"
+ "electron-window-state": "^5.0.3",
+ "react-router": "6",
+ "react-router-dom": "6",
+ "styled-components": "^6.1.11"
},
"devDependencies": {
"@electron-toolkit/eslint-config-prettier": "^2.0.0",
@@ -42,6 +45,7 @@
"prettier": "^3.2.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
+ "sass": "^1.77.2",
"typescript": "^5.3.3",
"vite": "^5.0.12"
}
diff --git a/src/main/index.ts b/src/main/index.ts
index 7ca3843f..ecf5f751 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -1,7 +1,7 @@
import { app, shell, BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
-import icon from '../../resources/icon.png?asset'
+import icon from '@/renderer/resources/icon.png?asset'
import windowStateKeeper from 'electron-window-state'
function createWindow(): void {
@@ -19,6 +19,7 @@ function createWindow(): void {
height: mainWindowState.height,
show: false,
autoHideMenuBar: true,
+ titleBarStyle: 'hiddenInset',
...(process.platform === 'linux' ? { icon } : {}),
webPreferences: {
preload: join(__dirname, '../preload/index.js'),
diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx
index af20fb6f..7f30f5a2 100644
--- a/src/renderer/src/App.tsx
+++ b/src/renderer/src/App.tsx
@@ -1,35 +1,29 @@
-import Versions from './components/Versions'
-import electronLogo from './assets/electron.svg'
+import styled from 'styled-components'
+import Sidebar from './components/app/Sidebar'
+import Statusbar from './components/app/Statusbar'
+import HomePage from './pages/home/HomePage'
+import { BrowserRouter, Routes, Route } from 'react-router-dom'
+import AppsPage from './pages/apps/AppsPage'
function App(): JSX.Element {
- const ipcHandle = (): void => window.electron.ipcRenderer.send('ping')
-
return (
- <>
-
-
Powered by electron-vite
-
- Build an Electron app with React
- and TypeScript
-
-
- Please try pressing F12 to open the devTool
-
-
-
- >
+
+
+
+
+ } />
+ } />
+
+
+
+
)
}
+const MainContainer = styled.main`
+ display: flex;
+ flex-direction: row;
+ flex: 1;
+`
+
export default App
diff --git a/src/renderer/src/assets/base.css b/src/renderer/src/assets/css/base.css
similarity index 68%
rename from src/renderer/src/assets/base.css
rename to src/renderer/src/assets/css/base.css
index 5ed6406a..12f96af3 100644
--- a/src/renderer/src/assets/base.css
+++ b/src/renderer/src/assets/css/base.css
@@ -21,6 +21,12 @@
--ev-button-alt-hover-border: transparent;
--ev-button-alt-hover-text: var(--ev-c-text-1);
--ev-button-alt-hover-bg: var(--ev-c-gray-2);
+
+ --navbar-height: 48px;
+ --sidebar-width: 64px;
+ --conversations-width: 240px;
+ --settings-width: 320px;
+ --status-bar-height: 48px;
}
:root {
@@ -29,6 +35,7 @@
--color-background-mute: var(--ev-c-black-mute);
--color-text: var(--ev-c-text-1);
+ --color-text-2: var(--ev-c-text-2);
}
*,
@@ -65,3 +72,33 @@ body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
+
+body {
+ display: flex;
+ overflow: hidden;
+ background-size: cover;
+ user-select: none;
+ background-color: #0b0a09;
+}
+
+code {
+ font-weight: 600;
+ padding: 3px 5px;
+ border-radius: 2px;
+ background-color: var(--color-background-mute);
+ font-family:
+ ui-monospace,
+ SFMono-Regular,
+ SF Mono,
+ Menlo,
+ Consolas,
+ Liberation Mono,
+ monospace;
+ font-size: 85%;
+}
+
+#root {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/src/renderer/src/assets/electron.svg b/src/renderer/src/assets/images/electron.svg
similarity index 100%
rename from src/renderer/src/assets/electron.svg
rename to src/renderer/src/assets/images/electron.svg
diff --git a/src/renderer/src/assets/images/logo.png b/src/renderer/src/assets/images/logo.png
new file mode 100644
index 00000000..db60a331
Binary files /dev/null and b/src/renderer/src/assets/images/logo.png differ
diff --git a/src/renderer/src/assets/images/sidebar_app_active.png b/src/renderer/src/assets/images/sidebar_app_active.png
new file mode 100644
index 00000000..57749e60
Binary files /dev/null and b/src/renderer/src/assets/images/sidebar_app_active.png differ
diff --git a/src/renderer/src/assets/images/sidebar_message_active.png b/src/renderer/src/assets/images/sidebar_message_active.png
new file mode 100644
index 00000000..b18b8813
Binary files /dev/null and b/src/renderer/src/assets/images/sidebar_message_active.png differ
diff --git a/src/renderer/src/assets/main.css b/src/renderer/src/assets/main.css
deleted file mode 100644
index 0179fc4c..00000000
--- a/src/renderer/src/assets/main.css
+++ /dev/null
@@ -1,171 +0,0 @@
-@import './base.css';
-
-body {
- display: flex;
- align-items: center;
- justify-content: center;
- overflow: hidden;
- background-image: url('./wavy-lines.svg');
- background-size: cover;
- user-select: none;
-}
-
-code {
- font-weight: 600;
- padding: 3px 5px;
- border-radius: 2px;
- background-color: var(--color-background-mute);
- font-family:
- ui-monospace,
- SFMono-Regular,
- SF Mono,
- Menlo,
- Consolas,
- Liberation Mono,
- monospace;
- font-size: 85%;
-}
-
-#root {
- display: flex;
- align-items: center;
- justify-content: center;
- flex-direction: column;
- margin-bottom: 80px;
-}
-
-.logo {
- margin-bottom: 20px;
- -webkit-user-drag: none;
- height: 128px;
- width: 128px;
- will-change: filter;
- transition: filter 300ms;
-}
-
-.logo:hover {
- filter: drop-shadow(0 0 1.2em #6988e6aa);
-}
-
-.creator {
- font-size: 14px;
- line-height: 16px;
- color: var(--ev-c-text-2);
- font-weight: 600;
- margin-bottom: 10px;
-}
-
-.text {
- font-size: 28px;
- color: var(--ev-c-text-1);
- font-weight: 700;
- line-height: 32px;
- text-align: center;
- margin: 0 10px;
- padding: 16px 0;
-}
-
-.tip {
- font-size: 16px;
- line-height: 24px;
- color: var(--ev-c-text-2);
- font-weight: 600;
-}
-
-.react {
- background: -webkit-linear-gradient(315deg, #087ea4 55%, #7c93ee);
- background-clip: text;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- font-weight: 700;
-}
-
-.ts {
- background: -webkit-linear-gradient(315deg, #3178c6 45%, #f0dc4e);
- background-clip: text;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- font-weight: 700;
-}
-
-.actions {
- display: flex;
- padding-top: 32px;
- margin: -6px;
- flex-wrap: wrap;
- justify-content: flex-start;
-}
-
-.action {
- flex-shrink: 0;
- padding: 6px;
-}
-
-.action a {
- cursor: pointer;
- text-decoration: none;
- display: inline-block;
- border: 1px solid transparent;
- text-align: center;
- font-weight: 600;
- white-space: nowrap;
- border-radius: 20px;
- padding: 0 20px;
- line-height: 38px;
- font-size: 14px;
- border-color: var(--ev-button-alt-border);
- color: var(--ev-button-alt-text);
- background-color: var(--ev-button-alt-bg);
-}
-
-.action a:hover {
- border-color: var(--ev-button-alt-hover-border);
- color: var(--ev-button-alt-hover-text);
- background-color: var(--ev-button-alt-hover-bg);
-}
-
-.versions {
- position: absolute;
- bottom: 30px;
- margin: 0 auto;
- padding: 15px 0;
- font-family: 'Menlo', 'Lucida Console', monospace;
- display: inline-flex;
- overflow: hidden;
- align-items: center;
- border-radius: 22px;
- background-color: #202127;
- backdrop-filter: blur(24px);
-}
-
-.versions li {
- display: block;
- float: left;
- border-right: 1px solid var(--ev-c-gray-1);
- padding: 0 20px;
- font-size: 14px;
- line-height: 14px;
- opacity: 0.8;
- &:last-child {
- border: none;
- }
-}
-
-@media (max-width: 720px) {
- .text {
- font-size: 20px;
- }
-}
-
-@media (max-width: 620px) {
- .versions {
- display: none;
- }
-}
-
-@media (max-width: 350px) {
- .tip,
- .actions {
- display: none;
- }
-}
diff --git a/src/renderer/src/components/Versions.tsx b/src/renderer/src/components/Versions.tsx
deleted file mode 100644
index dac185fd..00000000
--- a/src/renderer/src/components/Versions.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { useState } from 'react'
-
-function Versions(): JSX.Element {
- const [versions] = useState(window.electron.process.versions)
-
- return (
-
- - Electron v{versions.electron}
- - Chromium v{versions.chrome}
- - Node v{versions.node}
-
- )
-}
-
-export default Versions
diff --git a/src/renderer/src/components/app/Navbar.tsx b/src/renderer/src/components/app/Navbar.tsx
new file mode 100644
index 00000000..ff83105b
--- /dev/null
+++ b/src/renderer/src/components/app/Navbar.tsx
@@ -0,0 +1,50 @@
+import { FC, PropsWithChildren } from 'react'
+import styled from 'styled-components'
+
+interface Props extends PropsWithChildren {}
+
+export const Navbar: FC = ({ children }) => {
+ return {children}
+}
+
+export const NavbarLeft: FC = ({ children }) => {
+ return {children}
+}
+
+export const NavbarCenter: FC = ({ children }) => {
+ return {children}
+}
+
+export const NavbarRight: FC = ({ children }) => {
+ return {children}
+}
+
+const NavbarContainer = styled.div`
+ min-width: 100%;
+ display: flex;
+ flex-direction: row;
+ height: var(--navbar-height);
+ border-bottom: 1px solid #ffffff20;
+ -webkit-app-region: drag;
+`
+
+const NavbarLeftContainer = styled.div`
+ min-width: var(--conversations-width);
+ border-right: 1px solid #ffffff20;
+`
+
+const NavbarCenterContainer = styled.div`
+ flex: 1;
+ display: flex;
+ align-items: center;
+ font-size: 14px;
+ font-weight: bold;
+ color: var(--color-text-1);
+ text-align: center;
+ border-right: 1px solid #ffffff20;
+ padding: 0 16px;
+`
+
+const NavbarRightContainer = styled.div`
+ min-width: var(--settings-width);
+`
diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx
new file mode 100644
index 00000000..e34389dd
--- /dev/null
+++ b/src/renderer/src/components/app/Sidebar.tsx
@@ -0,0 +1,91 @@
+import { FC } from 'react'
+import Logo from '@renderer/assets/images/electron.svg'
+import AppIcon from '@renderer/assets/images/sidebar_app_active.png'
+import MessageIcon from '@renderer/assets/images/sidebar_message_active.png'
+import styled from 'styled-components'
+import { Link, useLocation } from 'react-router-dom'
+
+const Sidebar: FC = () => {
+ const { pathname } = useLocation()
+
+ const isRoute = (path: string): string => (pathname === path ? 'active' : '')
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 16px 0;
+ min-width: var(--sidebar-width);
+ min-height: 100%;
+ border-top: 1px solid #ffffff20;
+ border-right: 1px solid #ffffff20;
+ margin-top: 47px;
+`
+
+const Avatar = styled.div``
+const AvatarImg = styled.img`
+ border-radius: 50%;
+ width: 36px;
+ height: 36px;
+ background-color: var(--color-background-soft);
+ margin: 5px 0;
+`
+const Menus = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+`
+
+const Icon = styled.div`
+ width: 40px;
+ height: 40px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 4px;
+ margin-bottom: 5px;
+ transition: background-color 0.2s ease;
+ &:hover {
+ background-color: #ffffff30;
+ cursor: pointer;
+ .icon-img {
+ filter: invert(1);
+ }
+ }
+ &.active {
+ background-color: #ffffff20;
+ .icon-img {
+ filter: invert(1);
+ }
+ }
+`
+
+const IconImage = styled.img`
+ width: 20px;
+ height: 20px;
+ filter: invert(0.6);
+ transition: filter 0.2s ease;
+`
+
+export default Sidebar
diff --git a/src/renderer/src/components/app/Statusbar.tsx b/src/renderer/src/components/app/Statusbar.tsx
new file mode 100644
index 00000000..ef109005
--- /dev/null
+++ b/src/renderer/src/components/app/Statusbar.tsx
@@ -0,0 +1,46 @@
+import { FC } from 'react'
+import styled from 'styled-components'
+
+const Statusbar: FC = () => {
+ return (
+
+
+
+ Cherry AI v0.1.0
+
+ )
+}
+
+const Container = styled.div`
+ min-height: var(--status-bar-height);
+ border-top: 1px solid #ffffff20;
+ display: flex;
+ flex-direction: row;
+ position: absolute;
+ bottom: 0;
+ left: var(--sidebar-width);
+ right: 0;
+ background-color: #0b0a09;
+`
+
+const StatusbarLeft = styled.div`
+ min-width: var(--sidebar-width) + var(--conversations-width);
+`
+
+const StatusbarCenter = styled.div`
+ flex: 1;
+ display: flex;
+`
+
+const StatusbarRight = styled.div`
+ min-width: var(--settings-width);
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-end;
+ font-size: 12px;
+ color: var(--color-text-2);
+ padding-right: 16px;
+`
+
+export default Statusbar
diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx
index f4d40c7e..9389d369 100644
--- a/src/renderer/src/main.tsx
+++ b/src/renderer/src/main.tsx
@@ -1,4 +1,4 @@
-import './assets/main.css'
+import './assets/css/base.css'
import React from 'react'
import ReactDOM from 'react-dom/client'
diff --git a/src/renderer/src/pages/apps/AppsPage.tsx b/src/renderer/src/pages/apps/AppsPage.tsx
new file mode 100644
index 00000000..9f89935c
--- /dev/null
+++ b/src/renderer/src/pages/apps/AppsPage.tsx
@@ -0,0 +1,20 @@
+import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar'
+import { FC } from 'react'
+import styled from 'styled-components'
+
+const AppsPage: FC = () => {
+ return (
+
+
+ APP
+
+
+ )
+}
+
+const Container = styled.div`
+ display: flex;
+ flex: 1;
+`
+
+export default AppsPage
diff --git a/src/renderer/src/pages/home/HomePage.tsx b/src/renderer/src/pages/home/HomePage.tsx
new file mode 100644
index 00000000..bcb6d702
--- /dev/null
+++ b/src/renderer/src/pages/home/HomePage.tsx
@@ -0,0 +1,54 @@
+import { Navbar, NavbarCenter, NavbarLeft, NavbarRight } from '@renderer/components/app/Navbar'
+import { FC } from 'react'
+import styled from 'styled-components'
+
+const HomePage: FC = () => {
+ return (
+
+
+
+ Cherry AI
+
+
+
+
+
+
+
+
+ )
+}
+
+const MainContainer = styled.div`
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+`
+
+const ContentContainer = styled.div`
+ display: flex;
+ flex: 1;
+ flex-direction: row;
+`
+
+const Conversations = styled.div`
+ display: flex;
+ min-width: var(--conversations-width);
+ border-right: 1px solid #ffffff20;
+ height: 100%;
+`
+
+const Chat = styled.div`
+ display: flex;
+ height: 100%;
+ flex: 1;
+ border-right: 1px solid #ffffff20;
+`
+
+const Settings = styled.div`
+ display: flex;
+ height: 100%;
+ min-width: var(--settings-width);
+`
+
+export default HomePage
diff --git a/yarn.lock b/yarn.lock
index 8afc307e..36086806 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -318,6 +318,23 @@
minimatch "^3.0.4"
plist "^3.0.4"
+"@emotion/is-prop-valid@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337"
+ integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+
+"@emotion/memoize@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
+ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+
+"@emotion/unitless@0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
"@esbuild/aix-ppc64@0.19.12":
version "0.19.12"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f"
@@ -691,6 +708,11 @@
resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31"
integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==
+"@remix-run/router@1.16.1":
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd"
+ integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==
+
"@rollup/rollup-android-arm-eabi@4.17.2":
version "4.17.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d"
@@ -926,6 +948,11 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
+"@types/stylis@4.2.5":
+ version "4.2.5"
+ resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df"
+ integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==
+
"@types/verror@^1.10.3":
version "1.10.10"
resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.10.tgz#d5a4b56abac169bfbc8b23d291363a682e6fa087"
@@ -1106,6 +1133,14 @@ ansi-styles@^6.1.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
app-builder-bin@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0"
@@ -1288,6 +1323,11 @@ base64-js@^1.3.1, base64-js@^1.5.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
bluebird-lst@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
@@ -1320,7 +1360,7 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
-braces@^3.0.3:
+braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -1437,6 +1477,11 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+camelize@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3"
+ integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
+
caniuse-lite@^1.0.30001587:
version "1.0.30001620"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz#78bb6f35b8fe315b96b8590597094145d0b146b4"
@@ -1459,6 +1504,21 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+"chokidar@>=3.0.0 <4.0.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
@@ -1578,7 +1638,21 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
-csstype@^3.0.2:
+css-color-keywords@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
+ integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==
+
+css-to-react-native@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32"
+ integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==
+ dependencies:
+ camelize "^1.0.0"
+ css-color-keywords "^1.0.0"
+ postcss-value-parser "^4.0.2"
+
+csstype@3.1.3, csstype@^3.0.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
@@ -2397,7 +2471,7 @@ get-symbol-description@^1.0.2:
es-errors "^1.3.0"
get-intrinsic "^1.2.4"
-glob-parent@^5.1.2:
+glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -2620,6 +2694,11 @@ ignore@^5.2.0, ignore@^5.2.4:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+immutable@^4.0.0:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447"
+ integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==
+
import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -2677,6 +2756,13 @@ is-bigint@^1.0.1:
dependencies:
has-bigints "^1.0.1"
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
is-boolean-object@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
@@ -2742,7 +2828,7 @@ is-generator-function@^1.0.10:
dependencies:
has-tostringtag "^1.0.0"
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -3182,6 +3268,11 @@ node-releases@^2.0.14:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
normalize-url@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
@@ -3337,6 +3428,11 @@ picocolors@^1.0.0, picocolors@^1.0.1:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
picomatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
@@ -3356,7 +3452,12 @@ possible-typed-array-names@^1.0.0:
resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
-postcss@^8.4.38:
+postcss-value-parser@^4.0.2:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@8.4.38, postcss@^8.4.38:
version "8.4.38"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
@@ -3445,6 +3546,21 @@ react-refresh@^0.14.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9"
integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==
+react-router-dom@6:
+ version "6.23.1"
+ resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f"
+ integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==
+ dependencies:
+ "@remix-run/router" "1.16.1"
+ react-router "6.23.1"
+
+react-router@6, react-router@6.23.1:
+ version "6.23.1"
+ resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9"
+ integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==
+ dependencies:
+ "@remix-run/router" "1.16.1"
+
react@^18.2.0:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
@@ -3464,6 +3580,13 @@ read-config-file@6.3.2:
json5 "^2.2.0"
lazy-val "^1.0.4"
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
reflect.getprototypeof@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
@@ -3610,6 +3733,15 @@ sanitize-filename@^1.6.3:
dependencies:
truncate-utf8-bytes "^1.0.0"
+sass@^1.77.2:
+ version "1.77.2"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa"
+ integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==
+ dependencies:
+ chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
+ source-map-js ">=0.6.2 <2.0.0"
+
sax@^1.2.4:
version "1.3.0"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0"
@@ -3666,6 +3798,11 @@ set-function-name@^2.0.1, set-function-name@^2.0.2:
functions-have-names "^1.2.3"
has-property-descriptors "^1.0.2"
+shallowequal@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+ integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -3719,7 +3856,7 @@ smart-buffer@^4.0.2:
resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-source-map-js@^1.2.0:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
@@ -3830,6 +3967,26 @@ strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+styled-components@^6.1.11:
+ version "6.1.11"
+ resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.11.tgz#01948e5195bf1d39e57e0a85b41958c80e40cfb8"
+ integrity sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==
+ dependencies:
+ "@emotion/is-prop-valid" "1.2.2"
+ "@emotion/unitless" "0.8.1"
+ "@types/stylis" "4.2.5"
+ css-to-react-native "3.2.0"
+ csstype "3.1.3"
+ postcss "8.4.38"
+ shallowequal "1.1.0"
+ stylis "4.3.2"
+ tslib "2.6.2"
+
+stylis@4.3.2:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444"
+ integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==
+
sumchecker@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
@@ -3930,7 +4087,7 @@ ts-api-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
-tslib@^2.6.2:
+tslib@2.6.2, tslib@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==