Scaffold CommiTea: yarn workspaces, Electron shell, core label schema, design system
- apps/desktop: electron-vite + React + Tailwind mapped onto design tokens (preflight off; tokens/base.css owns the reset); boots to a Reginald placeholder proving fonts/tokens/core wiring - packages/core: pure TS; gitea label schema (est/*, p/*, deadline/hard) with pessimistic conflict resolution + 15 unit tests - docs/design: full design handoff (tokens, 16 component contracts, interactive 14-screen prototype, Reginald voice rules) - docs/PLAN.md: product plan (purity rule, pm-state repo, deterministic scheduler + Monte Carlo, directive log) - Deliberate deviation from novelpad stack: no ElectricSQL/PGlite — local store is a rebuildable cache over gitea REST/webhooks (better-sqlite3 in main process, arriving in P1) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
12
.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
out/
|
||||||
|
*.log
|
||||||
|
.DS_Store
|
||||||
|
.env
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
1
.yarnrc.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
nodeLinker: node-modules
|
||||||
36
README.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# CommiTea
|
||||||
|
|
||||||
|
AI project manager built on Gitea. A deterministic scheduler does the math
|
||||||
|
(Monte Carlo forecasts over your own estimate-vs-actual history); the agent —
|
||||||
|
Reginald — captures work via interview, negotiates priorities, and explains the
|
||||||
|
consequences. Gitea holds human-authored intent; a `pm-state` repo holds
|
||||||
|
machine-derived state. The LLM never does math.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
- `apps/desktop` — Electron app (electron-vite, React, Tailwind)
|
||||||
|
- `packages/core` — pure TypeScript: label schema, scheduler, gitea client (no
|
||||||
|
Electron imports)
|
||||||
|
- `docs/PLAN.md` — product plan (goals, phases, not-doing list)
|
||||||
|
- `docs/design/` — design handoff: tokens, component contracts, interactive
|
||||||
|
prototype (`docs/design/ui_kits/app/index.html` via a static server), brand
|
||||||
|
voice rules in `design_system_readme.md`
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn # install
|
||||||
|
yarn dev # electron app, logs tee to apps/desktop/desktop.log
|
||||||
|
yarn test # unit tests (vitest)
|
||||||
|
yarn typecheck
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
- Yarn 4 workspaces; ESM everywhere; `.js` extensions on relative imports
|
||||||
|
- `@commitea/core` stays pure — unit-testable without Electron or network
|
||||||
|
- Design tokens are the source of truth (`apps/desktop/src/renderer/src/design/`,
|
||||||
|
mirrored from `docs/design/`); Tailwind maps onto the CSS custom properties,
|
||||||
|
never redefines them
|
||||||
|
- Reginald's voice rules live in `docs/design/design_system_readme.md` — no
|
||||||
|
emoji, no point-date forecasts, wit in sentences never in buttons
|
||||||
10
apps/desktop/electron.vite.config.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import react from '@vitejs/plugin-react'
|
||||||
|
import { defineConfig } from 'electron-vite'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
main: {},
|
||||||
|
preload: {},
|
||||||
|
renderer: {
|
||||||
|
plugins: [react()],
|
||||||
|
},
|
||||||
|
})
|
||||||
30
apps/desktop/package.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "@commitea/desktop",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"main": "./out/main/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "electron-vite dev 2>&1 | tee desktop.log",
|
||||||
|
"build": "electron-vite build",
|
||||||
|
"start": "electron-vite preview",
|
||||||
|
"typecheck": "tsc --noEmit"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@commitea/core": "workspace:*",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-dom": "^18.3.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.13.1",
|
||||||
|
"@types/react": "^18.3.18",
|
||||||
|
"@types/react-dom": "^18.3.5",
|
||||||
|
"@vitejs/plugin-react": "^4.3.4",
|
||||||
|
"autoprefixer": "^10.4.20",
|
||||||
|
"electron": "^34.0.0",
|
||||||
|
"electron-vite": "^3.1.0",
|
||||||
|
"postcss": "^8.5.1",
|
||||||
|
"tailwindcss": "^3.4.17",
|
||||||
|
"typescript": "^5.7.3",
|
||||||
|
"vite": "^6.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
apps/desktop/postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
44
apps/desktop/src/main/index.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { join } from 'node:path'
|
||||||
|
|
||||||
|
import { BrowserWindow, app, shell } from 'electron'
|
||||||
|
|
||||||
|
function createWindow(): void {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 1440,
|
||||||
|
height: 900,
|
||||||
|
minWidth: 1080,
|
||||||
|
minHeight: 700,
|
||||||
|
show: false,
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
backgroundColor: '#F0F4F0',
|
||||||
|
webPreferences: {
|
||||||
|
preload: join(import.meta.dirname, '../preload/index.mjs'),
|
||||||
|
sandbox: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
win.on('ready-to-show', () => win.show())
|
||||||
|
|
||||||
|
win.webContents.setWindowOpenHandler(({ url }) => {
|
||||||
|
void shell.openExternal(url)
|
||||||
|
return { action: 'deny' }
|
||||||
|
})
|
||||||
|
|
||||||
|
if (process.env.ELECTRON_RENDERER_URL) {
|
||||||
|
void win.loadURL(process.env.ELECTRON_RENDERER_URL)
|
||||||
|
} else {
|
||||||
|
void win.loadFile(join(import.meta.dirname, '../renderer/index.html'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app.whenReady().then(() => {
|
||||||
|
createWindow()
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) createWindow()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') app.quit()
|
||||||
|
})
|
||||||
9
apps/desktop/src/preload/index.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { contextBridge } from 'electron'
|
||||||
|
|
||||||
|
const api = {
|
||||||
|
platform: process.platform,
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CommiteaApi = typeof api
|
||||||
|
|
||||||
|
contextBridge.exposeInMainWorld('commitea', api)
|
||||||
16
apps/desktop/src/renderer/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>CommiTea</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<meta
|
||||||
|
http-equiv="Content-Security-Policy"
|
||||||
|
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self' data:; img-src 'self' data:; connect-src 'self' ws:"
|
||||||
|
/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
26
apps/desktop/src/renderer/src/app.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import { extractLabelFacts } from '@commitea/core'
|
||||||
|
|
||||||
|
const facts = extractLabelFacts(['est/3d', 'p/2', 'deadline/hard'])
|
||||||
|
|
||||||
|
export function App() {
|
||||||
|
return (
|
||||||
|
<main className="min-h-screen bg-paper-0 font-sans text-ink-1">
|
||||||
|
<div className="mx-auto max-w-[1120px] px-7 py-16">
|
||||||
|
<header className="border-b-[3px] border-double border-ink-1 pb-4">
|
||||||
|
<h1 className="font-display text-5xl">CommiTea</h1>
|
||||||
|
<p className="mt-2 font-mono text-sm text-ink-3">
|
||||||
|
scaffold · phase 0 · gitea connection pending
|
||||||
|
</p>
|
||||||
|
</header>
|
||||||
|
<p className="mt-8 max-w-[60ch] font-agent text-lg leading-relaxed">
|
||||||
|
Good morning. The scaffold stands and the kettle is on, but I have nothing to manage
|
||||||
|
yet. Connect me to gitea and we shall put the pot to work.
|
||||||
|
</p>
|
||||||
|
<p className="mt-6 font-mono text-sm text-ink-2">
|
||||||
|
label parse check: est/{facts.estimateDays}d · p/{facts.priority} · hard{' '}
|
||||||
|
{String(facts.hardDeadline)}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-activity" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 362 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-arrow-left" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m12 19-7-7 7-7"></path>
|
||||||
|
<path d="M19 12H5"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 285 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-arrow-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M5 12h14"></path>
|
||||||
|
<path d="m12 5 7 7-7 7"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 285 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-arrow-up-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M7 7h10v10"></path>
|
||||||
|
<path d="M7 17 17 7"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 287 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-bell" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"></path>
|
||||||
|
<path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 328 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-calendar" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M8 2v4"></path>
|
||||||
|
<path d="M16 2v4"></path>
|
||||||
|
<rect width="18" height="18" x="3" y="4" rx="2"></rect>
|
||||||
|
<path d="M3 10h18"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 361 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-chart-line" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 3v16a2 2 0 0 0 2 2h16"></path>
|
||||||
|
<path d="m19 9-5 5-4-4-3 3"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 304 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-chart-no-axes-gantt" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M8 6h10"></path>
|
||||||
|
<path d="M6 12h9"></path>
|
||||||
|
<path d="M11 18h7"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 315 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-check" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M20 6 9 17l-5-5"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 252 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-chevron-down" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m6 9 6 6 6-6"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 256 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-chevron-left" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m15 18-6-6 6-6"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 258 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-chevron-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m9 18 6-6-6-6"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 258 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-chevron-up" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m18 15-6-6-6 6"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 256 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-circle-alert" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<line x1="12" x2="12" y1="8" y2="12"></line>
|
||||||
|
<line x1="12" x2="12.01" y1="16" y2="16"></line>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 364 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-circle-check" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<path d="m9 12 2 2 4-4"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 300 B |
@@ -0,0 +1,10 @@
|
|||||||
|
<svg class="lucide lucide-circle-dashed" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M10.1 2.182a10 10 0 0 1 3.8 0"></path>
|
||||||
|
<path d="M13.9 21.818a10 10 0 0 1-3.8 0"></path>
|
||||||
|
<path d="M17.609 3.721a10 10 0 0 1 2.69 2.7"></path>
|
||||||
|
<path d="M2.182 13.9a10 10 0 0 1 0-3.8"></path>
|
||||||
|
<path d="M20.279 17.609a10 10 0 0 1-2.7 2.69"></path>
|
||||||
|
<path d="M21.818 10.1a10 10 0 0 1 0 3.8"></path>
|
||||||
|
<path d="M3.721 6.391a10 10 0 0 1 2.7-2.69"></path>
|
||||||
|
<path d="M6.391 20.279a10 10 0 0 1-2.69-2.7"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 646 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-circle-dot" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<circle cx="12" cy="12" r="1"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 306 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-circle" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 260 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-clock-3" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<polyline points="12 6 12 12 16.5 12"></polyline>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 313 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-clock" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<polyline points="12 6 12 12 16 14"></polyline>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 309 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-coffee" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M10 2v2"></path>
|
||||||
|
<path d="M14 2v2"></path>
|
||||||
|
<path d="M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1"></path>
|
||||||
|
<path d="M6 2v2"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 408 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-copy" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect>
|
||||||
|
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 356 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-ellipsis" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="1"></circle>
|
||||||
|
<circle cx="19" cy="12" r="1"></circle>
|
||||||
|
<circle cx="5" cy="12" r="1"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 344 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-external-link" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M15 3h6v6"></path>
|
||||||
|
<path d="M10 14 21 3"></path>
|
||||||
|
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 363 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-eye" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path>
|
||||||
|
<circle cx="12" cy="12" r="3"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 378 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-filter" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"></polygon>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 292 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-flag" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"></path>
|
||||||
|
<line x1="4" x2="4" y1="22" y2="15"></line>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 339 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-gauge" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m12 14 4-4"></path>
|
||||||
|
<path d="M3.34 19a10 10 0 1 1 17.32 0"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 296 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-git-branch" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<line x1="6" x2="6" y1="3" y2="15"></line>
|
||||||
|
<circle cx="18" cy="6" r="3"></circle>
|
||||||
|
<circle cx="6" cy="18" r="3"></circle>
|
||||||
|
<path d="M18 9a9 9 0 0 1-9 9"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 388 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-git-commit-horizontal" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="3"></circle>
|
||||||
|
<line x1="3" x2="9" y1="12" y2="12"></line>
|
||||||
|
<line x1="15" x2="21" y1="12" y2="12"></line>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 368 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-git-merge" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="18" cy="18" r="3"></circle>
|
||||||
|
<circle cx="6" cy="6" r="3"></circle>
|
||||||
|
<path d="M6 21V9a9 9 0 0 0 9 9"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 344 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-git-pull-request" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="18" cy="18" r="3"></circle>
|
||||||
|
<circle cx="6" cy="6" r="3"></circle>
|
||||||
|
<path d="M13 6h3a2 2 0 0 1 2 2v7"></path>
|
||||||
|
<line x1="6" x2="6" y1="9" y2="21"></line>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 398 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-history" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path>
|
||||||
|
<path d="M3 3v5h5"></path>
|
||||||
|
<path d="M12 7v5l4 2"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 349 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-inbox" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polyline points="22 12 16 12 14 15 10 15 8 12 2 12"></polyline>
|
||||||
|
<path d="M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 410 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-info" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<path d="M12 16v-4"></path>
|
||||||
|
<path d="M12 8h.01"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 318 B |
@@ -0,0 +1,11 @@
|
|||||||
|
<svg class="lucide lucide-keyboard" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M10 8h.01"></path>
|
||||||
|
<path d="M12 12h.01"></path>
|
||||||
|
<path d="M14 8h.01"></path>
|
||||||
|
<path d="M16 12h.01"></path>
|
||||||
|
<path d="M18 8h.01"></path>
|
||||||
|
<path d="M6 8h.01"></path>
|
||||||
|
<path d="M7 16h10"></path>
|
||||||
|
<path d="M8 12h.01"></path>
|
||||||
|
<rect width="20" height="16" x="2" y="4" rx="2"></rect>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 517 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-layers" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z"></path>
|
||||||
|
<path d="m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65"></path>
|
||||||
|
<path d="m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 476 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-leaf" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z"></path>
|
||||||
|
<path d="M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 385 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-link" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
|
||||||
|
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 376 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-list-filter" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 6h18"></path>
|
||||||
|
<path d="M7 12h10"></path>
|
||||||
|
<path d="M10 18h4"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 308 B |
@@ -0,0 +1,8 @@
|
|||||||
|
<svg class="lucide lucide-list" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 12h.01"></path>
|
||||||
|
<path d="M3 18h.01"></path>
|
||||||
|
<path d="M3 6h.01"></path>
|
||||||
|
<path d="M8 12h13"></path>
|
||||||
|
<path d="M8 18h13"></path>
|
||||||
|
<path d="M8 6h13"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 390 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-loader-circle" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M21 12a9 9 0 1 1-6.219-8.56"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 272 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-message-square" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 307 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-milestone" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M12 13v8"></path>
|
||||||
|
<path d="M12 3v3"></path>
|
||||||
|
<path d="M4 6a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h13a2 2 0 0 0 1.152-.365l3.424-2.317a1 1 0 0 0 0-1.635l-3.424-2.318A2 2 0 0 0 17 6z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 415 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-minus" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M5 12h14"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 245 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 270 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg class="lucide lucide-network" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect x="16" y="16" width="6" height="6" rx="1"></rect>
|
||||||
|
<rect x="2" y="16" width="6" height="6" rx="1"></rect>
|
||||||
|
<rect x="9" y="2" width="6" height="6" rx="1"></rect>
|
||||||
|
<path d="M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3"></path>
|
||||||
|
<path d="M12 12V8"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 480 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-panel-left" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect width="18" height="18" x="3" y="3" rx="2"></rect>
|
||||||
|
<path d="M9 3v18"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 307 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-pause" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect x="14" y="4" width="4" height="16" rx="1"></rect>
|
||||||
|
<rect x="6" y="4" width="4" height="16" rx="1"></rect>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 331 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-pencil" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"></path>
|
||||||
|
<path d="m15 5 4 4"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 396 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-play" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polygon points="6 3 20 12 6 21 6 3"></polygon>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 265 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-plus" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M5 12h14"></path>
|
||||||
|
<path d="M12 5v14"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 273 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-refresh-cw" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path>
|
||||||
|
<path d="M21 3v5h-5"></path>
|
||||||
|
<path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"></path>
|
||||||
|
<path d="M8 16H3v5"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 425 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-search" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="11" cy="11" r="8"></circle>
|
||||||
|
<path d="m21 21-4.3-4.3"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 294 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-send" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"></path>
|
||||||
|
<path d="m21.854 2.147-10.94 10.939"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 410 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-settings-2" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M20 7h-9"></path>
|
||||||
|
<path d="M14 17H5"></path>
|
||||||
|
<circle cx="17" cy="17" r="3"></circle>
|
||||||
|
<circle cx="7" cy="7" r="3"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 361 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-settings" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path>
|
||||||
|
<circle cx="12" cy="12" r="3"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 847 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg class="lucide lucide-sparkles" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path>
|
||||||
|
<path d="M20 3v4"></path>
|
||||||
|
<path d="M22 5h-4"></path>
|
||||||
|
<path d="M4 17v2"></path>
|
||||||
|
<path d="M5 18H3"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 604 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-square-kanban" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect width="18" height="18" x="3" y="3" rx="2"></rect>
|
||||||
|
<path d="M8 7v7"></path>
|
||||||
|
<path d="M12 7v4"></path>
|
||||||
|
<path d="M16 7v9"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 365 B |
11
apps/desktop/src/renderer/src/design/assets/icons/sun.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg class="lucide lucide-sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="4"></circle>
|
||||||
|
<path d="M12 2v2"></path>
|
||||||
|
<path d="M12 20v2"></path>
|
||||||
|
<path d="m4.93 4.93 1.41 1.41"></path>
|
||||||
|
<path d="m17.66 17.66 1.41 1.41"></path>
|
||||||
|
<path d="M2 12h2"></path>
|
||||||
|
<path d="M20 12h2"></path>
|
||||||
|
<path d="m6.34 17.66-1.41 1.41"></path>
|
||||||
|
<path d="m19.07 4.93-1.41 1.41"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 538 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-tag" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z"></path>
|
||||||
|
<circle cx="7.5" cy="7.5" r=".5" fill="currentColor"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 448 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-target" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<circle cx="12" cy="12" r="6"></circle>
|
||||||
|
<circle cx="12" cy="12" r="2"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 344 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg class="lucide lucide-trash-2" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 6h18"></path>
|
||||||
|
<path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"></path>
|
||||||
|
<path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"></path>
|
||||||
|
<line x1="10" x2="10" y1="11" y2="17"></line>
|
||||||
|
<line x1="14" x2="14" y1="11" y2="17"></line>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 455 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-trending-up" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polyline points="22 7 13.5 15.5 8.5 10.5 2 17"></polyline>
|
||||||
|
<polyline points="16 7 22 7 22 13"></polyline>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 333 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg class="lucide lucide-triangle-alert" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path>
|
||||||
|
<path d="M12 9v4"></path>
|
||||||
|
<path d="M12 17h.01"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 377 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-user" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path>
|
||||||
|
<circle cx="12" cy="7" r="4"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 318 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg class="lucide lucide-users" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path>
|
||||||
|
<circle cx="9" cy="7" r="4"></circle>
|
||||||
|
<path d="M22 21v-2a4 4 0 0 0-3-3.87"></path>
|
||||||
|
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 411 B |
4
apps/desktop/src/renderer/src/design/assets/icons/x.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg class="lucide lucide-x" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M18 6 6 18"></path>
|
||||||
|
<path d="m6 6 12 12"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 274 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg class="lucide lucide-zap" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 390 B |
BIN
apps/desktop/src/renderer/src/design/assets/logo-icon.png
Normal file
|
After Width: | Height: | Size: 296 KiB |
BIN
apps/desktop/src/renderer/src/design/assets/logo.jpeg
Normal file
|
After Width: | Height: | Size: 43 KiB |
5
apps/desktop/src/renderer/src/design/styles.css
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
@import "tokens/fonts.css";
|
||||||
|
@import "tokens/colors.css";
|
||||||
|
@import "tokens/typography.css";
|
||||||
|
@import "tokens/spacing.css";
|
||||||
|
@import "tokens/base.css";
|
||||||
37
apps/desktop/src/renderer/src/design/tokens/base.css
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/* CommiTea base element styles. */
|
||||||
|
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font: var(--text-body);
|
||||||
|
color: var(--text-body);
|
||||||
|
background: var(--surface-app);
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--accent-text);
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px solid var(--line-2);
|
||||||
|
transition: border-color var(--duration-fast) var(--ease-out);
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: var(--accent-hover);
|
||||||
|
border-bottom-color: var(--jade);
|
||||||
|
}
|
||||||
|
|
||||||
|
::selection {
|
||||||
|
background: var(--spruce-2);
|
||||||
|
color: var(--ink-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
code, kbd {
|
||||||
|
font: var(--text-data);
|
||||||
|
}
|
||||||
|
|
||||||
|
:focus-visible {
|
||||||
|
outline: 2px solid var(--focus-ring);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
137
apps/desktop/src/renderer/src/design/tokens/colors.css
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
/* CommiTea color system — "Green tea service"
|
||||||
|
Cool porcelain surfaces, slate-green ink, jade accent (from the cup itself).
|
||||||
|
Light is default (morning service). Dark scope: [data-theme="dark"] (evening service). */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* ---- base: porcelain (cool green-white surfaces) ---- */
|
||||||
|
--paper-0: #F0F4F0; /* app background */
|
||||||
|
--paper-1: #FAFCF9; /* raised card */
|
||||||
|
--paper-2: #E4EBE4; /* inset wells, rails */
|
||||||
|
--paper-3: #D7E1D8; /* pressed / deep inset */
|
||||||
|
|
||||||
|
/* ---- base: ink (slate-green text scale) ---- */
|
||||||
|
--ink-1: #1D2522; /* primary text */
|
||||||
|
--ink-2: #51605A; /* secondary text */
|
||||||
|
--ink-3: #84928B; /* muted / placeholder */
|
||||||
|
--ink-inverse: #EFF5F0;
|
||||||
|
|
||||||
|
/* ---- base: lines ---- */
|
||||||
|
--line-1: #D7DFD7; /* hairline */
|
||||||
|
--line-2: #BACBBE; /* strong rule */
|
||||||
|
|
||||||
|
/* ---- base: spruce (brand green — the logo's slate-teal) ---- */
|
||||||
|
--spruce-9: #16322A;
|
||||||
|
--spruce-8: #1D4238;
|
||||||
|
--spruce-7: #275546; /* brand anchor */
|
||||||
|
--spruce-6: #3A7260;
|
||||||
|
--spruce-5: #57937C;
|
||||||
|
--spruce-3: #A3CFBB;
|
||||||
|
--spruce-2: #CDE5D7;
|
||||||
|
--spruce-1: #E3F0E8;
|
||||||
|
|
||||||
|
/* ---- base: jade (mint accent — the tea itself) ---- */
|
||||||
|
--jade-7: #2E7A57;
|
||||||
|
--jade-6: #46996F;
|
||||||
|
--jade-5: #66B389;
|
||||||
|
--jade-3: #A8DDBE;
|
||||||
|
--jade-1: #E0F4E7;
|
||||||
|
|
||||||
|
/* ---- semantic: surfaces & text ---- */
|
||||||
|
--surface-app: var(--paper-0);
|
||||||
|
--surface-card: var(--paper-1);
|
||||||
|
--surface-inset: var(--paper-2);
|
||||||
|
--surface-raised: var(--paper-1);
|
||||||
|
--text-body: var(--ink-1);
|
||||||
|
--text-secondary: var(--ink-2);
|
||||||
|
--text-muted: var(--ink-3);
|
||||||
|
--text-on-accent: var(--ink-inverse);
|
||||||
|
--border-hairline: var(--line-1);
|
||||||
|
--border-strong: var(--line-2);
|
||||||
|
|
||||||
|
/* ---- semantic: interactive ---- */
|
||||||
|
--accent: var(--spruce-7);
|
||||||
|
--accent-hover: #1F4A3C;
|
||||||
|
--accent-pressed: #173B30;
|
||||||
|
--accent-tint: var(--spruce-1);
|
||||||
|
--accent-text: var(--spruce-7);
|
||||||
|
--jade: var(--jade-6);
|
||||||
|
--jade-tint: var(--jade-1);
|
||||||
|
--focus-ring: #57937C;
|
||||||
|
|
||||||
|
/* ---- semantic: status ---- */
|
||||||
|
--ok: #2F7D53;
|
||||||
|
--ok-tint: #DFEEE3;
|
||||||
|
--warn: #96772A;
|
||||||
|
--warn-tint: #EFE9D2;
|
||||||
|
--danger: #A84632;
|
||||||
|
--danger-tint: #F2E0DA;
|
||||||
|
--info: #43758F;
|
||||||
|
--info-tint: #DFE9EC;
|
||||||
|
|
||||||
|
/* ---- domain: label chips (gitea label sets) ---- */
|
||||||
|
--label-est-bg: var(--paper-2);
|
||||||
|
--label-est-text: var(--ink-2);
|
||||||
|
--label-p1: #A84632;
|
||||||
|
--label-p2: #96772A;
|
||||||
|
--label-p3: #43758F;
|
||||||
|
--label-p4: #84928B;
|
||||||
|
--label-hard: #A84632;
|
||||||
|
|
||||||
|
/* ---- domain: forecast ---- */
|
||||||
|
--cone-fill: rgba(102, 179, 137, 0.18);
|
||||||
|
--cone-line: #46996F;
|
||||||
|
--cone-actual: var(--ink-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="dark"] {
|
||||||
|
/* evening service */
|
||||||
|
--paper-0: #121C18;
|
||||||
|
--paper-1: #182420;
|
||||||
|
--paper-2: #1F2E28;
|
||||||
|
--paper-3: #283A32;
|
||||||
|
|
||||||
|
--ink-1: #E4EEE7;
|
||||||
|
--ink-2: #9FB2A8;
|
||||||
|
--ink-3: #66796F;
|
||||||
|
--ink-inverse: #EFF5F0;
|
||||||
|
|
||||||
|
--line-1: #263630;
|
||||||
|
--line-2: #35493F;
|
||||||
|
|
||||||
|
--spruce-1: #1E332B;
|
||||||
|
--spruce-2: #27443A;
|
||||||
|
--spruce-3: #3A6353;
|
||||||
|
|
||||||
|
--jade-1: #1F3A2E;
|
||||||
|
--jade-3: #35624A;
|
||||||
|
|
||||||
|
--accent: #3A7260;
|
||||||
|
--accent-hover: #448069;
|
||||||
|
--accent-pressed: #315F51;
|
||||||
|
--accent-tint: #1E332B;
|
||||||
|
--accent-text: #8CC7AC;
|
||||||
|
--jade: #6FC694;
|
||||||
|
--jade-tint: #1F3A2E;
|
||||||
|
--focus-ring: #57937C;
|
||||||
|
|
||||||
|
--ok: #74B992;
|
||||||
|
--ok-tint: #1F3529;
|
||||||
|
--warn: #C0A45B;
|
||||||
|
--warn-tint: #33301F;
|
||||||
|
--danger: #C77B62;
|
||||||
|
--danger-tint: #392823;
|
||||||
|
--info: #7FA6BC;
|
||||||
|
--info-tint: #223038;
|
||||||
|
|
||||||
|
--label-est-bg: var(--paper-3);
|
||||||
|
--label-est-text: var(--ink-2);
|
||||||
|
--label-p1: #C77B62;
|
||||||
|
--label-p2: #C0A45B;
|
||||||
|
--label-p3: #7FA6BC;
|
||||||
|
--label-p4: #66796F;
|
||||||
|
--label-hard: #C77B62;
|
||||||
|
|
||||||
|
--cone-fill: rgba(111, 198, 148, 0.14);
|
||||||
|
--cone-line: #6FC694;
|
||||||
|
--cone-actual: #E4EEE7;
|
||||||
|
}
|
||||||
65
apps/desktop/src/renderer/src/design/tokens/fonts.css
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/* CommiTea webfonts — self-hosted, latin subsets */
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Libre Caslon Display';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/caslon-display-normal-400.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Libre Caslon Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/caslon-text-normal-400.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Libre Caslon Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/caslon-text-italic-400.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Libre Caslon Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/caslon-text-normal-700.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Instrument Sans';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/instrument-sans-normal-400-700.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Instrument Sans';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/instrument-sans-italic-400-700.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'IBM Plex Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/plex-mono-normal-400.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'IBM Plex Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/plex-mono-normal-500.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'IBM Plex Mono';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../assets/fonts/plex-mono-normal-600.woff2) format('woff2');
|
||||||
|
}
|
||||||
44
apps/desktop/src/renderer/src/design/tokens/spacing.css
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/* CommiTea spacing, radius, shadow, border & motion tokens. */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* spacing — 4px base */
|
||||||
|
--space-1: 4px;
|
||||||
|
--space-2: 8px;
|
||||||
|
--space-3: 12px;
|
||||||
|
--space-4: 16px;
|
||||||
|
--space-5: 20px;
|
||||||
|
--space-6: 24px;
|
||||||
|
--space-7: 32px;
|
||||||
|
--space-8: 40px;
|
||||||
|
--space-9: 48px;
|
||||||
|
--space-10: 64px;
|
||||||
|
|
||||||
|
/* radii — crisp, not bubbly */
|
||||||
|
--radius-1: 4px; /* chips, inputs' inner elements */
|
||||||
|
--radius-2: 6px; /* buttons, inputs */
|
||||||
|
--radius-3: 10px; /* cards, dialogs */
|
||||||
|
--radius-round: 999px;
|
||||||
|
|
||||||
|
/* borders */
|
||||||
|
--border-w: 1px;
|
||||||
|
--rule-double: 3px double var(--border-strong); /* fine-stationery section rule */
|
||||||
|
|
||||||
|
/* shadows — cool, restrained */
|
||||||
|
--shadow-1: 0 1px 2px rgba(20, 34, 28, 0.06);
|
||||||
|
--shadow-2: 0 2px 8px rgba(20, 34, 28, 0.08), 0 1px 2px rgba(20, 34, 28, 0.05);
|
||||||
|
--shadow-3: 0 12px 32px rgba(20, 34, 28, 0.14), 0 2px 8px rgba(20, 34, 28, 0.07);
|
||||||
|
--shadow-jade-line: inset 0 2px 0 var(--jade); /* jade top rule on key cards */
|
||||||
|
|
||||||
|
/* motion — settled, never bouncy */
|
||||||
|
--ease-out: cubic-bezier(0.25, 0.6, 0.3, 1); /* @kind other */
|
||||||
|
--ease-in-out: cubic-bezier(0.6, 0, 0.3, 1); /* @kind other */
|
||||||
|
--duration-fast: 120ms; /* @kind other */
|
||||||
|
--duration-base: 200ms; /* @kind other */
|
||||||
|
--duration-slow: 320ms; /* @kind other */
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="dark"] {
|
||||||
|
--shadow-1: 0 1px 2px rgba(0, 0, 0, 0.25);
|
||||||
|
--shadow-2: 0 2px 8px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||||
|
--shadow-3: 0 12px 32px rgba(0, 0, 0, 0.45), 0 2px 8px rgba(0, 0, 0, 0.25);
|
||||||
|
}
|
||||||
34
apps/desktop/src/renderer/src/design/tokens/typography.css
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/* CommiTea typography tokens.
|
||||||
|
Voices: Display serif (headlines, big numerals) · Reginald's voice (Caslon Text, upright)
|
||||||
|
· Body sans (UI) · Mono (data: labels, estimates, dates, ids). */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--font-serif-display: 'Libre Caslon Display', 'Libre Caslon Text', Georgia, serif;
|
||||||
|
--font-serif-text: 'Libre Caslon Text', Georgia, serif;
|
||||||
|
--font-sans: 'Instrument Sans', -apple-system, 'Segoe UI', sans-serif;
|
||||||
|
--font-mono: 'IBM Plex Mono', ui-monospace, 'SF Mono', monospace;
|
||||||
|
|
||||||
|
/* type scale */
|
||||||
|
--text-hero: 400 48px/1.08 var(--font-serif-display); /* big forecast numerals */
|
||||||
|
--text-display: 400 34px/1.15 var(--font-serif-display); /* page titles */
|
||||||
|
--text-title: 400 24px/1.2 var(--font-serif-display); /* card titles */
|
||||||
|
--text-agent: 400 16px/1.55 var(--font-serif-text); /* Reginald speaks — serif, upright */
|
||||||
|
--text-agent-lg: 400 20px/1.5 var(--font-serif-text);
|
||||||
|
--text-body: 400 14px/1.5 var(--font-sans);
|
||||||
|
--text-body-strong: 600 14px/1.5 var(--font-sans);
|
||||||
|
--text-small: 400 13px/1.45 var(--font-sans);
|
||||||
|
--text-caption: 400 12px/1.4 var(--font-sans);
|
||||||
|
--text-data: 400 13px/1.4 var(--font-mono); /* dates, counts */
|
||||||
|
--text-label: 500 11.5px/1 var(--font-mono); /* chips: est/2d, p/1 */
|
||||||
|
--text-overline: 600 11px/1.2 var(--font-sans); /* + letter-spacing-wide */
|
||||||
|
|
||||||
|
/* tracking */
|
||||||
|
--letter-spacing-wide: 0.08em; /* overlines, uppercase */
|
||||||
|
--letter-spacing-label: 0.02em; /* mono chips */
|
||||||
|
|
||||||
|
/* weights (sans is variable 400–700) */
|
||||||
|
--weight-regular: 400;
|
||||||
|
--weight-medium: 500;
|
||||||
|
--weight-semibold: 600;
|
||||||
|
--weight-bold: 700;
|
||||||
|
}
|
||||||
5
apps/desktop/src/renderer/src/index.css
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
@import './design/styles.css';
|
||||||
|
|
||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
11
apps/desktop/src/renderer/src/main.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import ReactDOM from 'react-dom/client'
|
||||||
|
|
||||||
|
import { App } from './app.js'
|
||||||
|
import './index.css'
|
||||||
|
|
||||||
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
||||||
|
<React.StrictMode>
|
||||||
|
<App />
|
||||||
|
</React.StrictMode>,
|
||||||
|
)
|
||||||
67
apps/desktop/tailwind.config.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
* Tailwind maps onto the design-token custom properties (src/renderer/src/design/tokens/)
|
||||||
|
* and never redefines their values. Preflight is off — tokens/base.css owns the reset.
|
||||||
|
* @type {import('tailwindcss').Config}
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
content: ['./src/renderer/index.html', './src/renderer/src/**/*.{ts,tsx}'],
|
||||||
|
corePlugins: { preflight: false },
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
paper: {
|
||||||
|
0: 'var(--paper-0)',
|
||||||
|
1: 'var(--paper-1)',
|
||||||
|
2: 'var(--paper-2)',
|
||||||
|
3: 'var(--paper-3)',
|
||||||
|
},
|
||||||
|
ink: {
|
||||||
|
1: 'var(--ink-1)',
|
||||||
|
2: 'var(--ink-2)',
|
||||||
|
3: 'var(--ink-3)',
|
||||||
|
inverse: 'var(--ink-inverse)',
|
||||||
|
},
|
||||||
|
line: {
|
||||||
|
1: 'var(--line-1)',
|
||||||
|
2: 'var(--line-2)',
|
||||||
|
},
|
||||||
|
accent: {
|
||||||
|
DEFAULT: 'var(--accent)',
|
||||||
|
hover: 'var(--accent-hover)',
|
||||||
|
pressed: 'var(--accent-pressed)',
|
||||||
|
tint: 'var(--accent-tint)',
|
||||||
|
text: 'var(--accent-text)',
|
||||||
|
},
|
||||||
|
jade: {
|
||||||
|
DEFAULT: 'var(--jade)',
|
||||||
|
tint: 'var(--jade-tint)',
|
||||||
|
},
|
||||||
|
ok: { DEFAULT: 'var(--ok)', tint: 'var(--ok-tint)' },
|
||||||
|
warn: { DEFAULT: 'var(--warn)', tint: 'var(--warn-tint)' },
|
||||||
|
danger: { DEFAULT: 'var(--danger)', tint: 'var(--danger-tint)' },
|
||||||
|
info: { DEFAULT: 'var(--info)', tint: 'var(--info-tint)' },
|
||||||
|
},
|
||||||
|
fontFamily: {
|
||||||
|
display: ['Libre Caslon Display', 'serif'],
|
||||||
|
agent: ['Libre Caslon Text', 'serif'],
|
||||||
|
sans: ['Instrument Sans', 'system-ui', 'sans-serif'],
|
||||||
|
mono: ['IBM Plex Mono', 'ui-monospace', 'monospace'],
|
||||||
|
},
|
||||||
|
borderRadius: {
|
||||||
|
1: 'var(--radius-1)',
|
||||||
|
2: 'var(--radius-2)',
|
||||||
|
3: 'var(--radius-3)',
|
||||||
|
},
|
||||||
|
boxShadow: {
|
||||||
|
1: 'var(--shadow-1)',
|
||||||
|
2: 'var(--shadow-2)',
|
||||||
|
3: 'var(--shadow-3)',
|
||||||
|
'jade-line': 'var(--shadow-jade-line)',
|
||||||
|
},
|
||||||
|
transitionTimingFunction: {
|
||||||
|
out: 'var(--ease-out)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
9
apps/desktop/tsconfig.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
||||||
|
"types": ["node"]
|
||||||
|
},
|
||||||
|
"include": ["src", "electron.vite.config.ts"]
|
||||||
|
}
|
||||||