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:
SnapOtter
2026-04-24 18:06:29 +08:00
parent fbaa603d03
commit 0309e0f680
174 changed files with 970 additions and 926 deletions
@@ -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";
+2 -2
View File
@@ -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";
+4 -4
View File
@@ -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";