Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion web/src/components/ThemeSelect.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Moon, Palette, Sun, Wallpaper } from "lucide-react";
import { Moon, Palette, Sun, Wallpaper, Anchor } from "lucide-react";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { workspaceStore } from "@/store";

Expand All @@ -16,6 +16,8 @@ const ThemeSelect = ({ value, onValueChange, className }: ThemeSelectProps = {})
{ value: "default-dark", icon: <Moon className="w-4 h-4" />, label: "Default Dark" },
{ value: "paper", icon: <Palette className="w-4 h-4" />, label: "Paper" },
{ value: "whitewall", icon: <Wallpaper className="w-4 h-4" />, label: "Whitewall" },
{ value: "nauticalblue", icon: <Anchor className="w-4 h-4" strokeWidth={1.3} />, label: "Nautical Blue Light" },
{ value: "nauticalblue-dark", icon: <Anchor className="w-4 h-4" strokeWidth={2.57} />, label: "Nautical Blue Dark" },
];

const handleThemeChange = (newTheme: Theme) => {
Expand Down
2 changes: 1 addition & 1 deletion web/src/store/workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class LocalState {
if (!isValidateLocale(finalState.locale)) {
finalState.locale = "en";
}
if (!["default", "default-dark", "paper", "whitewall"].includes(finalState.theme)) {
if (!["default", "default-dark", "paper", "whitewall", "nauticalblue", "nauticalblue-dark"].includes(finalState.theme)) {
finalState.theme = "default";
}
Object.assign(this, finalState);
Expand Down
2 changes: 1 addition & 1 deletion web/src/themes/default.css
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,4 @@
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
--shadow-2xl: var(--shadow-2xl);
}
}
104 changes: 104 additions & 0 deletions web/src/themes/nauticalblue-dark.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
:root {
--background: oklch(21.527% 0.06881 254.132);
--foreground: oklch(81.785% 0.03752 256.017);
--card: oklch(21.527% 0.06881 254.132);
--card-foreground: oklch(81.233% 0.03705 257.439);
--popover: oklch(0.3085 0.0035 106.6039);
--popover-foreground: oklch(0.8411 0.004 106.4781);
--primary: oklch(71.412% 0.07826 253.089);
--primary-foreground: oklch(21.527% 0.06881 254.132);
--secondary: oklch(0.3485 0.0045 106.8);
--secondary-foreground: oklch(0.8274 0.0142 93.0137);
--muted: oklch(0.2213 0.0038 106.707);
--muted-foreground: oklch(54.515% 0.04794 254.027);
--accent: oklch(27.274% 0.00003 271.152);
--accent-foreground: oklch(0.8274 0.0142 93.0137);
--destructive: oklch(81.785% 0.03752 256.017);
--destructive-foreground: oklch(21.527% 0.06881 254.132);
--border: oklch(34.782% 0.02718 252.861);
--input: oklch(0.4336 0.0113 100.2195);
--ring: oklch(0.5937 0.1673 253.063);
--chart-1: oklch(0.5583 0.1276 42.9956);
--chart-2: oklch(0.6898 0.1581 290.4107);
--chart-3: oklch(0.45 0.02 245);
--chart-4: oklch(0.3074 0.0516 289.323);
--chart-5: oklch(0.5608 0.1348 42.0584);
--sidebar: oklch(17.975% 0.05139 250.378);
--sidebar-foreground: oklch(81.785% 0.03752 256.017);
--sidebar-primary: oklch(11.477% 0.02633 281.436);
--sidebar-primary-foreground: oklch(81.785% 0.03752 256.017);
--sidebar-accent: oklch(24.246% 0.07907 254.727);
--sidebar-accent-foreground: oklch(81.785% 0.03752 256.017);
--sidebar-border: oklch(0.3618 0.0101 106.8928);
--sidebar-ring: oklch(0.5937 0.1673 253.063);
--font-sans:
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--radius: 0.5rem;
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
--tracking-normal: 0em;
--spacing: 0.25rem;
}


@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);

--font-sans: var(--font-sans);
--font-mono: var(--font-mono);
--font-serif: var(--font-serif);

--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);

--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow: var(--shadow);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
--shadow-2xl: var(--shadow-2xl);
}
104 changes: 104 additions & 0 deletions web/src/themes/nauticalblue.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
:root {
--background: oklch(81.785% 0.03752 256.017);
--foreground: oklch(21.527% 0.06881 254.132);
--card: oklch(81.785% 0.03752 256.017);
--card-foreground: oklch(81.233% 0.03705 257.439);
--popover: oklch(1 0 0);
--popover-foreground: oklch(21.527% 0.06881 254.132);
--primary-foreground: oklch(81.785% 0.03752 256.017);
--primary: oklch(21.527% 0.06881 254.132);
--secondary: oklch(0.9245 0.0138 92.9892);
--secondary-foreground: oklch(0.4334 0.0177 98.6048);
--muted: oklch(0.9341 0.0153 90.239);
--muted-foreground: oklch(43.908% 0.06784 253.819); /*oklch(40.63% 0.06148 253.531); */ /*oklch(41.712% 0.06314 253.4); */
--accent: oklch(73.802% 0.00008 271.152);
--accent-foreground: oklch(21.527% 0.06881 254.132); /*oklch(21.527% 0.06881 254.132);*/
--destructive: oklch(21.527% 0.06881 254.132);
--destructive-foreground:oklch(81.785% 0.03752 256.017);
--border: oklch(66.396% 0.03824 254.98);
--input: oklch(0.7621 0.0156 98.3528);
--ring: oklch(0.5937 0.1673 253.063);
--chart-1: oklch(0.5583 0.1276 42.9956);
--chart-2: oklch(0.6898 0.1581 290.4107);
--chart-3: oklch(0.8816 0.0276 93.128);
--chart-4: oklch(0.8822 0.0403 298.1792);
--chart-5: oklch(0.5608 0.1348 42.0584);
--sidebar: oklch(73.639% 0.03798 257.441);
--sidebar-foreground: oklch(21.527% 0.06881 254.132);
--sidebar-primary: oklch(0.3918 0.0127 286.3);
--sidebar-primary-foreground: oklch(0.9818 0.0054 95.0986);
--sidebar-accent: oklch(81.785% 0.03752 256.017);
--sidebar-accent-foreground: oklch(21.527% 0.06881 254.132);
--sidebar-border: oklch(0.3618 0.0101 106.8928);
--sidebar-ring: oklch(0.5937 0.1673 253.063);
--font-sans:
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--radius: 0.5rem;
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
--tracking-normal: 0em;
--spacing: 0.25rem;
}

@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);

--font-sans: var(--font-sans);
--font-mono: var(--font-mono);
--font-serif: var(--font-serif);

--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);

--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow: var(--shadow);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
--shadow-2xl: var(--shadow-2xl);
}

2 changes: 1 addition & 1 deletion web/src/types/modules/setting.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
type Theme = "default" | "default-dark" | "paper" | "whitewall";
type Theme = "default" | "default-dark" | "paper" | "whitewall" | "nauticalblue" | "nauticalblue-dark";
6 changes: 5 additions & 1 deletion web/src/utils/theme.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import defaultDarkThemeContent from "../themes/default-dark.css?raw";
import nauticalBlueDarkThemeContent from "../themes/nauticalblue-dark.css?raw";
import nauticalBlueThemeContent from "../themes/nauticalblue.css?raw";
import paperThemeContent from "../themes/paper.css?raw";
import whitewallThemeContent from "../themes/whitewall.css?raw";

const VALID_THEMES = ["default", "default-dark", "paper", "whitewall"] as const;
const VALID_THEMES = ["default", "default-dark", "paper", "whitewall", "nauticalblue", "nauticalblue-dark"] as const;
type ValidTheme = (typeof VALID_THEMES)[number];

const THEME_CONTENT: Record<ValidTheme, string | null> = {
default: null,
"default-dark": defaultDarkThemeContent,
paper: paperThemeContent,
whitewall: whitewallThemeContent,
nauticalblue: nauticalBlueThemeContent,
"nauticalblue-dark": nauticalBlueDarkThemeContent,
};

const validateTheme = (theme: string): ValidTheme => {
Expand Down