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 { en } from "@ashim/shared";
import { en } from "@snapotter/shared";
import { Shield } from "lucide-react";
import { useEffect } from "react";
import { useNavigate } from "react-router-dom";
+2 -2
View File
@@ -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"
/>
+2 -2
View File
@@ -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 -1
View File
@@ -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";
+1 -1
View File
@@ -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 -1
View File
@@ -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,