diff --git a/package-lock.json b/package-lock.json
index 4700b2e..f07ccd0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,8 +9,8 @@
"version": "0.0.7",
"license": "MIT",
"dependencies": {
- "@codex-storage/marketplace-ui-components": "^0.0.25",
- "@codex-storage/sdk-js": "^0.0.9",
+ "@codex-storage/marketplace-ui-components": "^0.0.27",
+ "@codex-storage/sdk-js": "^0.0.12",
"@sentry/browser": "^8.32.0",
"@sentry/react": "^8.31.0",
"@tanstack/react-query": "^5.51.15",
@@ -374,9 +374,9 @@
"dev": true
},
"node_modules/@codex-storage/marketplace-ui-components": {
- "version": "0.0.25",
- "resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.25.tgz",
- "integrity": "sha512-oWR/E0yNWK/Lj2LI3lAqKDzuMw6sTUyYfkhZBbV4yK/4VnGtIIoW0OU+jggishJYAwh3y4s71OfMjWaGGafWlQ==",
+ "version": "0.0.27",
+ "resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.27.tgz",
+ "integrity": "sha512-jCNUFeHNUptKSupSCQriwTXjK0zC8Yi7kcVWI20p9GtfNKPMRykhrpqGgQ6AdMMB9ZAliY5m+PH9ie3J/PWicw==",
"dependencies": {
"lucide-react": "^0.453.0"
},
@@ -384,7 +384,7 @@
"node": ">=18"
},
"peerDependencies": {
- "@codex-storage/sdk-js": ">=0.0.7",
+ "@codex-storage/sdk-js": ">=0.0.12",
"react": "^18.3.1",
"react-dom": "^18.3.1"
}
@@ -398,9 +398,9 @@
}
},
"node_modules/@codex-storage/sdk-js": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@codex-storage/sdk-js/-/sdk-js-0.0.9.tgz",
- "integrity": "sha512-HZvfMa0ss155+Q8oxLDHBeCGvIZfWA9/m0it01z3SS7WQvwtIrP2XiWj82LJxl3u98P5yXhfHyj4K44eTI/ibw==",
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/@codex-storage/sdk-js/-/sdk-js-0.0.12.tgz",
+ "integrity": "sha512-WjMZ9fkeVFBdDlFViWRDIirk2s4nX0U5r4WixAeieAkDBlRq5nqWcm9rqz5/8u8EQudgk/y3p0vPZc8cpyK4bA==",
"dependencies": {
"valibot": "^0.32.0"
},
diff --git a/package.json b/package.json
index 19ceb0e..a5ea368 100644
--- a/package.json
+++ b/package.json
@@ -24,8 +24,8 @@
"React"
],
"dependencies": {
- "@codex-storage/marketplace-ui-components": "^0.0.25",
- "@codex-storage/sdk-js": "^0.0.9",
+ "@codex-storage/marketplace-ui-components": "^0.0.27",
+ "@codex-storage/sdk-js": "^0.0.12",
"@sentry/browser": "^8.32.0",
"@sentry/react": "^8.31.0",
"@tanstack/react-query": "^5.51.15",
diff --git a/public/img/avatar.png b/public/img/avatar.png
new file mode 100644
index 0000000..1b14108
Binary files /dev/null and b/public/img/avatar.png differ
diff --git a/public/img/avatar.webp b/public/img/avatar.webp
new file mode 100644
index 0000000..2d800fd
Binary files /dev/null and b/public/img/avatar.webp differ
diff --git a/public/img/avatar@1.5x.png b/public/img/avatar@1.5x.png
new file mode 100644
index 0000000..063a63e
Binary files /dev/null and b/public/img/avatar@1.5x.png differ
diff --git a/public/img/avatar@1.5x.webp b/public/img/avatar@1.5x.webp
new file mode 100644
index 0000000..6ce7d15
Binary files /dev/null and b/public/img/avatar@1.5x.webp differ
diff --git a/public/img/avatar@2x.png b/public/img/avatar@2x.png
new file mode 100644
index 0000000..3e103b3
Binary files /dev/null and b/public/img/avatar@2x.png differ
diff --git a/public/img/avatar@2x.webp b/public/img/avatar@2x.webp
new file mode 100644
index 0000000..453ee11
Binary files /dev/null and b/public/img/avatar@2x.webp differ
diff --git a/public/img/avatar@3x.png b/public/img/avatar@3x.png
new file mode 100644
index 0000000..57b91d4
Binary files /dev/null and b/public/img/avatar@3x.png differ
diff --git a/public/img/avatar@3x.webp b/public/img/avatar@3x.webp
new file mode 100644
index 0000000..f6826e7
Binary files /dev/null and b/public/img/avatar@3x.webp differ
diff --git a/public/img/avatar@4x.png b/public/img/avatar@4x.png
new file mode 100644
index 0000000..8a0d5a2
Binary files /dev/null and b/public/img/avatar@4x.png differ
diff --git a/public/img/avatar@4x.webp b/public/img/avatar@4x.webp
new file mode 100644
index 0000000..610e555
Binary files /dev/null and b/public/img/avatar@4x.webp differ
diff --git a/src/components/AlphaText/AlphaText.tsx b/src/components/AlphaText/AlphaText.tsx
index 6a679f7..94c33b7 100644
--- a/src/components/AlphaText/AlphaText.tsx
+++ b/src/components/AlphaText/AlphaText.tsx
@@ -1,35 +1,40 @@
-export function AlphaText() {
+type Props = {
+ variant: "default" | "failure";
+ className?: string;
+ width?: number;
+};
+
+export function AlphaText({ variant, className = "", width = 72 }: Props) {
+ const attr =
+ variant === "default"
+ ? { opacity: "0.6", fill: "white" }
+ : { fill: "#CC6C6C" };
return (
);
diff --git a/src/components/AppBar/AppBar.tsx b/src/components/AppBar/AppBar.tsx
index f5c8c1c..2abbac9 100644
--- a/src/components/AppBar/AppBar.tsx
+++ b/src/components/AppBar/AppBar.tsx
@@ -1,6 +1,7 @@
-import { Menu } from "lucide-react";
import "./appBar.css";
-import { ReactNode } from "react";
+import { DashboardIcon } from "../DashboardIcon/DashboardIcon";
+import { NodeIndicator } from "../NodeIndicator/NodeIndicator";
+import { HttpNetworkIndicator } from "../HttpNetworkIndicator/HttpNetworkIndicator";
type Props = {
/**
@@ -8,23 +9,31 @@ type Props = {
* menu button.
*/
onExpand: () => void;
-
- /**
- * React node to add to the right part of the application bar
- */
- Right: ReactNode;
};
-export function AppBar({ onExpand, Right }: Props) {
+export function AppBar(props: Props) {
+ console.info(props);
return (
-
+ {/*
-
-
Home
+ */}
+
+
+
+
+
+
Dashboard
+
+ Get Overview of your Codex Vault
+
+
+
+
+
+
-
{Right}
);
}
diff --git a/src/components/AppBar/appBar.css b/src/components/AppBar/appBar.css
index f2be905..90ad824 100644
--- a/src/components/AppBar/appBar.css
+++ b/src/components/AppBar/appBar.css
@@ -1,10 +1,13 @@
.appBar {
- height: 40px;
+ height: 80px;
justify-content: space-between;
border-bottom: 1px solid var(--codex-border-color);
view-transition-name: main-header;
display: flex;
- padding: 0.75rem 1.5rem;
+ padding: 20px 40px 20px 40px;
+ border-bottom: 1px solid #2b303b;
+ box-sizing: border-box;
+ background-color: #1c1c1c;
}
.appBar-burger {
@@ -18,11 +21,36 @@
.appBar-right {
display: flex;
align-items: center;
+ gap: 16px;
}
-.appBar-left,
-.appBar-right {
- gap: 0.75rem;
+.appBar-icon {
+ background: #141414;
+ height: 48px;
+ width: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #353639;
+ border-radius: 50%;
+}
+
+.appBar-title {
+ font-family: Inter;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 24px;
+ letter-spacing: -0.015em;
+ color: white;
+}
+
+.appBar-subtitle {
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ letter-spacing: -0.006em;
+ color: #969696cc;
}
@media (min-width: 1000px) {
diff --git a/src/components/DashboardIcon/DashboardIcon.tsx b/src/components/DashboardIcon/DashboardIcon.tsx
new file mode 100644
index 0000000..b64ed92
--- /dev/null
+++ b/src/components/DashboardIcon/DashboardIcon.tsx
@@ -0,0 +1,15 @@
+export function DashboardIcon() {
+ return (
+
+ );
+}
diff --git a/src/components/ErrorCircleIcon/ErrorCircleIcon.tsx b/src/components/ErrorCircleIcon/ErrorCircleIcon.tsx
new file mode 100644
index 0000000..79d0658
--- /dev/null
+++ b/src/components/ErrorCircleIcon/ErrorCircleIcon.tsx
@@ -0,0 +1,21 @@
+type Props = {
+ className?: string;
+};
+
+export function ErrorCircleIcon({ className = "" }: Props) {
+ return (
+
+
+
+ );
+}
diff --git a/src/components/HttpNetworkIndicator/HttpNetworkIndicator.css b/src/components/HttpNetworkIndicator/HttpNetworkIndicator.css
new file mode 100644
index 0000000..1125719
--- /dev/null
+++ b/src/components/HttpNetworkIndicator/HttpNetworkIndicator.css
@@ -0,0 +1,24 @@
+.network-indicator {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.network-indicator-icon {
+ background-color: #141414;
+ border-radius: var(--codex-border-radius);
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.network-indicator-text {
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 20px;
+ letter-spacing: -0.006em;
+ color: #8d8d8d;
+}
diff --git a/src/components/HttpNetworkIndicator/HttpNetworkIndicator.tsx b/src/components/HttpNetworkIndicator/HttpNetworkIndicator.tsx
index f06a392..d0c98df 100644
--- a/src/components/HttpNetworkIndicator/HttpNetworkIndicator.tsx
+++ b/src/components/HttpNetworkIndicator/HttpNetworkIndicator.tsx
@@ -1,10 +1,16 @@
-import { NetworkIndicator } from "@codex-storage/marketplace-ui-components";
import { useNetwork } from "../../network/useNetwork";
+import { NetworkFlashIcon } from "../NetworkFlashIcon/NetworkFlashIcon";
+import "./HttpNetworkIndicator.css";
export function HttpNetworkIndicator() {
const online = useNetwork();
- const text = online ? "Online" : "Offline";
-
- return ;
+ return (
+
+ );
}
diff --git a/src/components/ManifestFetch/ManifestFetch.tsx b/src/components/ManifestFetch/ManifestFetch.tsx
index 054081b..99bfa22 100644
--- a/src/components/ManifestFetch/ManifestFetch.tsx
+++ b/src/components/ManifestFetch/ManifestFetch.tsx
@@ -2,23 +2,26 @@ import { Button, Input } from "@codex-storage/marketplace-ui-components";
import "./ManifestFetch.css";
import { ChangeEvent, useState } from "react";
import { CodexSdk } from "../../sdk/codex";
-import { useQuery } from "@tanstack/react-query";
+import { useQuery, useQueryClient } from "@tanstack/react-query";
import { Promises } from "../../utils/promises";
export function ManifestFetch() {
const [cid, setCid] = useState("");
+ const queryClient = useQueryClient();
const { refetch } = useQuery({
- queryFn: () =>
- CodexSdk.data()
+ queryFn: () => {
+ return CodexSdk.data()
.fetchManifest(cid)
.then((s) => {
if (s.error === false) {
setCid("");
+ queryClient.invalidateQueries({ queryKey: ["cids"] });
}
return Promises.rejectOnError(s);
- }),
- queryKey: ["cids"],
+ });
+ },
+ queryKey: ["manifest"],
// Disable the fetch to make it available on refetch only
enabled: false,
@@ -44,6 +47,7 @@ export function ManifestFetch() {
diff --git a/src/components/Menu/NodesIcon.tsx b/src/components/Menu/NodesIcon.tsx
index 37e02af..241836a 100644
--- a/src/components/Menu/NodesIcon.tsx
+++ b/src/components/Menu/NodesIcon.tsx
@@ -1,4 +1,18 @@
-export function NodesIcon() {
+type Props = {
+ variant: "default" | "success" | "failure";
+};
+
+export function NodesIcon({ variant }: Props) {
+ let color = "currentColor";
+
+ if (variant === "success") {
+ color = "#3EE089";
+ }
+
+ if (variant === "failure") {
+ color = "var(--codex-color-error-hexa)";
+ }
+
return (
);
diff --git a/src/components/NetworkFlashIcon/NetworkFlashIcon.tsx b/src/components/NetworkFlashIcon/NetworkFlashIcon.tsx
new file mode 100644
index 0000000..2aa98ed
--- /dev/null
+++ b/src/components/NetworkFlashIcon/NetworkFlashIcon.tsx
@@ -0,0 +1,18 @@
+type Props = {
+ online: boolean;
+};
+
+export function NetworkFlashIcon({ online }: Props) {
+ const color = online ? "#3EE089" : "var(--codex-color-error-hexa)";
+
+ return (
+
+ );
+}
diff --git a/src/components/NetworkIcon/NetworkIcon.tsx b/src/components/NetworkIcon/NetworkIcon.tsx
index 4b62669..e1cf31b 100644
--- a/src/components/NetworkIcon/NetworkIcon.tsx
+++ b/src/components/NetworkIcon/NetworkIcon.tsx
@@ -3,9 +3,7 @@ type Props = {
};
export function NetworkIcon({ active }: Props) {
- const stroke = active
- ? "var(--codex-color-primary)"
- : "rgb(var(--codex-color-error))";
+ const stroke = active ? "#3EE089" : "rgb(var(--codex-color-error))";
return (