9 Commits
v0.0.3 ... main

Author SHA1 Message Date
typist
28a86dcbff 0.0.7
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m24s
2025-10-28 04:40:54 +08:00
7cd826b052 feat: add-tool base64 (#7)
Co-authored-by: typist <git@mail.typist.cc>
Reviewed-on: #7
2025-10-28 04:39:39 +08:00
typist
da20e34dc9 0.0.6
All checks were successful
Build and Push Docker Image / build (push) Successful in 30s
2025-10-28 04:20:13 +08:00
typist
a43b5a96bb chore: add release scripts for versioning in package.json 2025-10-28 04:20:11 +08:00
typist
48aaa262c1 chore: optimize pnpm install with build cache in Dockerfile 2025-10-28 04:17:10 +08:00
660839d854 Merge pull request 'chore: update build cache configuration in build.yaml to use registry' (#6) from chore/update-builder-cache into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m6s
Reviewed-on: #6
2025-10-28 04:10:02 +08:00
typist
6d23d601a8 chore: bump version to 0.0.5 in package.json 2025-10-28 04:10:33 +08:00
typist
7405f2cb88 chore: update build cache configuration in build.yaml to use registry
All checks were successful
Build and Push Docker Image / build (push) Successful in 29s
2025-10-28 04:05:02 +08:00
typist
d415615ad7 refactor: remove unused Alert component import from json.tsx
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m56s
2025-10-28 03:54:07 +08:00
7 changed files with 90 additions and 9 deletions

View File

@@ -42,8 +42,8 @@ jobs:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=local,src=/cache
cache-to: type=local,dest=/cache,mode=max
cache-from: type=registry,ref=${{ secrets.REGISTRY_ENDPOINT }}/${{ github.repository_owner }}/litek:buildcache
cache-to: type=registry,ref=${{ secrets.REGISTRY_ENDPOINT }}/${{ github.repository_owner }}/litek:buildcache,mode=max
# platforms: linux/amd64,linux/arm64
platforms: linux/amd64

View File

@@ -11,7 +11,8 @@ WORKDIR /app
COPY package.json pnpm-lock.yaml ./
# 安装依赖
RUN pnpm install --frozen-lockfile
RUN --mount=type=cache,target=/root/.local/share/pnpm/store \
pnpm install --frozen-lockfile
# 复制源代码
COPY . .

View File

@@ -1,13 +1,16 @@
{
"name": "litek",
"private": true,
"version": "0.0.3",
"version": "0.0.7",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview"
"preview": "vite preview",
"release:patch": "npm version patch && git push --follow-tags",
"release:minor": "npm version minor && git push --follow-tags",
"release:major": "npm version major && git push --follow-tags"
},
"dependencies": {
"@radix-ui/react-dialog": "^1.1.15",

View File

@@ -0,0 +1,70 @@
import { useState, type FC } from "react";
import { Textarea } from "@/components/ui/textarea";
import { Button } from "@/components/ui/button";
import { toast } from "sonner";
import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react";
const Tool: FC = () => {
const [decoded, setDecoded] = useState<string>("");
const [encoded, setEncoded] = useState<string>("");
const encode = () => {
try {
const encoded64 = btoa(decoded);
setEncoded(encoded64);
setDecoded("");
toast.success("encoded successfully");
} catch (error: unknown) {
if (error instanceof Error) {
toast.error(error.message);
} else {
toast.error("encoding failed");
}
}
};
const decode = () => {
try {
const decoded64 = atob(encoded);
setDecoded(decoded64);
setEncoded("");
toast.success("decoded successfully");
} catch (error: unknown) {
if (error instanceof Error) {
toast.error(error.message);
} else {
toast.error("decoding failed");
}
}
};
return (
<div className="h-[50vh] flex flex-row gap-4 pt-[20vh]">
<Textarea
className="flex-1 resize-none"
placeholder="Enter the original text"
value={decoded}
onChange={(e) => setDecoded(e.target.value)}
/>
<div className="flex flex-col gap-2 justify-center">
<Button onClick={encode}>
<ArrowRightIcon className="size-4" />
Encode
</Button>
<Button onClick={decode}>
<ArrowLeftIcon className="size-4" />
Decode
</Button>
</div>
<Textarea
className="flex-1 resize-none"
placeholder="Enter the Base64 encoded text"
value={encoded}
onChange={(e) => setEncoded(e.target.value)}
/>
</div>
);
};
export default Tool;

View File

@@ -1,8 +1,9 @@
import type { ReactNode } from 'react';
import { FileJson, Hash } from 'lucide-react'
import { FileJson, Hash, Binary } from 'lucide-react'
import UUID from './uuid'
import JSON from './json'
import Base64 from './base64'
export interface Tool {
path: string;
@@ -26,5 +27,12 @@ export const tools: Tool[] = [
description: "Format and validate JSON",
icon: <FileJson />,
component: <JSON />,
},
{
path: "base64",
name: "Base64 Encoder/Decoder",
description: "Encode and decode Base64",
icon: <Binary />,
component: <Base64 />,
}
];

View File

@@ -1,7 +1,6 @@
import { useState, type FC } from "react";
import { Textarea } from "@/components/ui/textarea";
import { Button } from "@/components/ui/button";
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { toast } from "sonner";
const Tool: FC = () => {

View File

@@ -7,12 +7,12 @@ import { AppSidebar } from "@/components/sidebar";
export const Layout: FC = () => (
<SidebarProvider>
<AppSidebar />
<div className="p-4 flex flex-col w-full h-[100vh]">
<div className="p-4 flex flex-col w-full h-[100vh] overflow-hidden">
<nav className="flex items-center justify-between">
<SidebarTrigger className="size-10" />
<div role="actions" />
</nav>
<main className="flex-1 overflow-auto p-4">
<main className="flex-1 overflow-auto p-4 overflow-hidden">
<Outlet />
</main>
</div>