Skip to content

Commit 7c53112

Browse files
committed
Initial commit: Stripdown — Markdown → unstyled rich text
Single-page React + Vite app that converts Markdown to clean, unstyled HTML and copies it to the clipboard, so it inherits the destination's formatting when pasted (Google Docs, email, Notion, etc.). Includes CI (lint, typecheck, test, build) and a GitHub Pages deploy workflow.
0 parents  commit 7c53112

81 files changed

Lines changed: 14739 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
check:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
15+
- uses: pnpm/action-setup@v4
16+
with:
17+
version: 10
18+
19+
- uses: actions/setup-node@v4
20+
with:
21+
node-version: 22
22+
cache: pnpm
23+
24+
- run: pnpm install --frozen-lockfile
25+
26+
- run: pnpm lint
27+
28+
- run: pnpm typecheck
29+
30+
- run: pnpm test
31+
32+
- run: pnpm build

.github/workflows/deploy.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Deploy to GitHub Pages
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: pages
15+
cancel-in-progress: false
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- uses: pnpm/action-setup@v4
24+
with:
25+
version: 10
26+
27+
- uses: actions/setup-node@v4
28+
with:
29+
node-version: 22
30+
cache: pnpm
31+
32+
- run: pnpm install --frozen-lockfile
33+
34+
- run: pnpm build
35+
36+
# SPA fallback: GitHub Pages serves 404.html for unknown paths.
37+
- run: cp dist/index.html dist/404.html
38+
39+
- uses: actions/configure-pages@v5
40+
41+
- uses: actions/upload-pages-artifact@v3
42+
with:
43+
path: dist
44+
45+
deploy:
46+
needs: build
47+
runs-on: ubuntu-latest
48+
environment:
49+
name: github-pages
50+
url: ${{ steps.deployment.outputs.page_url }}
51+
steps:
52+
- id: deployment
53+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# Dependencies
2+
**/node_modules
3+
.pnpm-store/
4+
5+
# Build outputs
6+
dist/
7+
build/
8+
*.dist
9+
10+
# Environment variables
11+
.env
12+
.env.local
13+
.env.development.local
14+
.env.test.local
15+
.env.production.local
16+
17+
# IDE and editor files
18+
.vscode/
19+
.idea/
20+
*.swp
21+
*.swo
22+
*~
23+
24+
# OS generated files
25+
.DS_Store
26+
.DS_Store?
27+
._*
28+
.Spotlight-V100
29+
.Trashes
30+
ehthumbs.db
31+
Thumbs.db
32+
33+
# Logs
34+
logs
35+
*.log
36+
npm-debug.log*
37+
yarn-debug.log*
38+
yarn-error.log*
39+
pnpm-debug.log*
40+
lerna-debug.log*
41+
42+
# Runtime data
43+
pids
44+
*.pid
45+
*.seed
46+
*.pid.lock
47+
48+
# Coverage directory used by tools like istanbul
49+
coverage/
50+
*.lcov
51+
52+
# nyc test coverage
53+
.nyc_output
54+
55+
# Dependency directories
56+
jspm_packages/
57+
58+
# TypeScript cache
59+
*.tsbuildinfo
60+
61+
# Optional npm cache directory
62+
.npm
63+
64+
# Optional eslint cache
65+
.eslintcache
66+
67+
# Microbundle cache
68+
.rpt2_cache/
69+
.rts2_cache_cjs/
70+
.rts2_cache_es/
71+
.rts2_cache_umd/
72+
73+
# Optional REPL history
74+
.node_repl_history
75+
76+
# Output of 'npm pack'
77+
*.tgz
78+
79+
# Yarn Integrity file
80+
.yarn-integrity
81+
82+
# parcel-bundler cache (https://parceljs.org/)
83+
.cache
84+
.parcel-cache
85+
86+
# Next.js build output
87+
.next
88+
89+
# Nuxt.js build / generate output
90+
.nuxt
91+
92+
# Gatsby files
93+
.cache/
94+
95+
# Storybook build outputs
96+
.out
97+
.storybook-out
98+
99+
# Temporary folders
100+
tmp/
101+
temp/
102+
103+
# Database
104+
*.db
105+
*.sqlite
106+
*.sqlite3
107+

.prettierignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dist
2+
node_modules
3+
.git
4+
pnpm-lock.yaml
5+
*.min.js
6+
*.min.css

.prettierrc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"semi": true,
3+
"trailingComma": "es5",
4+
"singleQuote": false,
5+
"printWidth": 80,
6+
"tabWidth": 2,
7+
"useTabs": false,
8+
"bracketSpacing": true,
9+
"bracketSameLine": false,
10+
"arrowParens": "avoid",
11+
"endOfLine": "lf",
12+
"quoteProps": "as-needed",
13+
"jsxSingleQuote": false,
14+
"proseWrap": "preserve"
15+
}

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 Gerard Rovira Sánchez
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Stripdown
2+
3+
Convert Markdown to **unstyled** rich text and copy it to your clipboard. The output preserves structure (headings, lists, tables, code, links) but carries no opinionated fonts, colors, or sizes — paste it anywhere and it inherits the destination's styling.
4+
5+
Live: https://zurfyx.github.io/stripdown/
6+
7+
## Stack
8+
9+
- React 19 + TypeScript + Vite
10+
- Tailwind CSS v4 + shadcn/ui (Radix primitives)
11+
- `marked` for Markdown parsing
12+
- Vitest for tests
13+
14+
## Develop
15+
16+
```bash
17+
pnpm install
18+
pnpm dev # http://localhost:3000
19+
pnpm test # run unit tests
20+
pnpm typecheck # tsc --noEmit
21+
pnpm lint # prettier --check
22+
pnpm build # static site → dist/
23+
```
24+
25+
## Deploy
26+
27+
Pushes to `main` build and publish to GitHub Pages via `.github/workflows/deploy.yml`. CI on every push and PR runs lint, typecheck, test, and build via `.github/workflows/ci.yml`.
28+
29+
## License
30+
31+
MIT

client/index.html

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta
6+
name="viewport"
7+
content="width=device-width, initial-scale=1.0, maximum-scale=1"
8+
/>
9+
<title>Stripdown</title>
10+
<meta
11+
name="description"
12+
content="Convert Markdown to unstyled rich text and copy it to your clipboard."
13+
/>
14+
<link rel="preconnect" href="https://fonts.googleapis.com" />
15+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
16+
<link
17+
href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=JetBrains+Mono:wght@400;500;600&display=swap"
18+
rel="stylesheet"
19+
/>
20+
</head>
21+
22+
<body>
23+
<div id="root"></div>
24+
<script type="module" src="/src/main.tsx"></script>
25+
</body>
26+
</html>

client/public/.gitkeep

Whitespace-only changes.

client/src/App.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Toaster } from "@/components/ui/sonner";
2+
import { TooltipProvider } from "@/components/ui/tooltip";
3+
import NotFound from "@/pages/NotFound";
4+
import { Route, Switch } from "wouter";
5+
import ErrorBoundary from "./components/ErrorBoundary";
6+
import { ThemeProvider } from "./contexts/ThemeContext";
7+
import Home from "./pages/Home";
8+
9+
function Router() {
10+
return (
11+
<Switch>
12+
<Route path={"/"} component={Home} />
13+
<Route path={"/404"} component={NotFound} />
14+
<Route component={NotFound} />
15+
</Switch>
16+
);
17+
}
18+
19+
function App() {
20+
return (
21+
<ErrorBoundary>
22+
<ThemeProvider defaultTheme="light">
23+
<TooltipProvider>
24+
<Toaster position="bottom-center" />
25+
<Router />
26+
</TooltipProvider>
27+
</ThemeProvider>
28+
</ErrorBoundary>
29+
);
30+
}
31+
32+
export default App;

0 commit comments

Comments
 (0)