mirror of
https://github.com/mgeeky/decode-spam-headers.git
synced 2026-02-22 13:33:30 +01:00
MAESTRO: add frontend design tokens
This commit is contained in:
@@ -66,7 +66,7 @@ The hacker-themed dark colour palette (from spec FR-14):
|
|||||||
- [x] T003 [P] Create `backend/app/core/config.py` with Pydantic BaseSettings for CORS origins, rate limit thresholds, analysis timeout (30s), and debug flag — all configurable via environment variables
|
- [x] T003 [P] Create `backend/app/core/config.py` with Pydantic BaseSettings for CORS origins, rate limit thresholds, analysis timeout (30s), and debug flag — all configurable via environment variables
|
||||||
- [x] T004 [P] Create `frontend/src/types/analysis.ts` with TypeScript interfaces: `HeaderInput`, `AnalysisConfig` (test IDs, resolve flag, decode-all flag), `TestResult` (id, name, header, value, analysis, description, severity, status), `AnalysisReport` (results, hopChain, securityAppliances, metadata), `AnalysisProgress` (current test, total, percentage, elapsed). Refer to `.specify/specs/1-web-header-analyzer/data-model.md` for the complete entity definitions
|
- [x] T004 [P] Create `frontend/src/types/analysis.ts` with TypeScript interfaces: `HeaderInput`, `AnalysisConfig` (test IDs, resolve flag, decode-all flag), `TestResult` (id, name, header, value, analysis, description, severity, status), `AnalysisReport` (results, hopChain, securityAppliances, metadata), `AnalysisProgress` (current test, total, percentage, elapsed). Refer to `.specify/specs/1-web-header-analyzer/data-model.md` for the complete entity definitions
|
||||||
- [x] T005 [P] Create `frontend/src/lib/api-client.ts` — API client abstraction wrapping fetch with base URL from environment, JSON defaults, error handling, and typed response generics. Must support SSE streaming via ReadableStream for the analysis endpoint
|
- [x] T005 [P] Create `frontend/src/lib/api-client.ts` — API client abstraction wrapping fetch with base URL from environment, JSON defaults, error handling, and typed response generics. Must support SSE streaming via ReadableStream for the analysis endpoint
|
||||||
- [ ] T006 [P] Create `frontend/src/styles/design-tokens.ts` — centralised design tokens: colours (#1e1e2e background, #282a36 surface, #f8f8f2 text, #ff5555 spam, #ffb86c suspicious, #50fa7b clean, #bd93f9 accent), font families (mono/sans), spacing scale, and border-radius values
|
- [x] T006 [P] Create `frontend/src/styles/design-tokens.ts` — centralised design tokens: colours (#1e1e2e background, #282a36 surface, #f8f8f2 text, #ff5555 spam, #ffb86c suspicious, #50fa7b clean, #bd93f9 accent), font families (mono/sans), spacing scale, and border-radius values
|
||||||
|
|
||||||
## Completion
|
## Completion
|
||||||
|
|
||||||
|
|||||||
25
frontend/src/styles/design-tokens.test.ts
Normal file
25
frontend/src/styles/design-tokens.test.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
|
||||||
|
import { colors, fontFamilies, radii, spacing } from "./design-tokens";
|
||||||
|
|
||||||
|
describe("design tokens", () => {
|
||||||
|
it("exposes the expected color palette", () => {
|
||||||
|
expect(colors).toEqual({
|
||||||
|
background: "#1e1e2e",
|
||||||
|
surface: "#282a36",
|
||||||
|
text: "#f8f8f2",
|
||||||
|
spam: "#ff5555",
|
||||||
|
suspicious: "#ffb86c",
|
||||||
|
clean: "#50fa7b",
|
||||||
|
accent: "#bd93f9",
|
||||||
|
info: "#8be9fd",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("includes core font, spacing, and radius tokens", () => {
|
||||||
|
expect(fontFamilies.sans).toContain("var(--font-geist-sans)");
|
||||||
|
expect(fontFamilies.mono).toContain("var(--font-geist-mono)");
|
||||||
|
expect(spacing.md).toBe("12px");
|
||||||
|
expect(radii.md).toBe("8px");
|
||||||
|
});
|
||||||
|
});
|
||||||
43
frontend/src/styles/design-tokens.ts
Normal file
43
frontend/src/styles/design-tokens.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
export const colors = {
|
||||||
|
background: "#1e1e2e",
|
||||||
|
surface: "#282a36",
|
||||||
|
text: "#f8f8f2",
|
||||||
|
spam: "#ff5555",
|
||||||
|
suspicious: "#ffb86c",
|
||||||
|
clean: "#50fa7b",
|
||||||
|
accent: "#bd93f9",
|
||||||
|
info: "#8be9fd",
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const fontFamilies = {
|
||||||
|
sans: "var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif",
|
||||||
|
mono: "var(--font-geist-mono), ui-monospace, SFMono-Regular, Menlo, monospace",
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const spacing = {
|
||||||
|
none: "0px",
|
||||||
|
xs: "4px",
|
||||||
|
sm: "8px",
|
||||||
|
md: "12px",
|
||||||
|
lg: "16px",
|
||||||
|
xl: "24px",
|
||||||
|
"2xl": "32px",
|
||||||
|
"3xl": "48px",
|
||||||
|
"4xl": "64px",
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const radii = {
|
||||||
|
none: "0px",
|
||||||
|
sm: "4px",
|
||||||
|
md: "8px",
|
||||||
|
lg: "12px",
|
||||||
|
xl: "16px",
|
||||||
|
full: "9999px",
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const designTokens = {
|
||||||
|
colors,
|
||||||
|
fontFamilies,
|
||||||
|
spacing,
|
||||||
|
radii,
|
||||||
|
} as const;
|
||||||
Reference in New Issue
Block a user