diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 751f71aa..73965d37 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -1,63 +1,39 @@ -# Simple workflow for deploying static content to GitHub Pages -name: Deploy static content to Pages +name: Deploy GitHub Pages on: - # Runs on pushes targeting the default branch push: - branches: ["dev"] - - # Allows you to run this workflow manually from the Actions tab + branches: + - dev workflow_dispatch: -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "pages" - cancel-in-progress: false + group: pages + cancel-in-progress: true jobs: - # Single deploy job since we're just deploying deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - - name: Checkout uses: actions/checkout@v4 with: - submodules: true fetch-depth: 1 - - name: Copy README.md into place - run: | - rm -f ./website/README.md - cp ./README.md ./website/README.md + - name: Setup Pages uses: actions/configure-pages@v5 - - name: Build with Jekyll - uses: actions/jekyll-build-pages@v1 - with: - source: ./website - destination: ./_site + - name: Upload artifact uses: actions/upload-pages-artifact@v3 - - # - name: Checkout - # uses: actions/checkout@v4 - # - name: Setup Pages - # uses: actions/configure-pages@v5 - # - name: Upload artifact - # uses: actions/upload-pages-artifact@v3 - # with: - # # Upload entire repository - # path: './website' + with: + path: ./publicsite - name: Deploy to GitHub Pages id: deployment diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml deleted file mode 100644 index 0c6fb568..00000000 --- a/.github/workflows/jekyll-gh-pages.yml +++ /dev/null @@ -1,58 +0,0 @@ -# Sample workflow for building and deploying a Jekyll site to GitHub Pages -name: Build GitHub Pages website - -on: - # Runs on pushes targeting the default branch - push: - branches: ["dev"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: true - -jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 1 - - name: Copy README.md into place - run: | - rm ./website/README.md - cp ./README.md ./website/README.md - - name: Setup Pages - uses: actions/configure-pages@v5 - - name: Build with Jekyll - uses: actions/jekyll-build-pages@v1 - with: - source: ./website - destination: ./_site - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/publicsite/.nojekyll b/publicsite/.nojekyll new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/publicsite/.nojekyll @@ -0,0 +1 @@ + diff --git a/website/CNAME b/publicsite/CNAME similarity index 100% rename from website/CNAME rename to publicsite/CNAME diff --git a/website/icon.png b/publicsite/icon.png similarity index 100% rename from website/icon.png rename to publicsite/icon.png diff --git a/publicsite/index.html b/publicsite/index.html new file mode 100644 index 00000000..035faa51 --- /dev/null +++ b/publicsite/index.html @@ -0,0 +1,275 @@ + + + + + + + ArchiveBox - Open-source self-hosted web archiving + + + + + + + + +
+
+
+

Open-source self-hosted web archiving

+

Preserve the web content you care about, on infrastructure you control.

+

ArchiveBox saves websites, bookmarks, RSS feeds, social posts, media, source code, and research material in durable files like HTML, PDF, PNG, TXT, JSON, WARC, MP4, and SQLite.

+ + +
+
+
+
+ +
+
mkdir -p ~/archivebox/data && cd ~/archivebox
+curl -fsSL 'https://docker-compose.archivebox.io' > docker-compose.yml
+docker compose run archivebox init --install
+docker compose up
+
+ ArchiveBox snapshot list in the admin web interface +
+
+ +
+ CLI + Web UI + REST API + Webhooks + Browser extension + Filesystem access +
+ +
+
+

Why ArchiveBox

+

Designed for useful archives, not proprietary silos.

+
+
+
+

Readable for decades

+

Snapshots are stored as ordinary files and folders, with metadata in SQLite and JSON. You can browse the collection without depending on a hosted service.

+
+
+

Multiple captures per URL

+

ArchiveBox can save rendered HTML, screenshots, PDFs, WARC files, article text, headers, favicons, media, subtitles, and source repositories.

+
+
+

Bring your sources

+

Import one URL, pipe text into the CLI, upload exported bookmarks, or schedule recurring pulls from RSS feeds and other text-based source lists.

+
+
+

Self-hosted by default

+

Run it as a Docker web app, use one-off CLI commands, or automate with APIs while keeping private and public material under your own policy.

+
+
+
+ +
+
+

Who it is for

+

Archiving workflows for individuals, professionals, and institutions.

+
+
+
+

Personal archivists and self-hosters

+

Save bookmarks, browser history, RSS feeds, social media, form content, videos, podcasts, music, photos, and personal knowledge collections.

+
    +
  • Own your data and keep it on local or remote storage you control.
  • +
  • Use the browser extension, CLI, Web UI, and scheduled imports together.
  • +
  • Export static HTML or browse the filesystem directly.
  • +
+
+
+

Lawyers and journalists

+

Capture web pages, articles, source material, and public records while preserving reviewable copies outside of volatile platforms.

+
    +
  • Store screenshots, PDFs, headers, WARC files, and text extraction.
  • +
  • Tag and review sources through the self-hosted web interface.
  • +
  • Tune privacy, authentication, and publishing settings for casework.
  • +
+
+
+

Researchers and institutions

+

Support OSINT, social media research, AI-powered research agents, libraries, governments, and collection-building teams.

+
    +
  • Automate imports through the CLI, REST API, webhooks, and schedules.
  • +
  • Keep machine-readable metadata in JSON and SQLite.
  • +
  • Extend extraction pipelines through the ArchiveBox ecosystem.
  • +
+
+
+
+ +
+
+

Recommended install

+

Start with Docker Compose.

+

Docker Compose is the recommended ArchiveBox setup for the easiest install and update path, better isolation, and bundled archiving dependencies like Chrome, wget, yt-dlp, SingleFile, and readability tools.

+ +
+
+
+ 1 +
+

Create a data directory

+
mkdir -p ~/archivebox/data && cd ~/archivebox
+
+
+
+ 2 +
+

Download Docker Compose config

+
curl -fsSL 'https://docker-compose.archivebox.io' > docker-compose.yml
+
+
+
+ 3 +
+

Initialize and start

+
docker compose run archivebox init --install
+docker compose up
+
+
+
+ 4 +
+

Add your first URL

+
docker compose run archivebox add 'https://example.com'
+
+
+
+
+ +
+

Other install paths

+

ArchiveBox can also run with plain Docker, pip, brew, deb packages, or the optional setup script. Docker Compose remains the default recommendation, especially when you want bundled dependencies and clean upgrades.

+ +
+ +
+
+

Inputs and outputs

+

Feed it almost any source list. Keep redundant, portable captures.

+
+
+
+

Inputs

+

Archive one URL at a time or schedule imports from bookmarks, browser history, RSS, JSON, CSV, TXT, SQL, HTML, Markdown, Pocket, Pinboard, Instapaper, Shaarli, Wallabag, and more.

+
+
+

Outputs

+

Each snapshot can include original HTML, rendered single-file HTML, PDF, screenshot PNG, WARC, title, article text, favicon, headers, media, subtitles, metadata, thumbnails, and git clones.

+
+
+

Access

+

Manage the same collection through the Web UI, CLI, REST API, Python API, SQLite, or the data folder itself. The tools are complementary, not separate products.

+
+
+
+ +
+
+

Ecosystem

+

Core projects that make ArchiveBox extensible.

+
+
+
+

abx-plugins

+

Extractor and plugin packages used to preserve more types of content.

+
+ GitHub + Docs +
+
+
+

abx-dl

+

Download and extraction tooling for saving web content and media.

+
+ GitHub +
+
+
+

abxpkg

+

Runtime package management for dependencies used by ArchiveBox and plugins.

+
+ GitHub + Docs +
+
+
+

abxbus

+

Event bus infrastructure for ArchiveBox automation and integrations.

+
+ GitHub + Site +
+
+
+
+ +
+
+

Documentation

+

Go deeper when you need production details.

+

The README and wiki cover supported sources, outputs, scheduled archiving, storage backends, authentication, security, publishing, Chrome setup, upgrades, and troubleshooting.

+
+ +
+
+ + + + diff --git a/publicsite/shadcn-theme.css b/publicsite/shadcn-theme.css new file mode 100644 index 00000000..0ca1f8a3 --- /dev/null +++ b/publicsite/shadcn-theme.css @@ -0,0 +1,22 @@ +:root { + --background: 339 49% 100%; + --foreground: 339 66% 4%; + --muted: 99 20% 93%; + --muted-foreground: 99 9% 39%; + --popover: 339 49% 100%; + --popover-foreground: 339 66% 4%; + --card: 339 49% 100%; + --card-foreground: 339 66% 4%; + --border: 339 7% 94%; + --input: 339 7% 94%; + --primary: 339 48% 41%; + --primary-foreground: 0 0% 100%; + --secondary: 99 48% 41%; + --secondary-foreground: 0 0% 100%; + --accent: 219 48% 41%; + --accent-foreground: 0 0% 100%; + --destructive: 19 85% 36%; + --destructive-foreground: 0 0% 100%; + --ring: 339 48% 41%; + --radius: 0.5rem; +} diff --git a/publicsite/styles.css b/publicsite/styles.css new file mode 100644 index 00000000..f2a7556c --- /dev/null +++ b/publicsite/styles.css @@ -0,0 +1,624 @@ +:root { + color-scheme: light; + --font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; + --page: hsl(var(--background)); + --text: hsl(var(--foreground)); + --muted-text: hsl(var(--muted-foreground)); + --line: hsl(var(--border)); + --panel: hsl(var(--card)); + --soft: hsl(var(--muted)); + --brand: hsl(var(--primary)); + --brand-text: hsl(var(--primary-foreground)); + --green: hsl(var(--secondary)); + --blue: hsl(var(--accent)); + --shadow: 0 20px 70px hsl(339 48% 41% / 0.12); + --radius: 8px; + --content: 1180px; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + overflow-x: hidden; + background: + linear-gradient(180deg, hsl(339 49% 99%) 0%, hsl(99 20% 97%) 44%, #ffffff 100%); + color: var(--text); + font-family: var(--font-sans); + line-height: 1.55; +} + +body::before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + background-image: + linear-gradient(hsl(339 7% 94% / 0.56) 1px, transparent 1px), + linear-gradient(90deg, hsl(339 7% 94% / 0.56) 1px, transparent 1px); + background-size: 40px 40px; + mask-image: linear-gradient(180deg, black 0%, transparent 56%); +} + +a { + color: var(--brand); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +img { + max-width: 100%; + display: block; +} + +pre { + margin: 0; + overflow-x: auto; + white-space: pre; +} + +code { + font-family: var(--font-mono); + font-size: 0.92rem; +} + +.site-header { + position: sticky; + top: 0; + z-index: 20; + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + width: min(var(--content), calc(100vw - 32px)); + margin: 0 auto; + padding: 16px 0; + background: hsl(var(--background) / 0.88); + backdrop-filter: blur(16px); + border-bottom: 1px solid hsl(var(--border) / 0.72); +} + +.brand { + display: inline-flex; + align-items: center; + gap: 10px; + color: var(--text); + font-weight: 760; + letter-spacing: 0; +} + +.brand:hover { + text-decoration: none; +} + +.brand img { + border-radius: 8px; +} + +.site-header nav, +.site-footer div:last-child, +.hero-links, +.mini-links { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 10px 18px; +} + +.site-header nav a { + color: var(--muted-text); + font-size: 0.94rem; + font-weight: 650; +} + +.site-header nav a:hover { + color: var(--brand); +} + +.section { + position: relative; + width: min(var(--content), calc(100vw - 32px)); + margin: 0 auto; + padding: 88px 0; +} + +.hero { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(360px, 0.82fr); + gap: 48px; + align-items: center; + min-height: calc(100vh - 76px); + padding-top: 56px; +} + +.hero-copy { + min-width: 0; +} + +.eyebrow { + margin: 0 0 14px; + color: var(--brand); + font-size: 0.78rem; + font-weight: 820; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +h1, +h2, +h3, +p { + margin-top: 0; +} + +h1 { + max-width: 850px; + margin-bottom: 22px; + font-size: clamp(3.1rem, 7.4vw, 5.9rem); + line-height: 0.95; + letter-spacing: 0; +} + +h2 { + margin-bottom: 18px; + font-size: clamp(2rem, 4.3vw, 3.5rem); + line-height: 1; + letter-spacing: 0; +} + +h3 { + margin-bottom: 10px; + font-size: 1.08rem; + line-height: 1.25; + letter-spacing: 0; +} + +.lede { + max-width: 720px; + color: var(--muted-text); + font-size: clamp(1.1rem, 2vw, 1.32rem); +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin: 32px 0 20px; +} + +.button { + display: inline-flex; + min-height: 46px; + align-items: center; + justify-content: center; + padding: 0 18px; + border: 1px solid var(--line); + border-radius: var(--radius); + font-weight: 760; +} + +.button:hover { + text-decoration: none; +} + +.button.primary { + background: var(--brand); + color: var(--brand-text); + border-color: var(--brand); + box-shadow: 0 12px 28px hsl(339 48% 41% / 0.2); +} + +.button.secondary { + background: var(--panel); + color: var(--text); +} + +.hero-links a, +.mini-links a { + color: var(--muted-text); + font-weight: 650; +} + +.hero-panel { + display: grid; + gap: 18px; + min-width: 0; +} + +.terminal, +.command-card, +.audience-card, +.project-grid article, +.data-grid article, +.feature-grid article, +.docs-band, +.compact-docs { + background: hsl(var(--card) / 0.94); + border: 1px solid var(--line); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.terminal { + overflow: hidden; + min-width: 0; +} + +.terminal-bar { + display: flex; + gap: 7px; + padding: 14px 16px; + border-bottom: 1px solid var(--line); + background: hsl(var(--muted) / 0.62); +} + +.terminal-bar span { + width: 10px; + height: 10px; + border-radius: 999px; + background: var(--brand); +} + +.terminal-bar span:nth-child(2) { + background: var(--green); +} + +.terminal-bar span:nth-child(3) { + background: var(--blue); +} + +.terminal pre, +.step pre { + padding: 18px; + background: hsl(339 66% 4%); + color: hsl(0 0% 100%); +} + +.product-shot { + width: 100%; + border: 1px solid var(--line); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.trust-strip { + position: relative; + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 10px; + width: min(var(--content), calc(100vw - 32px)); + margin: -28px auto 0; + padding: 18px; + background: hsl(var(--background) / 0.88); + border: 1px solid var(--line); + border-radius: var(--radius); +} + +.trust-strip span { + display: inline-flex; + min-height: 34px; + align-items: center; + padding: 0 13px; + background: var(--soft); + border-radius: 999px; + color: var(--muted-text); + font-size: 0.9rem; + font-weight: 720; +} + +.split { + display: grid; + grid-template-columns: minmax(240px, 0.54fr) minmax(0, 1fr); + gap: 36px; + align-items: start; +} + +.feature-grid, +.audience-grid, +.data-grid, +.project-grid, +.doc-link-grid { + display: grid; + gap: 16px; +} + +.feature-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.feature-grid article, +.data-grid article, +.project-grid article { + padding: 22px; +} + +.feature-grid p, +.audience-card p, +.data-grid p, +.project-grid p, +.docs-band p, +.compact-docs p, +.site-footer p { + color: var(--muted-text); +} + +.section-heading { + max-width: 780px; + margin-bottom: 34px; +} + +.audience-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.audience-card { + display: flex; + min-height: 100%; + flex-direction: column; + padding: 26px; +} + +.audience-card ul { + margin: auto 0 0; + padding-left: 19px; + color: var(--muted-text); +} + +.audience-card li + li { + margin-top: 8px; +} + +.install-section { + display: grid; + grid-template-columns: minmax(0, 0.72fr) minmax(360px, 1fr); + gap: 34px; + align-items: start; +} + +.install-copy { + position: sticky; + top: 112px; +} + +.command-card { + display: grid; + gap: 1px; + overflow: hidden; + background: var(--line); + min-width: 0; +} + +.step { + display: grid; + grid-template-columns: 46px minmax(0, 1fr); + gap: 16px; + padding: 22px; + background: var(--panel); +} + +.step > span { + display: inline-flex; + width: 34px; + height: 34px; + align-items: center; + justify-content: center; + background: var(--brand); + border-radius: 999px; + color: var(--brand-text); + font-weight: 820; +} + +.step h3 { + margin-bottom: 12px; +} + +.step pre { + border-radius: 6px; +} + +.compact-docs { + padding: 34px; +} + +.doc-link-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.doc-link-grid a { + display: flex; + min-height: 48px; + align-items: center; + justify-content: center; + padding: 10px 12px; + background: var(--soft); + border: 1px solid hsl(var(--border) / 0.72); + border-radius: var(--radius); + color: var(--text); + font-weight: 720; + text-align: center; +} + +.doc-link-grid a:hover { + border-color: var(--brand); + color: var(--brand); + text-decoration: none; +} + +.data-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.ecosystem { + padding-top: 72px; +} + +.project-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.project-grid article { + display: flex; + min-height: 230px; + flex-direction: column; +} + +.project-grid article div { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: auto; +} + +.project-grid article a { + display: inline-flex; + min-height: 34px; + align-items: center; + padding: 0 11px; + background: var(--soft); + border-radius: 999px; + font-weight: 740; +} + +.docs-band { + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(360px, 1fr); + gap: 28px; + align-items: center; + padding: 34px; +} + +.docs-band .doc-link-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.site-footer { + position: relative; + display: grid; + grid-template-columns: minmax(160px, auto) minmax(220px, 1fr) auto; + gap: 24px; + align-items: center; + width: min(var(--content), calc(100vw - 32px)); + margin: 0 auto; + padding: 38px 0 48px; + border-top: 1px solid var(--line); +} + +.site-footer p { + margin: 0; +} + +.site-footer a { + color: var(--muted-text); + font-weight: 650; +} + +@media (max-width: 980px) { + .site-header, + .hero, + .split, + .install-section, + .docs-band, + .site-footer { + grid-template-columns: 1fr; + } + + .site-header { + align-items: flex-start; + flex-direction: column; + } + + .hero { + min-height: auto; + } + + .install-copy { + position: static; + } + + .audience-grid, + .data-grid, + .project-grid { + grid-template-columns: 1fr 1fr; + } + + .doc-link-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 680px) { + .site-header, + .section, + .trust-strip, + .site-footer { + width: min(358px, calc(100vw - 32px)); + margin-left: 16px; + margin-right: 16px; + } + + .section { + padding: 62px 0; + } + + .site-header { + position: static; + } + + .site-header nav { + width: 100%; + } + + h1 { + font-size: 2.55rem; + line-height: 1.02; + } + + .hero { + padding-top: 36px; + } + + .hero-panel, + .install-section { + min-width: 0; + } + + .feature-grid, + .audience-grid, + .data-grid, + .project-grid, + .doc-link-grid, + .docs-band .doc-link-grid { + grid-template-columns: 1fr; + } + + .step { + grid-template-columns: 1fr; + } + + .command-card, + .compact-docs, + .docs-band, + .audience-card { + padding: 22px; + } + + .terminal pre, + .step pre { + padding: 14px; + } + + code { + font-size: 0.82rem; + } +} diff --git a/pyproject.toml b/pyproject.toml index 1dffdd47..f0041abf 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -179,7 +179,7 @@ ignore = ["E731", "E303", "E266", "E241", "E222"] [tool.codespell] ignore-words-list = "abx,archivebox,adminsnapshots,bu,wit,dont,cant,wont,havent,thats,shouldnt,doesnt,doenst,re-use,re-used,re-using,re-usable" -skip = "*.json,*.min.js,*.min.css,uv.lock,old/*,website/*" +skip = "*.json,*.min.js,*.min.css,uv.lock,old/*,publicsite/*" [tool.pytest.ini_options] testpaths = [ "archivebox/tests" ] diff --git a/website/README.md b/website/README.md deleted file mode 120000 index 32d46ee8..00000000 --- a/website/README.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/website/_config.yml b/website/_config.yml deleted file mode 100644 index 9f63db0d..00000000 --- a/website/_config.yml +++ /dev/null @@ -1,3 +0,0 @@ -production_url: https://archivebox.io -theme: jekyll-theme-merlot -# Github Pages static site settings for https://archivebox.io diff --git a/website/assets/README.md b/website/assets/README.md deleted file mode 100644 index 6ba186cb..00000000 --- a/website/assets/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# assets/ - -This folder contains assets used by the Jekyll Static Site Generator for ArchiveBox.io. - -It cannot be moved or renamed or the custom CSS on ArchiveBox.io will break. diff --git a/website/assets/css/style.scss b/website/assets/css/style.scss deleted file mode 100644 index 44657267..00000000 --- a/website/assets/css/style.scss +++ /dev/null @@ -1,50 +0,0 @@ ---- ---- - -@import "{{ site.theme }}"; - -div.shell { - width: 80%; - max-width: 1300px; - min-width: 300px; -} - -span.banner-fix { - width: 80%; - max-width: 1300px; - min-width: 300px; -} - -header h1 { - background-color: #aa1f55; - padding-bottom: 15px; - font-weight: 200px; -} -header h2 { - background-color: #aa1f55; - font-family: 'Open Sans'; -} - -#main_content div[align=center] h1 { - display: none; -} -#main_content img { - box-shadow: 4px 4px 4px rgba(0,0,0,0.1); - border-radius: 8px; - border: 0px; - vertical-align: top; -} -#main_content em img { - display: block; - margin-top: -83px; - padding: 0px; - margin-bottom: 20px; -} - -#main_content img[alt=comparison] { - margin: 25px; -} - -#forkme_banner { - opacity: 0.1; -} diff --git a/website/shadcn-theme.css b/website/shadcn-theme.css deleted file mode 100644 index acd91256..00000000 --- a/website/shadcn-theme.css +++ /dev/null @@ -1,47 +0,0 @@ -@layer base { - :root { - --background: 339 49% 100%; - --foreground: 339 66% 4%; - --muted: 99 20% 93%; - --muted-foreground: 99 9% 39%; - --popover: 339 49% 100%; - --popover-foreground: 339 66% 4%; - --card: 339 49% 100%; - --card-foreground: 339 66% 4%; - --border: 339 7% 94%; - --input: 339 7% 94%; - --primary: 339 48% 41%; - --primary-foreground: 0 0% 100%; - --secondary: 99 48% 41%; - --secondary-foreground: 0 0% 100%; - --accent: 219 48% 41%; - --accent-foreground: 0 0% 100%; - --destructive: 19 85% 36%; - --destructive-foreground: 0 0% 100%; - --ring: 339 48% 41%; - --radius: 0.5rem; - } - - .dark { - --background: 339 32% 4%; - --foreground: 339 18% 99%; - --muted: 99 20% 7%; - --muted-foreground: 99 9% 61%; - --popover: 339 32% 4%; - --popover-foreground: 339 18% 99%; - --card: 339 32% 4%; - --card-foreground: 339 18% 99%; - --border: 339 7% 12%; - --input: 339 7% 12%; - --primary: 339 48% 41%; - --primary-foreground: 0 0% 100%; - --secondary: 99 48% 41%; - --secondary-foreground: 0 0% 100%; - --accent: 219 48% 41%; - --accent-foreground: 0 0% 100%; - --destructive: 19 85% 53%; - --destructive-foreground: 0 0% 0%; - --ring: 339 48% 41%; - } - } -