feat(web): add JerapahFlow brand assets and apply them in the UI
Organize mark, wordmark, app icon, and YAML file icon under the theme brand folder. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -3,7 +3,9 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>scrunner</title>
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
||||||
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||||
|
<title>JerapahFlow</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
@@ -15,6 +15,7 @@ import {
|
|||||||
LuUsers,
|
LuUsers,
|
||||||
} from "react-icons/lu";
|
} from "react-icons/lu";
|
||||||
import { useLogout } from "../api/hooks.js";
|
import { useLogout } from "../api/hooks.js";
|
||||||
|
import { brandMark } from "../theme/brand.js";
|
||||||
import { useTheme } from "../theme.jsx";
|
import { useTheme } from "../theme.jsx";
|
||||||
|
|
||||||
const links = [
|
const links = [
|
||||||
@@ -57,7 +58,10 @@ export function Layout({ user, children }) {
|
|||||||
<LuMenu className="size-5" />
|
<LuMenu className="size-5" />
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 px-2 text-lg font-semibold">scrunner</div>
|
<div className="flex flex-1 items-center gap-2 px-2 text-lg font-semibold">
|
||||||
|
<img src={brandMark} alt="" className="size-8 object-contain" />
|
||||||
|
JerapahFlow
|
||||||
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -87,7 +91,12 @@ export function Layout({ user, children }) {
|
|||||||
<div className="drawer-side z-20">
|
<div className="drawer-side z-20">
|
||||||
<label htmlFor="nav-drawer" aria-label="Close menu" className="drawer-overlay" />
|
<label htmlFor="nav-drawer" aria-label="Close menu" className="drawer-overlay" />
|
||||||
<ul className="menu bg-base-200 min-h-full w-64 p-4">
|
<ul className="menu bg-base-200 min-h-full w-64 p-4">
|
||||||
<li className="menu-title">scrunner</li>
|
<li className="mb-2">
|
||||||
|
<div className="pointer-events-none flex items-center gap-2">
|
||||||
|
<img src={brandMark} alt="" className="size-8 object-contain" />
|
||||||
|
<span className="text-base font-semibold text-base-content">JerapahFlow</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
{navItems.map(({ to, label, icon: Icon, end }) => (
|
{navItems.map(({ to, label, icon: Icon, end }) => (
|
||||||
<li key={to}>
|
<li key={to}>
|
||||||
<NavLink to={to} end={end} onClick={closeDrawer}>
|
<NavLink to={to} end={end} onClick={closeDrawer}>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { brandWorkflowFile } from "../theme/brand.js";
|
||||||
|
|
||||||
|
export function WorkflowFileIcon({ className = "size-8" }) {
|
||||||
|
return (
|
||||||
|
<img
|
||||||
|
src={brandWorkflowFile}
|
||||||
|
alt=""
|
||||||
|
className={`${className} object-contain`}
|
||||||
|
aria-hidden
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ import { useState } from "react";
|
|||||||
import { LuLogIn, LuUserPlus } from "react-icons/lu";
|
import { LuLogIn, LuUserPlus } from "react-icons/lu";
|
||||||
import { errorMessage } from "../api/client.js";
|
import { errorMessage } from "../api/client.js";
|
||||||
import { useLogin, useRegister } from "../api/hooks.js";
|
import { useLogin, useRegister } from "../api/hooks.js";
|
||||||
|
import { brandBanner } from "../theme/brand.js";
|
||||||
|
|
||||||
export function AuthPage({ needsSetup }) {
|
export function AuthPage({ needsSetup }) {
|
||||||
const login = useLogin();
|
const login = useLogin();
|
||||||
@@ -25,6 +26,11 @@ export function AuthPage({ needsSetup }) {
|
|||||||
<legend className="fieldset-legend text-lg">
|
<legend className="fieldset-legend text-lg">
|
||||||
{needsSetup ? "Create admin" : "Sign in"}
|
{needsSetup ? "Create admin" : "Sign in"}
|
||||||
</legend>
|
</legend>
|
||||||
|
<img
|
||||||
|
src={brandBanner}
|
||||||
|
alt="JerapahFlow"
|
||||||
|
className="mb-2 w-full rounded-box bg-neutral object-contain"
|
||||||
|
/>
|
||||||
<label className="label" htmlFor="username">
|
<label className="label" htmlFor="username">
|
||||||
Username
|
Username
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
useSetWorkflowEnabled,
|
useSetWorkflowEnabled,
|
||||||
useWorkflow,
|
useWorkflow,
|
||||||
} from "../api/hooks.js";
|
} from "../api/hooks.js";
|
||||||
|
import { WorkflowFileIcon } from "../components/WorkflowFileIcon.jsx";
|
||||||
import { WorkflowVisualEditor } from "../components/workflow/WorkflowVisualEditor.jsx";
|
import { WorkflowVisualEditor } from "../components/workflow/WorkflowVisualEditor.jsx";
|
||||||
import { NEW_WORKFLOW_YAML, parseWorkflowYaml } from "../lib/workflow-doc.js";
|
import { NEW_WORKFLOW_YAML, parseWorkflowYaml } from "../lib/workflow-doc.js";
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ function WorkflowEditorLayout({
|
|||||||
<Link to={backTo} className="btn btn-ghost btn-sm btn-square" aria-label="Back">
|
<Link to={backTo} className="btn btn-ghost btn-sm btn-square" aria-label="Back">
|
||||||
<LuArrowLeft className="size-4" />
|
<LuArrowLeft className="size-4" />
|
||||||
</Link>
|
</Link>
|
||||||
|
<WorkflowFileIcon className="size-8 shrink-0" />
|
||||||
<h1 className="truncate text-xl font-semibold">{title}</h1>
|
<h1 className="truncate text-xl font-semibold">{title}</h1>
|
||||||
<div className="flex-1" />
|
<div className="flex-1" />
|
||||||
{onToggleEnabled ? (
|
{onToggleEnabled ? (
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
useSetWorkflowEnabled,
|
useSetWorkflowEnabled,
|
||||||
useWorkflows,
|
useWorkflows,
|
||||||
} from "../api/hooks.js";
|
} from "../api/hooks.js";
|
||||||
|
import { WorkflowFileIcon } from "../components/WorkflowFileIcon.jsx";
|
||||||
import { formatTime, WorkflowStatusBadge } from "../lib/format.jsx";
|
import { formatTime, WorkflowStatusBadge } from "../lib/format.jsx";
|
||||||
|
|
||||||
export function WorkflowsPage() {
|
export function WorkflowsPage() {
|
||||||
@@ -120,9 +121,10 @@ export function WorkflowsPage() {
|
|||||||
<tr key={w.key} className="hover">
|
<tr key={w.key} className="hover">
|
||||||
<td>
|
<td>
|
||||||
<Link
|
<Link
|
||||||
className="link"
|
className="link inline-flex items-center gap-2"
|
||||||
to={`/workflows/${encodeURIComponent(w.owner)}/${encodeURIComponent(w.file)}/edit`}
|
to={`/workflows/${encodeURIComponent(w.owner)}/${encodeURIComponent(w.file)}/edit`}
|
||||||
>
|
>
|
||||||
|
<WorkflowFileIcon className="size-7 shrink-0" />
|
||||||
{w.name}
|
{w.name}
|
||||||
</Link>
|
</Link>
|
||||||
{!w.registered ? (
|
{!w.registered ? (
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import mark from "./brand/mark.png";
|
||||||
|
import wordmark from "./brand/wordmark.png";
|
||||||
|
import icon from "./brand/icon.png";
|
||||||
|
import fileYaml from "./brand/file-yaml.png";
|
||||||
|
|
||||||
|
/** Giraffe mark only. */
|
||||||
|
export const brandMark = mark;
|
||||||
|
/** Mark + JerapahFlow wordmark. */
|
||||||
|
export const brandBanner = wordmark;
|
||||||
|
/** App icon (giraffe + JF). */
|
||||||
|
export const brandAppIcon = icon;
|
||||||
|
/** Workflow YAML file icon. */
|
||||||
|
export const brandWorkflowFile = fileYaml;
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.1 KiB |
Reference in New Issue
Block a user