+
current
)}
diff --git a/packages/local-explorer-ui/src/components/studio/Code/Block.tsx b/packages/local-explorer-ui/src/components/studio/Code/Block.tsx
index be67412096..744559d172 100644
--- a/packages/local-explorer-ui/src/components/studio/Code/Block.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Code/Block.tsx
@@ -11,7 +11,7 @@ export function CodeBlock({
}: CodeBlockProps): JSX.Element {
return (
diff --git a/packages/local-explorer-ui/src/components/studio/Explain/SQLiteExplainTab.tsx b/packages/local-explorer-ui/src/components/studio/Explain/SQLiteExplainTab.tsx
index 5e5af49d39..b1859d4784 100644
--- a/packages/local-explorer-ui/src/components/studio/Explain/SQLiteExplainTab.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Explain/SQLiteExplainTab.tsx
@@ -116,7 +116,7 @@ function describeExplainNode(d: string): {
label: (
SCAN
-
+
{d.substring("SCAN ".length)}
diff --git a/packages/local-explorer-ui/src/components/studio/Modal/DropTableConfirmation.tsx b/packages/local-explorer-ui/src/components/studio/Modal/DropTableConfirmation.tsx
index c9c2b47895..7103268ab1 100644
--- a/packages/local-explorer-ui/src/components/studio/Modal/DropTableConfirmation.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Modal/DropTableConfirmation.tsx
@@ -73,7 +73,7 @@ export function DropTableConfirmationModal({
setChallengeInput(e.target.value)}
value={challengeInput}
/>
diff --git a/packages/local-explorer-ui/src/components/studio/Modal/Export/OptionsEditor.tsx b/packages/local-explorer-ui/src/components/studio/Modal/Export/OptionsEditor.tsx
index 09edad15e8..1652a27a0f 100644
--- a/packages/local-explorer-ui/src/components/studio/Modal/Export/OptionsEditor.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Modal/Export/OptionsEditor.tsx
@@ -51,7 +51,7 @@ export function StudioExportOptionEditor({
Filename
{
onChange((prev) => ({
...prev,
@@ -82,7 +82,7 @@ function SQLExportEditor({
Batch Size
{
const batchSize = Number(e.target.value);
if (isNaN(batchSize) || batchSize < 1) {
@@ -111,7 +111,7 @@ function SQLExportEditor({
{
const maxStatementLength = Number(e.target.value);
if (isNaN(maxStatementLength) || maxStatementLength < 1) {
@@ -135,7 +135,7 @@ function SQLExportEditor({
Table Name
{
onChange((prev) => ({
...prev,
@@ -248,7 +248,7 @@ function SettingItem({ children, lastItem }: SettingItemProps): JSX.Element {
{children}
@@ -277,7 +277,7 @@ function SettingOptionDropdown({
}: SettingOptionDropdownProps): JSX.Element {
return (
): void => {
onChange(e.target.value);
}}
diff --git a/packages/local-explorer-ui/src/components/studio/Modal/Export/index.tsx b/packages/local-explorer-ui/src/components/studio/Modal/Export/index.tsx
index 8e68989f25..a77e6804dd 100644
--- a/packages/local-explorer-ui/src/components/studio/Modal/Export/index.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Modal/Export/index.tsx
@@ -84,12 +84,12 @@ export function StudioExportModal({
-
+
{error && (
-
+
{error}
)}
diff --git a/packages/local-explorer-ui/src/components/studio/QueryResult/Tab.tsx b/packages/local-explorer-ui/src/components/studio/QueryResult/Tab.tsx
index 5ca3bd736e..3c6c8d1e3a 100644
--- a/packages/local-explorer-ui/src/components/studio/QueryResult/Tab.tsx
+++ b/packages/local-explorer-ui/src/components/studio/QueryResult/Tab.tsx
@@ -46,7 +46,7 @@ export function StudioQueryResultTab({
-
+
ul > li[aria-selected]": {
- backgroundColor: "var(--color-accent)",
+ backgroundColor: "var(--studio-editor-panel-hover)",
borderRadius: "3px",
- color: "var(--color-text)",
+ color: "var(--studio-editor-panel-text)",
},
});
diff --git a/packages/local-explorer-ui/src/components/studio/SQLEditor/StatementHighlightExtension.ts b/packages/local-explorer-ui/src/components/studio/SQLEditor/StatementHighlightExtension.ts
index e32097055f..2e7a7682b1 100644
--- a/packages/local-explorer-ui/src/components/studio/SQLEditor/StatementHighlightExtension.ts
+++ b/packages/local-explorer-ui/src/components/studio/SQLEditor/StatementHighlightExtension.ts
@@ -259,7 +259,7 @@ const SqlStatementStateField = StateField.define({
const SqlStatementTheme = EditorView.baseTheme({
".cm-highlight-statement": {
- borderLeft: "3px solid #ff9ff3 !important",
+ borderLeft: "3px solid var(--studio-statement-highlight-border) !important",
},
});
diff --git a/packages/local-explorer-ui/src/components/studio/SkeletonBlock.tsx b/packages/local-explorer-ui/src/components/studio/SkeletonBlock.tsx
index 23c90a6a7c..d24de78953 100644
--- a/packages/local-explorer-ui/src/components/studio/SkeletonBlock.tsx
+++ b/packages/local-explorer-ui/src/components/studio/SkeletonBlock.tsx
@@ -20,7 +20,7 @@ export function SkeletonBlock({
return (
({
let textClass = "flex items-center justify-end h-full pr-2 font-mono";
let tdClass =
- "sticky left-0 bg-bg-secondary border-r border-b border-border";
+ "sticky left-0 bg-kumo-elevated border-r border-b border-kumo-fill";
if (state.getSelectedRowIndex().includes(absoluteRowIndex)) {
if (state.isFullSelectionRow(absoluteRowIndex)) {
textClass = cn(
"flex h-full items-center justify-end pr-2 font-mono",
- "bg-surface-secondary font-bold text-text"
+ "bg-kumo-elevated font-bold text-kumo-default"
);
tdClass =
- "sticky left-0 bg-surface-secondary dark:bg-blue-800 border-r border-b border-border";
+ "sticky left-0 bg-kumo-elevated border-r border-b border-kumo-fill";
} else {
textClass =
- "flex items-center justify-end h-full pr-2 font-mono text-text font-bold";
+ "flex items-center justify-end h-full pr-2 font-mono text-kumo-default font-bold";
tdClass =
- "sticky left-0 bg-surface-secondary border-r border-b border-border";
+ "sticky left-0 bg-kumo-elevated border-r border-b border-kumo-fill";
}
}
diff --git a/packages/local-explorer-ui/src/components/studio/Table/Cell.tsx b/packages/local-explorer-ui/src/components/studio/Table/Cell.tsx
index ee50f8ba1f..741688a200 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/Cell.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/Cell.tsx
@@ -49,33 +49,30 @@ export function StudioTableCell
({
if (isSelected) {
if (isRemoved) {
- cellBackgroundColor = "bg-red-200 dark:bg-red-800";
+ cellBackgroundColor = "bg-kumo-danger/20";
} else if (isChanged) {
- cellBackgroundColor = "bg-yellow-200 dark:bg-yellow-600";
+ cellBackgroundColor = "bg-kumo-warning/20";
} else if (isNew) {
- cellBackgroundColor = "bg-green-200 dark:bg-green-700";
+ cellBackgroundColor = "bg-kumo-success/20";
} else {
cellBackgroundColor = "";
}
} else if (isChanged) {
- cellBackgroundColor = "bg-[#ffe693] dark:bg-[#916b20]";
+ cellBackgroundColor = "bg-kumo-warning/30";
} else if (isNew) {
- cellBackgroundColor = "bg-green-100 dark:bg-green-900";
+ cellBackgroundColor = "bg-kumo-success/10";
} else if (isRemoved) {
- cellBackgroundColor = "bg-red-100 dark:bg-red-900";
+ cellBackgroundColor = "bg-kumo-danger/10";
}
return (
({
{headers.length > 0 && (
-
+
)}
{headers.map((header, idx) => {
@@ -65,7 +65,7 @@ function StudioTableHeader({
-
+
{prettifyBytes(bytes.subarray(0, 64))}
@@ -91,7 +91,7 @@ export const StudioTableDisplayCell = forwardRef<
const isAlignRight = align === "right";
const textBaseStyle = cn(
- "flex grow text-muted",
+ "flex grow text-kumo-subtle",
isAlignRight ? "justify-end" : ""
);
@@ -115,9 +115,11 @@ export const StudioTableDisplayCell = forwardRef<
const firstLine = hasLineBreak ? value.slice(0, newlineIndex) : value;
return (
-
+
{firstLine}
- {hasLineBreak && ⏎ }
+ {hasLineBreak && (
+ ⏎
+ )}
);
}
@@ -127,7 +129,7 @@ export const StudioTableDisplayCell = forwardRef<
{value}
diff --git a/packages/local-explorer-ui/src/components/studio/Table/Result/EditableCell.tsx b/packages/local-explorer-ui/src/components/studio/Table/Result/EditableCell.tsx
index dfd83eec20..8042f402a6 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/Result/EditableCell.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/Result/EditableCell.tsx
@@ -94,7 +94,7 @@ function InputCellEditor({
{popover &&
createPortal(
-
+
{
onApply(editorRef.current?.getValue());
diff --git a/packages/local-explorer-ui/src/components/studio/Table/Result/ResultTableContextMenu.tsx b/packages/local-explorer-ui/src/components/studio/Table/Result/ResultTableContextMenu.tsx
index 9122d08229..c716171e70 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/Result/ResultTableContextMenu.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/Result/ResultTableContextMenu.tsx
@@ -122,7 +122,7 @@ export function useStudioResultTableContextMenu(
label: (
),
onClick: () => {
diff --git a/packages/local-explorer-ui/src/components/studio/Table/Result/index.tsx b/packages/local-explorer-ui/src/components/studio/Table/Result/index.tsx
index d218789b1f..4b5c868c02 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/Result/index.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/Result/index.tsx
@@ -170,7 +170,7 @@ export function StudioResultTable({
{hasColumnInfo && (
<>
-
+
Constraints and Indexes
>
@@ -182,7 +182,7 @@ export function StudioResultTable({
icon={
}
title={"Primary Key"}
@@ -196,9 +196,8 @@ export function StudioResultTable({
}
@@ -213,7 +212,7 @@ export function StudioResultTable({
icon={
}
title={"Reference To"}
@@ -225,9 +224,7 @@ export function StudioResultTable({
description={
header.metadata.columnSchema.constraint.generatedExpression
}
- icon={
-
- }
+ icon={ }
title={"Generated Expression"}
/>
)}
@@ -304,7 +301,7 @@ function HeaderDropdownMenu({
render={(props) => (
{
e.preventDefault();
e.stopPropagation();
@@ -345,7 +342,7 @@ function DropdownMenuColumnInfo({
{icon}
{title}
-
{description}
+
{description}
);
diff --git a/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/Column.tsx b/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/Column.tsx
index 933347e996..9c98aa0e0d 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/Column.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/Column.tsx
@@ -175,18 +175,18 @@ export function StudioColumnSchemaEditor({
-
+
{columnIndex + 1}
-
+
{editableColumn.name}
- {editableColumn.type}
+ {editableColumn.type}
-
+
-
+
{JSON.stringify(editableColumn.constraint?.defaultValue)}
-
+
-
+
-
+
+
{IconComponent && } {name}
@@ -433,7 +433,7 @@ export function StudioColumnEditorModal({
{
setValue(
produce(value, (draft) => {
@@ -449,7 +449,7 @@ export function StudioColumnEditorModal({
Data type
{
const newType = e.target.value;
if (!newType) {
diff --git a/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/ConstraintListEditor.tsx b/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/ConstraintListEditor.tsx
index 274567007e..b8d11c1c75 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/ConstraintListEditor.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/SchemaEditor/ConstraintListEditor.tsx
@@ -32,11 +32,11 @@ export function StudioConstraintListEditor({
- #
-
+ #
+
Type
-
+
@@ -69,19 +69,21 @@ export function StudioConstraintListEditor({
return (
{constriantIndex + 1}
- {constraintType}
-
+
+ {constraintType}
+
+
{constraint.foreignKey && (
{(constraint.foreignKey.columns ?? []).map(
(column, columnIndex) => (
{column}
{" "}
@@ -183,7 +185,7 @@ function SortableColumnItem({ id }: SortableColumnItemProps): JSX.Element {
return (
-
-
+
+
handleNameChange(e.target.value)}
placeholder="Table name"
value={value.name.new ?? ""}
@@ -172,26 +172,26 @@ export function StudioTableSchemaEditor({
-
+
#
-
+
-
+
Column Name
-
+
Type
-
+
NULL
-
+
Default Value
-
-
+
+
@@ -219,7 +219,7 @@ export function StudioTableSchemaEditor({
-
+
- #
-
+ #
+
Index Name
- Type
-
+ Type
+
@@ -259,10 +259,10 @@ function IndexList({ indexList }: IndexListProps): JSX.Element | null {
{indexList.map((index, indexIdx) => {
return (
- {indexIdx + 1}
- {index.name}
- {index.type}
-
+ {indexIdx + 1}
+ {index.name}
+ {index.type}
+
{index.columns.join(", ")}
diff --git a/packages/local-explorer-ui/src/components/studio/Table/State/Helpers.tsx b/packages/local-explorer-ui/src/components/studio/Table/State/Helpers.tsx
index c9ad6b229c..33fa20a284 100644
--- a/packages/local-explorer-ui/src/components/studio/Table/State/Helpers.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Table/State/Helpers.tsx
@@ -338,28 +338,19 @@ function pipeColumnIcon(
const iconStack = (
{hasPrimaryKey && (
-
+
)}
{hasUniqueIndex && (
-
+
)}
{hasKeyIndex && (
-
+
)}
{header.metadata.referenceTo && (
-
+
)}
{header.metadata.columnSchema?.constraint?.generatedExpression && (
-
+
)}
);
diff --git a/packages/local-explorer-ui/src/components/studio/Tabs/CreateUpdateTable.tsx b/packages/local-explorer-ui/src/components/studio/Tabs/CreateUpdateTable.tsx
index 14fa83622c..257974fc2d 100644
--- a/packages/local-explorer-ui/src/components/studio/Tabs/CreateUpdateTable.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Tabs/CreateUpdateTable.tsx
@@ -13,7 +13,7 @@ interface StudioEditTableTabProps {
tableName?: string;
}
-const LAYOUT_CLASSES = "overflow-auto w-full h-full bg-surface";
+const LAYOUT_CLASSES = "overflow-auto w-full h-full bg-kumo-base";
export function StudioCreateUpdateTableTab({
schemaName,
diff --git a/packages/local-explorer-ui/src/components/studio/Tabs/Query.tsx b/packages/local-explorer-ui/src/components/studio/Tabs/Query.tsx
index e3e2db6532..868891e7a2 100644
--- a/packages/local-explorer-ui/src/components/studio/Tabs/Query.tsx
+++ b/packages/local-explorer-ui/src/components/studio/Tabs/Query.tsx
@@ -238,10 +238,10 @@ export function StudioQueryTab({ query }: StudioQueryTabProps): JSX.Element {
-
+
-
+
Ln {lineNumber} Col {columnNumber}
@@ -270,7 +270,7 @@ export function StudioQueryTab({ query }: StudioQueryTabProps): JSX.Element {
}
loading={loading}
onClick={onRunCurrentClicked}
@@ -283,7 +283,7 @@ export function StudioQueryTab({ query }: StudioQueryTabProps): JSX.Element {
@@ -320,7 +320,7 @@ export function StudioQueryTab({ query }: StudioQueryTabProps): JSX.Element {
-
+
{queryTabs && queryTabs.length > 0 && (
-
+
+
@@ -463,8 +463,8 @@ export function StudioTableExplorerTab({
{loading && (
<>
@@ -472,14 +472,14 @@ export function StudioTableExplorerTab({
>
)}
-
+
{queryStats && }
-
+
diff --git a/packages/local-explorer-ui/src/components/studio/WhereFilterInput.tsx b/packages/local-explorer-ui/src/components/studio/WhereFilterInput.tsx
index 7a9b5f02cd..20fb24f0c4 100644
--- a/packages/local-explorer-ui/src/components/studio/WhereFilterInput.tsx
+++ b/packages/local-explorer-ui/src/components/studio/WhereFilterInput.tsx
@@ -129,14 +129,14 @@ export function StudioWhereFilterInput({
return (
<>
-
●
+
●
Apply
>
);
}, [loading, currentValue, value, parsingError]);
return (
-
+
{
e.stopPropagation();
@@ -62,7 +64,7 @@ export function StudioWindowTabItemRenderer({
)}
{shouldShowDirtyIcon && (
)}
diff --git a/packages/local-explorer-ui/src/components/studio/WindowTab/MenuProps.tsx b/packages/local-explorer-ui/src/components/studio/WindowTab/MenuProps.tsx
index 1e78e10c18..cd1e679997 100644
--- a/packages/local-explorer-ui/src/components/studio/WindowTab/MenuProps.tsx
+++ b/packages/local-explorer-ui/src/components/studio/WindowTab/MenuProps.tsx
@@ -9,7 +9,7 @@ export function StudioWindowTabMenu({
}: StudioWindowTabMenuProps): JSX.Element {
return (
diff --git a/packages/local-explorer-ui/src/components/studio/WindowTab/index.tsx b/packages/local-explorer-ui/src/components/studio/WindowTab/index.tsx
index ef6f8a0128..6cb53fdb97 100644
--- a/packages/local-explorer-ui/src/components/studio/WindowTab/index.tsx
+++ b/packages/local-explorer-ui/src/components/studio/WindowTab/index.tsx
@@ -39,8 +39,8 @@ export function StudioWindowTab({
);
return (
-
-
+
+
{tabs.map((tab, tabIndex) => {
// Handles tab closure. If the closed tab is the currently active one,
// automatically select the nearest remaining tab to preserve continuity.
@@ -94,7 +94,7 @@ export function StudioWindowTab({
{onNewClicked &&
}
-
+
diff --git a/packages/local-explorer-ui/src/components/workflows/CopyButton.tsx b/packages/local-explorer-ui/src/components/workflows/CopyButton.tsx
index 4daeb57dfe..0599753c3d 100644
--- a/packages/local-explorer-ui/src/components/workflows/CopyButton.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/CopyButton.tsx
@@ -19,12 +19,12 @@ export function CopyButton({
return (
{copied ? (
-
+
) : (
)}
diff --git a/packages/local-explorer-ui/src/components/workflows/CreateInstanceDialog.tsx b/packages/local-explorer-ui/src/components/workflows/CreateInstanceDialog.tsx
index d1eb50dd64..20f938b794 100644
--- a/packages/local-explorer-ui/src/components/workflows/CreateInstanceDialog.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/CreateInstanceDialog.tsx
@@ -88,12 +88,12 @@ export function CreateWorkflowInstanceDialog({
{/* Header */}
-
+
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Trigger this workflow?
-
+
Manually trigger an instance of this Workflow using the payload
below.
@@ -102,21 +102,19 @@ export function CreateWorkflowInstanceDialog({
{/* Body */}
{error && (
-
+
{error}
)}
{/* Instance ID */}
-
+
Instance ID{" "}
-
- (optional)
-
+ (optional)
setInstanceId(e.target.value)}
placeholder="Auto-generated UUID if empty"
type="text"
@@ -126,14 +124,14 @@ export function CreateWorkflowInstanceDialog({
{/* Params */}
{/* Footer */}
-
+
handleOpenChange(false)}
diff --git a/packages/local-explorer-ui/src/components/workflows/ScrollableCodeBlock.tsx b/packages/local-explorer-ui/src/components/workflows/ScrollableCodeBlock.tsx
index 11d4cbef8a..4788541220 100644
--- a/packages/local-explorer-ui/src/components/workflows/ScrollableCodeBlock.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/ScrollableCodeBlock.tsx
@@ -4,7 +4,7 @@ export function ScrollableCodeBlock({
content: string;
}): JSX.Element {
return (
-
+
{content}
);
diff --git a/packages/local-explorer-ui/src/components/workflows/StatusBadge.tsx b/packages/local-explorer-ui/src/components/workflows/StatusBadge.tsx
index cd76f4670e..15d37eb427 100644
--- a/packages/local-explorer-ui/src/components/workflows/StatusBadge.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/StatusBadge.tsx
@@ -3,23 +3,16 @@ import type { WorkflowsInstance } from "../../api";
type WorkflowStatus = NonNullable;
-/*
- * Color scheme matching the Cloudflare dashboard.
- * Light: soft pastel bg + dark text. Dark: vibrant saturated bg + dark text.
- * Tailwind arbitrary values with dark: variant for proper theme switching.
- */
const statusStyles: Record = {
- complete: "bg-[#059669] text-[#fffdfb] dark:bg-[#008236] dark:text-[#ffeee6]",
- errored: "bg-[#fb2b36] text-[#fffdfb] dark:bg-[#c10007] dark:text-[#ffeee6]",
- terminated:
- "bg-[#fb2b36] text-[#fffdfb] dark:bg-[#c10007] dark:text-[#ffeee6]",
- waiting: "bg-[#cf7ee9] text-[#fffdfb] dark:bg-[#831ca6] dark:text-[#ffeee6]",
- paused: "bg-[#cf7ee9] text-[#fffdfb] dark:bg-[#831ca6] dark:text-[#ffeee6]",
- running: "bg-[#2b7bfb] text-[#fffdfb] dark:bg-[#004ac2] dark:text-[#ffeee6]",
- waitingForPause:
- "bg-[#2b7bfb] text-[#fffdfb] dark:bg-[#004ac2] dark:text-[#ffeee6]",
- queued: "bg-[#d9d9d9] text-[#fffdfb] dark:bg-[#b6b6b6] dark:text-[#ffeee6]",
- unknown: "bg-[#d9d9d9] text-[#fffdfb] dark:bg-[#b6b6b6] dark:text-[#ffeee6]",
+ complete: "bg-kumo-success text-white",
+ errored: "bg-kumo-danger text-white",
+ terminated: "bg-kumo-danger text-white",
+ waiting: "bg-kumo-brand text-white",
+ paused: "bg-kumo-brand text-white",
+ running: "bg-kumo-brand text-white",
+ waitingForPause: "bg-kumo-brand text-white",
+ queued: "bg-kumo-subtle text-white",
+ unknown: "bg-kumo-subtle text-white",
};
const statusLabels: Record = {
diff --git a/packages/local-explorer-ui/src/components/workflows/StatusIcon.tsx b/packages/local-explorer-ui/src/components/workflows/StatusIcon.tsx
index df965004cb..9b11d7e72e 100644
--- a/packages/local-explorer-ui/src/components/workflows/StatusIcon.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/StatusIcon.tsx
@@ -13,7 +13,7 @@ export function StatusIcon({ status }: { status: string }): JSX.Element {
case "complete":
return (
-
+
);
case "errored":
@@ -22,21 +22,21 @@ export function StatusIcon({ status }: { status: string }): JSX.Element {
);
case "terminated":
return (
-
+
);
case "paused":
case "waitingForPause":
return (
-
+
);
case "running":
@@ -48,11 +48,7 @@ export function StatusIcon({ status }: { status: string }): JSX.Element {
case "waiting":
return (
-
+
);
default:
@@ -61,7 +57,7 @@ export function StatusIcon({ status }: { status: string }): JSX.Element {
);
diff --git a/packages/local-explorer-ui/src/components/workflows/StepRow.tsx b/packages/local-explorer-ui/src/components/workflows/StepRow.tsx
index 323b83693f..49528fc820 100644
--- a/packages/local-explorer-ui/src/components/workflows/StepRow.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/StepRow.tsx
@@ -21,13 +21,13 @@ function StepStatusIcon({
if (success === false || hasError) {
if (subtle) {
return (
-
-
!
+
+ !
);
}
return (
-
+
!
);
@@ -35,13 +35,13 @@ function StepStatusIcon({
if (success === true || finished === true) {
if (subtle) {
return (
-
+
);
}
return (
-
+
);
@@ -54,10 +54,9 @@ function StepStatusIcon({
}
const TYPE_BADGE_STYLES: Record
= {
- step: "bg-bg-tertiary text-text-secondary",
- sleep: "bg-[#f5f5f5] text-[#525252] dark:bg-[#262626] dark:text-[#a3a3a3]",
- waitForEvent:
- "bg-[#f5f3ff] text-[#7c3aed] dark:bg-[#2e1065] dark:text-[#a78bfa]",
+ step: "bg-kumo-tint text-kumo-subtle",
+ sleep: "bg-kumo-overlay text-kumo-subtle",
+ waitForEvent: "bg-kumo-brand/10 text-kumo-brand",
};
export function StepRow({ step }: { step: StepData }): JSX.Element {
@@ -69,10 +68,10 @@ export function StepRow({ step }: { step: StepData }): JSX.Element {
(step.error || step.output !== undefined || step.finished));
return (
-
+
{/* Collapsed row */}
setExpanded(!expanded) : undefined}
>
)}
-
+
{step.name ?? "Unknown step"}
-
+
{formatDuration(step.start, step.end)}
@@ -104,7 +103,7 @@ export function StepRow({ step }: { step: StepData }): JSX.Element {
{hasDetails ? (
) : (
@@ -115,7 +114,7 @@ export function StepRow({ step }: { step: StepData }): JSX.Element {
{/* Expanded detail panel */}
{expanded && hasDetails && (
-
+
{step.type === "step" &&
}
{step.type === "waitForEvent" && (
@@ -137,8 +136,8 @@ function StepCodeCard({
}): JSX.Element {
return (
-
{label}
-
+
{label}
+
@@ -180,8 +179,10 @@ function StepDoDetails({ step }: { step: StepData }): JSX.Element {
{/* Attempts */}
{step.attempts && step.attempts.length > 0 && (
-
-
Attempts
+
+
+ Attempts
+
{[...step.attempts].reverse().map((attempt, i, reversed) => {
const attemptNum = reversed.length - i;
@@ -199,10 +200,10 @@ function StepDoDetails({ step }: { step: StepData }): JSX.Element {
return (
-
+
-
+
#{attemptNum}
@@ -210,21 +211,21 @@ function StepDoDetails({ step }: { step: StepData }): JSX.Element {
{attempt.error ? (
-
+
{attempt.error.name}
) : attempt.success ? (
- Success
+ Success
) : (
- Running
+ Running
)}
-
-
+
+
{formatDuration(attempt.start, attempt.end)}
{attempt.error?.message && (
-
+
{attempt.error.message}
)}
@@ -232,11 +233,11 @@ function StepDoDetails({ step }: { step: StepData }): JSX.Element {
{!isLast && delayMs !== null && delayMs > 0 && (
-
+
-
+
{formatDuration(nextDisplayed?.end, attempt.start)}
diff --git a/packages/local-explorer-ui/src/components/workflows/Timestamp.tsx b/packages/local-explorer-ui/src/components/workflows/Timestamp.tsx
index 5b4672d7fa..c255e58d9a 100644
--- a/packages/local-explorer-ui/src/components/workflows/Timestamp.tsx
+++ b/packages/local-explorer-ui/src/components/workflows/Timestamp.tsx
@@ -36,7 +36,7 @@ export function Timestamp({
value: string | undefined | null;
}): JSX.Element {
if (!value) {
- return
— ;
+ return
— ;
}
const short = formatShort(value);
@@ -48,11 +48,11 @@ export function Timestamp({
content={
{full}
-
{relative}
+
{relative}
}
>
-
+
{short}
diff --git a/packages/local-explorer-ui/src/main.tsx b/packages/local-explorer-ui/src/main.tsx
index 709762b5b1..9dfb05bf75 100644
--- a/packages/local-explorer-ui/src/main.tsx
+++ b/packages/local-explorer-ui/src/main.tsx
@@ -4,6 +4,17 @@ import { createRoot } from "react-dom/client";
import "./styles/tailwind.css";
import { routeTree } from "./routeTree.gen";
+const darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)");
+
+function syncColorModeWithOS(): void {
+ document.documentElement.dataset.mode = darkModeQuery.matches
+ ? "dark"
+ : "light";
+}
+
+syncColorModeWithOS();
+darkModeQuery.addEventListener("change", syncColorModeWithOS);
+
// eslint-disable-next-line turbo/no-undeclared-env-vars -- replaced at build time
const router = createRouter({ routeTree, basepath: import.meta.env.BASE_URL });
diff --git a/packages/local-explorer-ui/src/routes/d1/$databaseId.tsx b/packages/local-explorer-ui/src/routes/d1/$databaseId.tsx
index ff667df426..2148891509 100644
--- a/packages/local-explorer-ui/src/routes/d1/$databaseId.tsx
+++ b/packages/local-explorer-ui/src/routes/d1/$databaseId.tsx
@@ -169,9 +169,7 @@ function DatabaseView(): JSX.Element {
{databaseName && databaseName !== params.databaseId ? (
<>
{databaseName}
-
- ({params.databaseId})
-
+ ({params.databaseId})
>
) : (
params.databaseId
@@ -240,7 +238,7 @@ function DatabaseView(): JSX.Element {
/>
)}
-
+
{params.className}
{namespaceId !== params.className && (
- ({namespaceId})
+ ({namespaceId})
)}
,
{params.className}
{namespaceId !== params.className && (
- ({namespaceId})
+ ({namespaceId})
)}
,
]}
@@ -133,15 +133,15 @@ function NamespaceView() {
{error && (
-
+
{error}
)}
{loading ? (
-
Loading...
+
Loading...
) : objects.length === 0 ? (
-
+
No Durable Objects with stored data
@@ -151,7 +151,7 @@ function NamespaceView() {
) : (
<>
-
+
@@ -167,7 +167,7 @@ function NamespaceView() {
-
+
Welcome to Local Explorer
-
+
Select a resource from the sidebar to view & manage it.
diff --git a/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx b/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx
index 3873ce43c0..683788ffeb 100644
--- a/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx
+++ b/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx
@@ -372,7 +372,7 @@ function NamespaceView() {
{namespaceTitle && namespaceTitle !== namespaceId ? (
<>
{namespaceTitle}
- ({namespaceId})
+ ({namespaceId})
>
) : (
namespaceId
@@ -383,7 +383,7 @@ function NamespaceView() {
{error && (
-
+
{error}
)}
@@ -394,14 +394,14 @@ function NamespaceView() {
disabled={loading}
/>
-
+
{loading ? (
-
Loading...
+
Loading...
) : entries.length === 0 ? (
-
+
{prefix ? (
{`No keys found matching prefix "${prefix}".`}
) : (
@@ -449,7 +449,7 @@ function NamespaceView() {
Delete key?
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Are you sure you want to delete “{deleteTarget}”? This
cannot be undone.
@@ -483,7 +483,7 @@ function NamespaceView() {
Overwrite key?
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Key “{overwriteConfirm?.key}” already exists. Do you
want to overwrite its value?
diff --git a/packages/local-explorer-ui/src/routes/r2/$bucketName/index.tsx b/packages/local-explorer-ui/src/routes/r2/$bucketName/index.tsx
index b9a95e9711..06c0578020 100644
--- a/packages/local-explorer-ui/src/routes/r2/$bucketName/index.tsx
+++ b/packages/local-explorer-ui/src/routes/r2/$bucketName/index.tsx
@@ -302,7 +302,7 @@ function BucketView(): JSX.Element {
: [];
const breadcrumbItems = [
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
{deleteTargets.length === 1 ? (
<>
Are you sure you want to delete “{deleteTargets[0]}
@@ -479,24 +479,24 @@ function BucketView(): JSX.Element {
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Enter a name for the new directory.
-
+
Directory name
setNewDirectoryName(e.target.value)}
placeholder="my-directory"
autoFocus
/>
{search.prefix && (
-
+
Will be created at: {search.prefix}
{newDirectoryName || "..."}/
diff --git a/packages/local-explorer-ui/src/routes/r2/$bucketName/object.$.tsx b/packages/local-explorer-ui/src/routes/r2/$bucketName/object.$.tsx
index 35866d7cf5..6c82554ab3 100644
--- a/packages/local-explorer-ui/src/routes/r2/$bucketName/object.$.tsx
+++ b/packages/local-explorer-ui/src/routes/r2/$bucketName/object.$.tsx
@@ -55,25 +55,27 @@ function ObjectDetailsCard({ object }: ObjectDetailsCardProps): JSX.Element {
: [formattedDate, ""];
return (
-
-
Object Details
+
+
+ Object Details
+
-
Date Created
+ Date Created
- {datePart}
+ {datePart}
{timePart && (
- {timePart}
+ {timePart}
)}
-
Type
- {contentType}
+ Type
+ {contentType}
-
Size
- {formatSize(object.size)}
+ Size
+ {formatSize(object.size)}
@@ -90,19 +92,19 @@ function CustomMetadataCard({
const entries = metadata ? Object.entries(metadata) : [];
return (
-
-
+
+
Custom Metadata
{entries.length === 0 ? (
-
No custom metadata set
+
No custom metadata set
) : (
{entries.map(([key, value]) => (
-
{key}
- {value}
+ {key}
+ {value}
))}
@@ -163,7 +165,7 @@ function ObjectDetailView(): JSX.Element {
const fileName = pathSegments.pop() || search.objectKey;
const breadcrumbItems = [
{error && (
-
+
{error}
)}
@@ -202,7 +204,7 @@ function ObjectDetailView(): JSX.Element {
{search.objectKey}
@@ -245,7 +247,7 @@ function ObjectDetailView(): JSX.Element {
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Are you sure you want to delete “{search.objectKey}
”? This cannot be undone.
diff --git a/packages/local-explorer-ui/src/routes/workflows/$workflowName/$instanceId.tsx b/packages/local-explorer-ui/src/routes/workflows/$workflowName/$instanceId.tsx
index bcd38577e6..e2b89c3fed 100644
--- a/packages/local-explorer-ui/src/routes/workflows/$workflowName/$instanceId.tsx
+++ b/packages/local-explorer-ui/src/routes/workflows/$workflowName/$instanceId.tsx
@@ -98,18 +98,20 @@ const StatsStrip = memo(function StatsStrip({
end?: string;
}) {
return (
-
+
- Status
+ Status
-
-
Steps Completed
-
{stepCount}
+
+ Steps Completed
+
+ {stepCount}
+
-
-
Duration
-
+
+ Duration
+
{formatDuration(start, end)}
@@ -125,20 +127,22 @@ const ParamsOutput = memo(function ParamsOutput({
output: unknown;
}) {
return (
-
-
+
+
{/* Input params header */}
- Input params
+
+ Input params
+
{/* Output header */}
- Output
+ Output
{/* Content with rounded top corners to create the LayerCard effect */}
-
-
+
+
@@ -164,11 +168,11 @@ const ErrorCard = memo(function ErrorCard({
}) {
return (
-
+
{error.name ?? "Error"}
-
-
+
+
{error.message ?? "Unknown error"}
@@ -217,7 +221,9 @@ const StepHistory = memo(function StepHistory({
return (
-
Step History
+
+ Step History
+
{/* Search + Filter controls */}
@@ -226,10 +232,10 @@ const StepHistory = memo(function StepHistory({
)}
-
+
{stepList.length === 0 ? (
-
+
No steps recorded yet
) : filtered.length === 0 ? (
-
+
No steps match your search
) : (
@@ -403,12 +409,12 @@ function InstanceDetailView() {
-
+
{params.workflowName}
{
void navigator.clipboard.writeText(instanceId);
setCopied(true);
@@ -430,8 +436,8 @@ function InstanceDetailView() {
key={action}
className={`inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-lg border px-3 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-40 ${
isTerminate
- ? "border-border bg-bg text-danger hover:bg-danger/10"
- : "border-border bg-bg text-text hover:bg-border/60"
+ ? "border-kumo-fill bg-kumo-base text-kumo-danger hover:bg-kumo-danger/10"
+ : "border-kumo-fill bg-kumo-base text-kumo-default hover:bg-kumo-fill"
}`}
disabled={actionInProgress !== null}
onClick={() => void handleAction(action)}
@@ -451,7 +457,7 @@ function InstanceDetailView() {
status !== "errored" &&
status !== "terminated" && (
setSendEventOpen(true)}
title="Send Event"
@@ -460,7 +466,7 @@ function InstanceDetailView() {
)}
setDeleteDialogOpen(true)}
title="Delete"
@@ -473,7 +479,7 @@ function InstanceDetailView() {
{/* Stats strip overlapping the divider line */}
-
+
-
-
+
+
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Delete this instance?
-
+
This will permanently delete the instance and its persistence
data. This action cannot be undone.
-
-
Instance ID
-
+
+
Instance ID
+
{instanceId}
-
+
setDeleteDialogOpen(false)}
@@ -554,20 +560,20 @@ function InstanceDetailView() {
}
}}
>
-
-
+
+
{/* @ts-expect-error - Type mismatch due to pnpm monorepo @types/react version conflict */}
-
+
Send Event
-
+
setSendEventOpen(false)}
@@ -639,7 +645,7 @@ function InstanceDetailView() {
{/* Content */}
{error && (
-
+
{error}
)}
diff --git a/packages/local-explorer-ui/src/routes/workflows/$workflowName/index.tsx b/packages/local-explorer-ui/src/routes/workflows/$workflowName/index.tsx
index 5b2fdd8d89..0507d9b780 100644
--- a/packages/local-explorer-ui/src/routes/workflows/$workflowName/index.tsx
+++ b/packages/local-explorer-ui/src/routes/workflows/$workflowName/index.tsx
@@ -69,49 +69,49 @@ const STATUS_SUMMARY_CONFIG = [
key: "complete",
label: "Complete",
icon: CheckCircleIcon,
- color: "text-[#2b7bfb] dark:text-[#004ac2]",
+ color: "text-kumo-link",
weight: "fill" as const,
},
{
key: "errored",
label: "Errored",
icon: WarningCircleIcon,
- color: "text-[#fb2b36] dark:text-[#c10007]",
+ color: "text-kumo-danger",
weight: "fill" as const,
},
{
key: "queued",
label: "Queued",
icon: CircleNotchIcon,
- color: "text-text-secondary",
+ color: "text-kumo-subtle",
weight: "regular" as const,
},
{
key: "running",
label: "Running",
icon: PlayIcon,
- color: "text-text-secondary",
+ color: "text-kumo-subtle",
weight: "fill" as const,
},
{
key: "paused",
label: "Paused",
icon: PauseIcon,
- color: "text-text-secondary",
+ color: "text-kumo-subtle",
weight: "fill" as const,
},
{
key: "waiting",
label: "Waiting",
icon: SpinnerIcon,
- color: "text-text-secondary",
+ color: "text-kumo-subtle",
weight: "regular" as const,
},
{
key: "terminated",
label: "Terminated",
icon: SquareIcon,
- color: "text-text-secondary",
+ color: "text-kumo-subtle",
weight: "fill" as const,
},
] as const;
@@ -122,15 +122,15 @@ const StatusSummary = memo(function StatusSummary({
statusCounts: Record
;
}): JSX.Element {
return (
-
+