chore: migrate repository to Codeberg, bump version to 4.2.0, update update logic
This commit is contained in:
@@ -1,30 +0,0 @@
|
||||
# Twitch VOD Manager Docs
|
||||
|
||||
Documentation site for users and contributors, built with Astro + MDX.
|
||||
|
||||
## Local development
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Production build
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
npm run preview
|
||||
```
|
||||
|
||||
## Writing docs
|
||||
|
||||
- Add pages in `src/pages/` (`.astro` or `.mdx`)
|
||||
- Shared layout lives in `src/layouts/BaseLayout.astro`
|
||||
- Global styles live in `src/styles/global.css`
|
||||
- Keep command examples copy-paste ready
|
||||
|
||||
## Scope
|
||||
|
||||
- User setup and troubleshooting
|
||||
- Feature documentation
|
||||
- Developer architecture and release workflow
|
||||
@@ -1,7 +0,0 @@
|
||||
import { defineConfig } from 'astro/config';
|
||||
import mdx from '@astrojs/mdx';
|
||||
|
||||
export default defineConfig({
|
||||
integrations: [mdx()],
|
||||
site: 'https://github.com/Sucukdeluxe/Twitch-VOD-Manager'
|
||||
});
|
||||
Generated
-6199
File diff suppressed because it is too large
Load Diff
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"name": "twitch-vod-manager-docs",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"build": "astro build",
|
||||
"preview": "astro preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/mdx": "^4.3.0",
|
||||
"astro": "^5.5.0"
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
---
|
||||
import '../styles/global.css';
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
const { title, description = 'Twitch VOD Manager documentation' } = Astro.props;
|
||||
|
||||
const nav = [
|
||||
{ href: '/', label: 'Overview' },
|
||||
{ href: '/getting-started', label: 'Getting Started' },
|
||||
{ href: '/features', label: 'Features' },
|
||||
{ href: '/configuration', label: 'Configuration' },
|
||||
{ href: '/troubleshooting', label: 'Troubleshooting' },
|
||||
{ href: '/development', label: 'Development' },
|
||||
{ href: '/release-process', label: 'Release Process' }
|
||||
];
|
||||
|
||||
const pathname = Astro.url.pathname.endsWith('/') ? Astro.url.pathname : `${Astro.url.pathname}/`;
|
||||
|
||||
const isActive = (href: string): boolean => {
|
||||
if (href === '/') {
|
||||
return pathname === '/';
|
||||
}
|
||||
|
||||
const normalizedHref = href.endsWith('/') ? href : `${href}/`;
|
||||
return pathname.startsWith(normalizedHref);
|
||||
};
|
||||
---
|
||||
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content={description} />
|
||||
<title>{title}</title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layout">
|
||||
<aside class="sidebar">
|
||||
<h1 class="brand">Twitch VOD Manager</h1>
|
||||
<p class="tagline">Product and developer documentation</p>
|
||||
<nav>
|
||||
<ul class="nav-list">
|
||||
{nav.map((item) => (
|
||||
<li>
|
||||
<a href={item.href} class={isActive(item.href) ? 'active' : undefined}>{item.label}</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
<main class="content">
|
||||
<article class="doc">
|
||||
<slot />
|
||||
</article>
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Configuration
|
||||
description: File locations and configuration keys used by the app.
|
||||
---
|
||||
|
||||
# Configuration
|
||||
|
||||
## File Locations
|
||||
|
||||
The app stores runtime data in:
|
||||
|
||||
`C:\ProgramData\Twitch_VOD_Manager`
|
||||
|
||||
| File | Purpose |
|
||||
| --- | --- |
|
||||
| `config.json` | User settings and Twitch credentials |
|
||||
| `download_queue.json` | Persistent download queue state |
|
||||
|
||||
Default download path:
|
||||
|
||||
`%USERPROFILE%\Desktop\Twitch_VODs`
|
||||
|
||||
## Main Config Keys
|
||||
|
||||
| Key | Description |
|
||||
| --- | --- |
|
||||
| `client_id` | Twitch application client id |
|
||||
| `client_secret` | Twitch application client secret |
|
||||
| `download_path` | Base output folder |
|
||||
| `streamers` | Sidebar streamer list |
|
||||
| `theme` | UI theme (`twitch`, `discord`, `youtube`, `apple`) |
|
||||
| `download_mode` | Full VOD or parts mode |
|
||||
| `part_minutes` | Split length in minutes for parts mode |
|
||||
|
||||
## Notes
|
||||
|
||||
- Credentials are optional. If empty, the app uses public mode for streamer/VOD discovery.
|
||||
- Credentials are currently stored in plain text config file.
|
||||
- The app trims credential fields before saving to reduce whitespace issues.
|
||||
- Legacy keys can exist in config from older versions; unknown keys are ignored.
|
||||
@@ -1,72 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Development
|
||||
description: Local development setup and architecture for contributors.
|
||||
---
|
||||
|
||||
# Development
|
||||
|
||||
## Local Setup
|
||||
|
||||
```bash
|
||||
cd "typescript-version"
|
||||
npm install
|
||||
npm run build
|
||||
npm start
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
| Layer | File(s) | Responsibility |
|
||||
| --- | --- | --- |
|
||||
| Main process | `src/main.ts` | IPC handlers, Twitch API, downloads, ffmpeg/streamlink execution, updater |
|
||||
| Preload bridge | `src/preload.ts` | Safe API surface exposed to renderer |
|
||||
| Renderer shell | `src/index.html` + `src/styles.css` | UI markup and styling |
|
||||
| Renderer modules | `src/renderer*.ts` | UI logic by feature (streamers, queue, settings, updates, shared state) |
|
||||
|
||||
## Renderer Module Split
|
||||
|
||||
- `renderer-shared.ts`: common state + DOM helper functions
|
||||
- `renderer-streamers.ts`: streamer list + VOD loading
|
||||
- `renderer-queue.ts`: queue rendering + start/stop behavior
|
||||
- `renderer-settings.ts`: credentials, folder, and theme handling
|
||||
- `renderer-updates.ts`: update banner and download/install flow
|
||||
- `renderer.ts`: app init + clip/cutter/merge orchestration
|
||||
|
||||
## Useful Commands
|
||||
|
||||
```bash
|
||||
# Build TypeScript only
|
||||
npm run build
|
||||
|
||||
# Run app in dev mode
|
||||
npm start
|
||||
|
||||
# Quick UI smoke test
|
||||
npm run test:e2e
|
||||
|
||||
# Template guide + live preview checks
|
||||
npm run test:e2e:guide
|
||||
|
||||
# Full end-to-end validation pass
|
||||
npm run test:e2e:full
|
||||
|
||||
# Release validation suite (build + smoke + guide + full)
|
||||
npm run test:e2e:release
|
||||
|
||||
# Extra stress pass (runs release suite 3x)
|
||||
npm run test:e2e:stress
|
||||
|
||||
# Build Windows installer
|
||||
npm run dist:win
|
||||
```
|
||||
|
||||
## Docs Workspace
|
||||
|
||||
```bash
|
||||
cd "docs"
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Docs site is Astro + MDX and can be updated independently from app runtime code.
|
||||
@@ -1,44 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Features
|
||||
description: Complete feature overview for Twitch VOD Manager.
|
||||
---
|
||||
|
||||
# Features
|
||||
|
||||
## Twitch VOD Browser
|
||||
|
||||
- Add streamers to a persistent sidebar list.
|
||||
- Fetches user + archive VODs through Twitch Helix API when credentials are configured.
|
||||
- Falls back to public Twitch GraphQL mode when no credentials are set.
|
||||
- Automatic reconnect/re-auth if the app is temporarily disconnected.
|
||||
|
||||
## Download Queue
|
||||
|
||||
- Add full VODs to queue with one click.
|
||||
- Queue supports start/stop and removal of completed entries.
|
||||
- Download process persists in local queue file.
|
||||
|
||||
## Clip Creation from VODs
|
||||
|
||||
- Open **Clip** dialog from any VOD card.
|
||||
- Set start/end time and optional part number.
|
||||
- Queue clip jobs with metadata for naming strategy.
|
||||
|
||||
## Video Cutter (Local Files)
|
||||
|
||||
- Select any local video and inspect duration/fps/resolution.
|
||||
- Extract preview frames via `ffprobe`/`ffmpeg`.
|
||||
- Export cut segment as new MP4 file.
|
||||
|
||||
## Video Merge (Local Files)
|
||||
|
||||
- Choose multiple local video files.
|
||||
- Reorder via up/down controls.
|
||||
- Merge into one output file.
|
||||
|
||||
## In-App Auto-Update
|
||||
|
||||
- Uses GitHub release artifacts through `electron-updater`.
|
||||
- Detects new versions, downloads update, then installs on restart.
|
||||
- Requires release assets: installer, blockmap, and `latest.yml`.
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Getting Started
|
||||
description: Install and configure Twitch VOD Manager quickly.
|
||||
---
|
||||
|
||||
# Getting Started
|
||||
|
||||
## Requirements
|
||||
|
||||
- Windows 10/11 (installer and paths are currently Windows-first)
|
||||
|
||||
The app can auto-install missing runtime tools (`streamlink`, `ffmpeg`, `ffprobe`) into:
|
||||
|
||||
`C:\ProgramData\Twitch_VOD_Manager\tools`
|
||||
|
||||
Manual installation is still supported.
|
||||
|
||||
Optional but recommended:
|
||||
|
||||
- Twitch API app with `Client ID` and `Client Secret` (for authenticated Helix mode)
|
||||
|
||||
## Install
|
||||
|
||||
1. Download the latest setup from GitHub Releases.
|
||||
2. Run `Twitch-VOD-Manager-Setup-<version>.exe`.
|
||||
3. Launch the app.
|
||||
|
||||
## First-Time Setup
|
||||
|
||||
1. Open **Einstellungen**.
|
||||
2. Choose your download path.
|
||||
3. Optional: enter `Client ID` and `Client Secret` for authenticated mode.
|
||||
4. Click **Speichern & Verbinden**.
|
||||
5. Add a streamer in the header input and press `+`.
|
||||
|
||||
If everything is correct, VOD cards appear.
|
||||
|
||||
- With credentials: status is `Verbunden`.
|
||||
- Without credentials: status shows `Ohne Login (Public Modus)` and VOD downloads still work.
|
||||
|
||||
## Verify Tools
|
||||
|
||||
In PowerShell or CMD:
|
||||
|
||||
```bash
|
||||
streamlink --version
|
||||
ffmpeg -version
|
||||
ffprobe -version
|
||||
```
|
||||
|
||||
If one command fails, install the missing tool and restart the app.
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="Twitch VOD Manager Docs" description="Official documentation for Twitch VOD Manager users and contributors.">
|
||||
<h1>Twitch VOD Manager Documentation</h1>
|
||||
<p>
|
||||
This documentation covers end-user setup, Twitch API configuration, troubleshooting,
|
||||
and developer workflows for the TypeScript/Electron app.
|
||||
</p>
|
||||
|
||||
<div class="chips">
|
||||
<span class="chip">Electron</span>
|
||||
<span class="chip">TypeScript</span>
|
||||
<span class="chip">Streamlink</span>
|
||||
<span class="chip">FFmpeg</span>
|
||||
<span class="chip">Auto-Update</span>
|
||||
</div>
|
||||
|
||||
<div class="card-grid">
|
||||
<a class="card" href="/getting-started">
|
||||
<h3>Getting Started</h3>
|
||||
<p>Install the app, set Twitch API credentials, and run your first VOD download.</p>
|
||||
</a>
|
||||
|
||||
<a class="card" href="/features">
|
||||
<h3>Features</h3>
|
||||
<p>Learn VOD browsing, queue processing, clip creation, cutter, merge, and updates.</p>
|
||||
</a>
|
||||
|
||||
<a class="card" href="/configuration">
|
||||
<h3>Configuration</h3>
|
||||
<p>Understand config paths, available settings, and how local files are stored.</p>
|
||||
</a>
|
||||
|
||||
<a class="card" href="/troubleshooting">
|
||||
<h3>Troubleshooting</h3>
|
||||
<p>Fix common issues like "Keine VODs", missing tools, and update problems.</p>
|
||||
</a>
|
||||
|
||||
<a class="card" href="/development">
|
||||
<h3>Development</h3>
|
||||
<p>Set up local development, architecture overview, and code structure details.</p>
|
||||
</a>
|
||||
|
||||
<a class="card" href="/release-process">
|
||||
<h3>Release Process</h3>
|
||||
<p>Ship new installer builds and GitHub releases compatible with auto-updater.</p>
|
||||
</a>
|
||||
</div>
|
||||
</BaseLayout>
|
||||
@@ -1,64 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Release Process
|
||||
description: Standardized release checklist for auto-update compatible builds.
|
||||
---
|
||||
|
||||
# Release Process
|
||||
|
||||
This project uses GitHub Releases + `electron-updater`.
|
||||
|
||||
## 1) Bump Version
|
||||
|
||||
Update app version consistently:
|
||||
|
||||
- `typescript-version/package.json`
|
||||
- `typescript-version/package-lock.json`
|
||||
- `typescript-version/src/main.ts` (`APP_VERSION`)
|
||||
- Optional visible fallback text in `src/index.html`
|
||||
|
||||
## 2) Build Installer Artifacts
|
||||
|
||||
```bash
|
||||
cd "typescript-version"
|
||||
npm run dist:win
|
||||
```
|
||||
|
||||
`dist:win` already runs the full release validation gate (`test:e2e:release`) before packaging.
|
||||
|
||||
For extra confidence before major releases, run:
|
||||
|
||||
```bash
|
||||
npm run test:e2e:stress
|
||||
```
|
||||
|
||||
Expected outputs in `typescript-version/release/`:
|
||||
|
||||
- `latest.yml`
|
||||
- `Twitch-VOD-Manager-Setup-<version>.exe`
|
||||
- `Twitch-VOD-Manager-Setup-<version>.exe.blockmap`
|
||||
|
||||
## 3) Commit + Push
|
||||
|
||||
Commit code/version changes and push to `master`.
|
||||
|
||||
## 4) Create GitHub Release
|
||||
|
||||
Tag format: `v<version>` (example: `v3.7.6`).
|
||||
|
||||
Attach exactly the 3 update artifacts from step 2.
|
||||
|
||||
## 5) Verify Update Path
|
||||
|
||||
- Open app on older version.
|
||||
- Trigger update check.
|
||||
- Confirm banner appears and update can be downloaded/installed.
|
||||
|
||||
## Quick Checklist
|
||||
|
||||
- [ ] Version bumped everywhere
|
||||
- [ ] `npm run build` passes
|
||||
- [ ] `npm run dist:win` passes
|
||||
- [ ] Release tag created
|
||||
- [ ] `latest.yml` + `.exe` + `.blockmap` uploaded
|
||||
- [ ] Manual update flow verified
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Migration Roadmap
|
||||
---
|
||||
|
||||
# Migration Roadmap
|
||||
|
||||
## UI Stack
|
||||
|
||||
- Renderer wird schrittweise von HTML-Monolith zu TypeScript-Modulen migriert.
|
||||
- Styles sind bereits in eine eigene CSS-Datei ausgelagert.
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. Renderer in weitere Feature-Module aufteilen (Cutter/Merge/Clips).
|
||||
2. Komponenten-Ansatz einführen (Astro UI docs, später optional Rust-backend tooling).
|
||||
3. API- und Release-Prozess in MDX dokumentieren.
|
||||
@@ -1,64 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/BaseLayout.astro
|
||||
title: Troubleshooting
|
||||
description: Fix common Twitch VOD Manager issues quickly.
|
||||
---
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
## "Keine VODs" after adding streamer
|
||||
|
||||
1. Ensure the streamer exists and has archive VODs.
|
||||
2. Press **Aktualisieren**.
|
||||
3. If you use credentials, re-save `Client ID` + `Client Secret` in **Einstellungen**.
|
||||
4. Check bottom status bar:
|
||||
- `Verbunden` in authenticated mode
|
||||
- `Ohne Login (Public Modus)` in credential-free mode
|
||||
|
||||
The app retries auth automatically on expired tokens and can continue in public mode without credentials.
|
||||
|
||||
## "Streamer nicht gefunden"
|
||||
|
||||
- Use login name only (no URL, no `@`).
|
||||
- Names are normalized to lowercase.
|
||||
- Verify streamer spelling directly on Twitch.
|
||||
|
||||
## Clip/Cutter/Merge duration shows 0 or preview fails
|
||||
|
||||
Usually caused by broken `ffprobe` detection.
|
||||
|
||||
Check:
|
||||
|
||||
```bash
|
||||
ffprobe -version
|
||||
```
|
||||
|
||||
If missing, install FFmpeg package that includes `ffprobe` and restart app.
|
||||
|
||||
## "Streamlink not found"
|
||||
|
||||
Install streamlink and verify:
|
||||
|
||||
```bash
|
||||
streamlink --version
|
||||
```
|
||||
|
||||
Then restart the app.
|
||||
|
||||
## Auto-update does not trigger
|
||||
|
||||
Release must include all of:
|
||||
|
||||
- `latest.yml`
|
||||
- `Twitch-VOD-Manager-Setup-<version>.exe`
|
||||
- `Twitch-VOD-Manager-Setup-<version>.exe.blockmap`
|
||||
|
||||
Tag version must match app version (example: `v3.7.6`).
|
||||
|
||||
## Debug log for failed downloads
|
||||
|
||||
From `v3.7.8`, detailed downloader logs are written to:
|
||||
|
||||
`C:\ProgramData\Twitch_VOD_Manager\debug.log`
|
||||
|
||||
If a download instantly switches from `Stoppen` back to `Start`, check the latest lines in that file for streamlink exit reasons.
|
||||
@@ -1,205 +0,0 @@
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
font-family: 'Segoe UI', Tahoma, sans-serif;
|
||||
--bg-1: #0f1217;
|
||||
--bg-2: #161c26;
|
||||
--bg-3: #1d2734;
|
||||
--text: #eef3fb;
|
||||
--muted: #aab8cf;
|
||||
--line: #2b3546;
|
||||
--link: #7db6ff;
|
||||
--link-hover: #a8cdff;
|
||||
--chip: #22344b;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
background: radial-gradient(circle at top, #1a2432 0%, var(--bg-1) 55%);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.layout {
|
||||
max-width: 1280px;
|
||||
margin: 0 auto;
|
||||
padding: 28px;
|
||||
display: grid;
|
||||
grid-template-columns: 290px minmax(0, 1fr);
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: sticky;
|
||||
top: 18px;
|
||||
align-self: start;
|
||||
background: linear-gradient(180deg, var(--bg-2), #131922);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
padding: 18px;
|
||||
}
|
||||
|
||||
.brand {
|
||||
margin: 0;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.tagline {
|
||||
margin-top: 8px;
|
||||
color: var(--muted);
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.nav-list {
|
||||
list-style: none;
|
||||
margin: 20px 0 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.nav-list a {
|
||||
display: block;
|
||||
padding: 8px 10px;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
color: var(--muted);
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.nav-list a:hover {
|
||||
color: var(--text);
|
||||
border-color: var(--line);
|
||||
background: rgba(125, 182, 255, 0.08);
|
||||
}
|
||||
|
||||
.nav-list a.active {
|
||||
color: var(--text);
|
||||
background: rgba(125, 182, 255, 0.16);
|
||||
border-color: rgba(125, 182, 255, 0.35);
|
||||
}
|
||||
|
||||
.content {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.doc {
|
||||
background: linear-gradient(180deg, var(--bg-2), #121822);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
padding: 26px;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3 {
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin-top: 0;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
h2,
|
||||
h3 {
|
||||
margin-top: 1.7rem;
|
||||
}
|
||||
|
||||
p,
|
||||
li {
|
||||
color: var(--muted);
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--link);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--link-hover);
|
||||
}
|
||||
|
||||
pre {
|
||||
overflow-x: auto;
|
||||
background: #0c1118;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 10px;
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: Consolas, 'Courier New', monospace;
|
||||
font-size: 0.92em;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
th,
|
||||
td {
|
||||
border: 1px solid var(--line);
|
||||
text-align: left;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
th {
|
||||
background: #111a25;
|
||||
}
|
||||
|
||||
.card-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
gap: 12px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.card {
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(180deg, #172233, #111824);
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
.card h3 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 8px;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.card p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.chips {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.chip {
|
||||
border: 1px solid rgba(125, 182, 255, 0.35);
|
||||
background: var(--chip);
|
||||
color: #dbe9ff;
|
||||
border-radius: 999px;
|
||||
padding: 4px 10px;
|
||||
font-size: 0.84rem;
|
||||
}
|
||||
|
||||
@media (max-width: 980px) {
|
||||
.layout {
|
||||
grid-template-columns: 1fr;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"extends": "astro/tsconfigs/strict"
|
||||
}
|
||||
Reference in New Issue
Block a user