mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
chore: deploy to Cloudflare Pages and update branding
- Add Cloudflare Pages deployment for landing page (snapotter.com) and docs (docs.snapotter.com) - Create deploy-landing.yml and update deploy-docs.yml workflows - Update CI to ignore apps/landing/** paths - Fix logo transparency (remove white background) across all apps - Recreate social-preview.png with SnapOtter branding - Update all docs URLs from GitHub Pages to docs.snapotter.com - Update VitePress config: light theme default, fix llms.txt paths - Add .vitepress/cache/ and .env.* to gitignore
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { APP_VERSION } from "@ashim/shared";
|
||||
import { APP_VERSION } from "@snapotter/shared";
|
||||
import { Component, type ErrorInfo, lazy, type ReactNode, Suspense, useEffect } from "react";
|
||||
import { BrowserRouter, Navigate, Route, Routes, useLocation } from "react-router-dom";
|
||||
import { Toaster } from "sonner";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { TOOLS } from "@ashim/shared";
|
||||
import { TOOLS } from "@snapotter/shared";
|
||||
import { ArrowRight, ChevronDown, ChevronRight, Download, FileImage, Undo2 } from "lucide-react";
|
||||
import { useMemo, useState } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { Tool } from "@ashim/shared";
|
||||
import { PYTHON_SIDECAR_TOOLS, TOOL_BUNDLE_MAP } from "@ashim/shared";
|
||||
import type { Tool } from "@snapotter/shared";
|
||||
import { PYTHON_SIDECAR_TOOLS, TOOL_BUNDLE_MAP } from "@snapotter/shared";
|
||||
import { Download, FileImage, Star } from "lucide-react";
|
||||
import { useMemo } from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { FeatureBundleState } from "@ashim/shared";
|
||||
import type { FeatureBundleState } from "@snapotter/shared";
|
||||
import { AlertCircle, Download, Loader2, RotateCcw } from "lucide-react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useFeaturesStore } from "@/stores/features-store";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { TOOLS } from "@ashim/shared";
|
||||
import { TOOLS } from "@snapotter/shared";
|
||||
import { FileImage, Workflow } from "lucide-react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { TOOLS } from "@ashim/shared";
|
||||
import { TOOLS } from "@snapotter/shared";
|
||||
import type { UserFile } from "@/lib/api";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { useFilesPageStore } from "@/stores/files-page-store";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { APP_VERSION } from "@ashim/shared";
|
||||
import { APP_VERSION } from "@snapotter/shared";
|
||||
import { BookOpen, ExternalLink, Github, Keyboard, X } from "lucide-react";
|
||||
import { useEffect } from "react";
|
||||
import { formatShortcut } from "@/hooks/use-keyboard-shortcuts";
|
||||
@@ -99,7 +99,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
|
||||
</div>
|
||||
<div className="flex flex-col gap-1.5">
|
||||
<a
|
||||
href="https://github.com/ashim-hq/ashim"
|
||||
href="https://github.com/snapotter-hq/snapotter"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-center gap-1.5 text-sm text-primary hover:underline"
|
||||
@@ -108,7 +108,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
|
||||
<ExternalLink className="h-3 w-3" />
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/ashim-hq/ashim/issues"
|
||||
href="https://github.com/snapotter-hq/snapotter/issues"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-center gap-1.5 text-sm text-primary hover:underline"
|
||||
@@ -117,7 +117,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
|
||||
<ExternalLink className="h-3 w-3" />
|
||||
</a>
|
||||
<a
|
||||
href="https://ashim-hq.github.io/ashim/"
|
||||
href="https://docs.snapotter.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-center gap-1.5 text-sm text-primary hover:underline"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { CATEGORIES, TOOLS } from "@ashim/shared";
|
||||
import { CATEGORIES, TOOLS } from "@snapotter/shared";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { useFeaturesStore } from "@/stores/features-store";
|
||||
import { useSettingsStore } from "@/stores/settings-store";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { FeatureBundleState } from "@ashim/shared";
|
||||
import type { FeatureBundleState } from "@snapotter/shared";
|
||||
import { Clock, Download, Loader2, RefreshCw, RotateCcw, Trash2 } from "lucide-react";
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import { apiGet } from "@/lib/api";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { APP_VERSION, CATEGORIES, TOOLS } from "@ashim/shared";
|
||||
import { APP_VERSION, CATEGORIES, TOOLS } from "@snapotter/shared";
|
||||
import {
|
||||
Check,
|
||||
Copy,
|
||||
@@ -216,7 +216,7 @@ function GeneralSection() {
|
||||
.catch(() => {
|
||||
setUser({
|
||||
id: 0,
|
||||
username: localStorage.getItem("ashim-username") || "",
|
||||
username: localStorage.getItem("snapotter-username") || "",
|
||||
role: "unknown",
|
||||
});
|
||||
}),
|
||||
@@ -232,7 +232,7 @@ function GeneralSection() {
|
||||
|
||||
const handleLogout = () => {
|
||||
clearToken();
|
||||
localStorage.removeItem("ashim-username");
|
||||
localStorage.removeItem("snapotter-username");
|
||||
window.location.href = "/login";
|
||||
};
|
||||
|
||||
@@ -2530,7 +2530,7 @@ function AboutSection() {
|
||||
<h4 className="text-sm font-medium text-foreground">Links</h4>
|
||||
<div className="flex flex-col gap-1.5">
|
||||
<a
|
||||
href="https://github.com/ashim-hq/ashim"
|
||||
href="https://github.com/snapotter-hq/snapotter"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-sm text-primary hover:underline"
|
||||
@@ -2538,7 +2538,7 @@ function AboutSection() {
|
||||
GitHub Repository
|
||||
</a>
|
||||
<a
|
||||
href="https://ashim-hq.github.io/ashim/"
|
||||
href="https://docs.snapotter.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-sm text-primary hover:underline"
|
||||
|
||||
@@ -105,9 +105,9 @@ export function ColorControls({
|
||||
if (exposure !== 0) parts.push(`brightness(${1 + exposure / 200})`);
|
||||
if (saturation !== 0) parts.push(`saturate(${1 + saturation / 100})`);
|
||||
if (hue !== 0) parts.push(`hue-rotate(${hue}deg)`);
|
||||
if (hasTempTint) parts.push("url(#ashim-temp-tint-filter)");
|
||||
if (hasChannelChanges) parts.push("url(#ashim-channel-filter)");
|
||||
if (sharpness > 0) parts.push("url(#ashim-sharpen-filter)");
|
||||
if (hasTempTint) parts.push("url(#snapotter-temp-tint-filter)");
|
||||
if (hasChannelChanges) parts.push("url(#snapotter-channel-filter)");
|
||||
if (sharpness > 0) parts.push("url(#snapotter-sharpen-filter)");
|
||||
if (effect === "grayscale") parts.push("grayscale(1)");
|
||||
if (effect === "sepia") parts.push("sepia(1)");
|
||||
if (effect === "invert") parts.push("invert(1)");
|
||||
@@ -149,7 +149,7 @@ export function ColorControls({
|
||||
{hasTempTint && (
|
||||
<svg width="0" height="0" style={{ position: "absolute" }}>
|
||||
<title>Temperature and tint color filter</title>
|
||||
<filter id="ashim-temp-tint-filter" colorInterpolationFilters="sRGB">
|
||||
<filter id="snapotter-temp-tint-filter" colorInterpolationFilters="sRGB">
|
||||
<feColorMatrix
|
||||
type="matrix"
|
||||
values={`${1 + tempT * 0.15 + tintN * 0.1} 0 0 0 0 0 ${1 + tempT * 0.05 - tintN * 0.15} 0 0 0 0 0 ${1 - tempT * 0.15 + tintN * 0.1} 0 0 0 0 0 1 0`}
|
||||
@@ -160,7 +160,7 @@ export function ColorControls({
|
||||
{hasChannelChanges && (
|
||||
<svg width="0" height="0" style={{ position: "absolute" }}>
|
||||
<title>Color channel filter</title>
|
||||
<filter id="ashim-channel-filter" colorInterpolationFilters="sRGB">
|
||||
<filter id="snapotter-channel-filter" colorInterpolationFilters="sRGB">
|
||||
<feColorMatrix
|
||||
type="matrix"
|
||||
values={`${red / 100} 0 0 0 0 0 ${green / 100} 0 0 0 0 0 ${blue / 100} 0 0 0 0 0 1 0`}
|
||||
@@ -171,7 +171,7 @@ export function ColorControls({
|
||||
{sharpness > 0 && (
|
||||
<svg width="0" height="0" style={{ position: "absolute" }}>
|
||||
<title>Sharpen filter</title>
|
||||
<filter id="ashim-sharpen-filter" colorInterpolationFilters="sRGB">
|
||||
<filter id="snapotter-sharpen-filter" colorInterpolationFilters="sRGB">
|
||||
<feConvolveMatrix
|
||||
order="3"
|
||||
preserveAlpha="true"
|
||||
|
||||
@@ -216,10 +216,10 @@ export function ImageEnhancementControls({
|
||||
parts.push(`saturate(${1 + adj / 100})`);
|
||||
}
|
||||
if (toggles.whiteBalance && Math.abs(c.temperature) > 2) {
|
||||
parts.push("url(#ashim-enhance-temp-filter)");
|
||||
parts.push("url(#snapotter-enhance-temp-filter)");
|
||||
}
|
||||
if (toggles.sharpness && c.sharpness > 2) {
|
||||
parts.push("url(#ashim-enhance-sharpen-filter)");
|
||||
parts.push("url(#snapotter-enhance-sharpen-filter)");
|
||||
}
|
||||
|
||||
onPreviewFilter(parts.join(" "));
|
||||
@@ -246,7 +246,7 @@ export function ImageEnhancementControls({
|
||||
{toggles.whiteBalance && Math.abs(tempAdj) > 0.02 && (
|
||||
<svg width="0" height="0" style={{ position: "absolute" }}>
|
||||
<title>White balance temperature filter</title>
|
||||
<filter id="ashim-enhance-temp-filter" colorInterpolationFilters="sRGB">
|
||||
<filter id="snapotter-enhance-temp-filter" colorInterpolationFilters="sRGB">
|
||||
<feColorMatrix
|
||||
type="matrix"
|
||||
values={`${1 + tempAdj * 0.15} 0 0 0 0 0 ${1 + tempAdj * 0.05} 0 0 0 0 0 ${1 - tempAdj * 0.15} 0 0 0 0 0 1 0`}
|
||||
@@ -257,7 +257,7 @@ export function ImageEnhancementControls({
|
||||
{toggles.sharpness && sharpAdj > 0.02 && (
|
||||
<svg width="0" height="0" style={{ position: "absolute" }}>
|
||||
<title>Sharpen filter</title>
|
||||
<filter id="ashim-enhance-sharpen-filter" colorInterpolationFilters="sRGB">
|
||||
<filter id="snapotter-enhance-sharpen-filter" colorInterpolationFilters="sRGB">
|
||||
<feConvolveMatrix
|
||||
order="3"
|
||||
preserveAlpha="true"
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
type PassportDocumentSpec,
|
||||
type PassportRegion,
|
||||
type PassportSpec,
|
||||
} from "@ashim/shared";
|
||||
} from "@snapotter/shared";
|
||||
import {
|
||||
Check,
|
||||
ChevronDown,
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { TOOLS } from "@ashim/shared";
|
||||
import {
|
||||
closestCenter,
|
||||
DndContext,
|
||||
@@ -15,6 +14,7 @@ import {
|
||||
verticalListSortingStrategy,
|
||||
} from "@dnd-kit/sortable";
|
||||
import { CSS } from "@dnd-kit/utilities";
|
||||
import { TOOLS } from "@snapotter/shared";
|
||||
import { FileImage, GripVertical, X } from "lucide-react";
|
||||
import { ICON_MAP } from "@/lib/icon-map";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { SOCIAL_MEDIA_PRESETS } from "@ashim/shared";
|
||||
import { SOCIAL_MEDIA_PRESETS } from "@snapotter/shared";
|
||||
import { Download, Info, Link, Unlink } from "lucide-react";
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import { ProgressCard } from "@/components/common/progress-card";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { SMART_CROP_FACE_PRESETS, SOCIAL_MEDIA_PRESETS } from "@ashim/shared";
|
||||
import { SMART_CROP_FACE_PRESETS, SOCIAL_MEDIA_PRESETS } from "@snapotter/shared";
|
||||
import { ArrowLeftRight, Info } from "lucide-react";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { ProgressCard } from "@/components/common/progress-card";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { CATEGORIES, TOOLS } from "@ashim/shared";
|
||||
import { CATEGORIES, TOOLS } from "@snapotter/shared";
|
||||
import { FileImage, Plus } from "lucide-react";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { SearchBar } from "@/components/common/search-bar";
|
||||
|
||||
@@ -59,7 +59,7 @@ export function useAuth() {
|
||||
return;
|
||||
}
|
||||
|
||||
const token = localStorage.getItem("ashim-token");
|
||||
const token = localStorage.getItem("snapotter-token");
|
||||
if (!token) {
|
||||
if (!cancelled)
|
||||
setState({
|
||||
@@ -96,7 +96,7 @@ export function useAuth() {
|
||||
analyticsConsentRemindAt: session.user?.analyticsConsentRemindAt ?? null,
|
||||
});
|
||||
} else {
|
||||
localStorage.removeItem("ashim-token");
|
||||
localStorage.removeItem("snapotter-token");
|
||||
if (!cancelled)
|
||||
setState({
|
||||
loading: false,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PYTHON_SIDECAR_TOOLS } from "@ashim/shared";
|
||||
import { PYTHON_SIDECAR_TOOLS } from "@snapotter/shared";
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import { formatHeaders, parseApiError } from "@/lib/api";
|
||||
import { generateId } from "@/lib/utils";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { AnalyticsConfig } from "@ashim/shared";
|
||||
import * as Sentry from "@sentry/react";
|
||||
import type { AnalyticsConfig } from "@snapotter/shared";
|
||||
import posthogJs from "posthog-js";
|
||||
|
||||
let posthog: import("posthog-js").PostHog | null = null;
|
||||
|
||||
@@ -46,7 +46,7 @@ export function parseApiError(
|
||||
|
||||
function getToken(): string {
|
||||
try {
|
||||
return localStorage.getItem("ashim-token") || "";
|
||||
return localStorage.getItem("snapotter-token") || "";
|
||||
} catch {
|
||||
return "";
|
||||
}
|
||||
@@ -62,7 +62,7 @@ export function formatHeaders(init?: HeadersInit): Headers {
|
||||
}
|
||||
if (!token) {
|
||||
try {
|
||||
const consent = localStorage.getItem("ashim-analytics-consent");
|
||||
const consent = localStorage.getItem("snapotter-analytics-consent");
|
||||
if (consent === "true" || consent === "false") {
|
||||
headers.set("X-Analytics-Consent", consent);
|
||||
}
|
||||
@@ -157,11 +157,11 @@ export async function apiDelete<T>(path: string): Promise<T> {
|
||||
}
|
||||
|
||||
export function setToken(token: string) {
|
||||
localStorage.setItem("ashim-token", token);
|
||||
localStorage.setItem("snapotter-token", token);
|
||||
}
|
||||
|
||||
export function clearToken() {
|
||||
localStorage.removeItem("ashim-token");
|
||||
localStorage.removeItem("snapotter-token");
|
||||
}
|
||||
|
||||
// ── File Upload / Download ──────────────────────────────────────
|
||||
|
||||
@@ -49,7 +49,7 @@ import {
|
||||
ZoomIn,
|
||||
} from "lucide-react";
|
||||
|
||||
// Only the icons actually used by tool definitions in @ashim/shared constants.
|
||||
// Only the icons actually used by tool definitions in @snapotter/shared constants.
|
||||
// Avoids `import * as icons from "lucide-react"` which pulls the entire 1000+ icon library.
|
||||
export const ICON_MAP: Record<string, LucideIcon> = {
|
||||
CheckCircle2,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { en } from "@ashim/shared";
|
||||
import { en } from "@snapotter/shared";
|
||||
import { Shield } from "lucide-react";
|
||||
import { useEffect } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
@@ -99,7 +99,7 @@ export function ChangePasswordPage() {
|
||||
}
|
||||
|
||||
// Trigger browser password save prompt via real form submission + navigation
|
||||
const username = localStorage.getItem("ashim-username") || "admin";
|
||||
const username = localStorage.getItem("snapotter-username") || "admin";
|
||||
triggerBrowserPasswordSave(username, newPassword);
|
||||
return; // navigation happens inside triggerBrowserPasswordSave
|
||||
} catch {
|
||||
@@ -133,7 +133,7 @@ export function ChangePasswordPage() {
|
||||
type="text"
|
||||
name="username"
|
||||
autoComplete="username"
|
||||
value={localStorage.getItem("ashim-username") || "admin"}
|
||||
value={localStorage.getItem("snapotter-username") || "admin"}
|
||||
readOnly
|
||||
className="w-full px-4 py-3 rounded-lg border border-border bg-muted text-muted-foreground cursor-not-allowed"
|
||||
/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { CategoryInfo, Tool } from "@ashim/shared";
|
||||
import { ANALYTICS_EVENTS, CATEGORIES, TOOLS } from "@ashim/shared";
|
||||
import type { CategoryInfo, Tool } from "@snapotter/shared";
|
||||
import { ANALYTICS_EVENTS, CATEGORIES, TOOLS } from "@snapotter/shared";
|
||||
import { Eye, EyeOff, FileImage, LayoutGrid, List, Search } from "lucide-react";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { Link, useNavigate } from "react-router-dom";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { CATEGORIES, PYTHON_SIDECAR_TOOLS, TOOLS } from "@ashim/shared";
|
||||
import { CATEGORIES, PYTHON_SIDECAR_TOOLS, TOOLS } from "@snapotter/shared";
|
||||
import { Download, Loader2 } from "lucide-react";
|
||||
import { useCallback, useEffect } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
@@ -25,7 +25,7 @@ export function LoginPage() {
|
||||
const data = await res.json();
|
||||
setToken(data.token);
|
||||
// Store username for settings display
|
||||
localStorage.setItem("ashim-username", data.user?.username || username);
|
||||
localStorage.setItem("snapotter-username", data.user?.username || username);
|
||||
// Redirect to password change if required, otherwise go home
|
||||
if (data.user?.mustChangePassword) {
|
||||
window.location.href = "/change-password";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PYTHON_SIDECAR_TOOLS, TOOL_BUNDLE_MAP, TOOLS } from "@ashim/shared";
|
||||
import { PYTHON_SIDECAR_TOOLS, TOOL_BUNDLE_MAP, TOOLS } from "@snapotter/shared";
|
||||
import {
|
||||
CheckCircle2,
|
||||
ChevronLeft,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { AnalyticsConfig, ConsentState } from "@ashim/shared";
|
||||
import type { AnalyticsConfig, ConsentState } from "@snapotter/shared";
|
||||
import { create } from "zustand";
|
||||
import { setAnalyticsConsent } from "@/lib/analytics";
|
||||
import { apiPut } from "@/lib/api";
|
||||
@@ -44,7 +44,7 @@ export const useAnalyticsStore = create<AnalyticsState>((set, get) => ({
|
||||
try {
|
||||
await apiPut("/v1/user/analytics", { enabled: true });
|
||||
} catch {
|
||||
localStorage.setItem("ashim-analytics-consent", "true");
|
||||
localStorage.setItem("snapotter-analytics-consent", "true");
|
||||
}
|
||||
const now = Date.now();
|
||||
const consent: ConsentState = {
|
||||
@@ -60,7 +60,7 @@ export const useAnalyticsStore = create<AnalyticsState>((set, get) => ({
|
||||
try {
|
||||
await apiPut("/v1/user/analytics", { enabled: false });
|
||||
} catch {
|
||||
localStorage.setItem("ashim-analytics-consent", "false");
|
||||
localStorage.setItem("snapotter-analytics-consent", "false");
|
||||
}
|
||||
const now = Date.now();
|
||||
const consent: ConsentState = {
|
||||
@@ -76,7 +76,7 @@ export const useAnalyticsStore = create<AnalyticsState>((set, get) => ({
|
||||
try {
|
||||
await apiPut("/v1/user/analytics", { remindLater: true });
|
||||
} catch {
|
||||
localStorage.setItem("ashim-analytics-consent", "remind");
|
||||
localStorage.setItem("snapotter-analytics-consent", "remind");
|
||||
}
|
||||
const now = Date.now();
|
||||
const consent: ConsentState = {
|
||||
@@ -92,7 +92,7 @@ export const useAnalyticsStore = create<AnalyticsState>((set, get) => ({
|
||||
try {
|
||||
await apiPut("/v1/user/analytics", { enabled });
|
||||
} catch {
|
||||
localStorage.setItem("ashim-analytics-consent", enabled ? "true" : "false");
|
||||
localStorage.setItem("snapotter-analytics-consent", enabled ? "true" : "false");
|
||||
}
|
||||
set((state) => ({
|
||||
consent: { ...state.consent, analyticsEnabled: enabled },
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { FeatureBundleState } from "@ashim/shared";
|
||||
import { TOOL_BUNDLE_MAP } from "@ashim/shared";
|
||||
import type { FeatureBundleState } from "@snapotter/shared";
|
||||
import { TOOL_BUNDLE_MAP } from "@snapotter/shared";
|
||||
import { create } from "zustand";
|
||||
import { apiGet, apiPost } from "@/lib/api";
|
||||
|
||||
|
||||
@@ -25,6 +25,6 @@ export const useThemeStore = create<ThemeStore>()(
|
||||
set({ theme, resolvedTheme: resolved });
|
||||
},
|
||||
}),
|
||||
{ name: "ashim-theme" },
|
||||
{ name: "snapotter-theme" },
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user