candle-annotator/openspec/changes/enhance-annotation-features-and-deployment/specs/hacker-theme/spec.md
Marko Djordjevic a236d2c065 feat: create comprehensive specs for all four capabilities
- line-deletion: keyboard shortcuts and bulk delete with confirmation
- label-management: full CRUD UI in sidebar with search/filter
- docker-deployment: multi-stage build, compose, health checks
- hacker-theme: matrix-style colors, neon glows, monospace fonts
2026-02-12 14:44:45 +01:00

12 KiB
Raw Blame History

ADDED Requirements

Requirement: Monospace typography

The application SHALL use monospace fonts throughout the entire interface.

Scenario: Primary font family

  • WHEN CSS font-family is applied
  • THEN system uses font stack: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace

Scenario: Font loading

  • WHEN application loads
  • THEN system loads JetBrains Mono font from Google Fonts or local files with weights: 400, 500, 700

Scenario: All text elements

  • WHEN rendering any text (buttons, labels, inputs, tooltips, headings)
  • THEN all text uses monospace font family without exception

Scenario: Number formatting

  • WHEN displaying numbers (prices, timestamps, counts)
  • THEN uses tabular-nums CSS property for aligned columns

Requirement: Matrix-style color scheme

The application SHALL use a dark background with neon green (#00ff41) accent color scheme.

Scenario: Background colors

  • WHEN rendering main layout
  • THEN page background is #0a0e0a (near black), sidebar background is #0d110d, and chart background is #000000

Scenario: Primary accent color

  • WHEN highlighting interactive elements, active states, or success messages
  • THEN uses #00ff41 (matrix green) as the primary accent color

Scenario: Secondary accent colors

  • WHEN rendering labels or status indicators
  • THEN uses #ff0040 (neon red) for break_down/destructive, #00ff41 (neon green) for break_up/success, #00d4ff (neon cyan) for informational, #ffff00 (neon yellow) for warnings

Scenario: Text colors

  • WHEN rendering text
  • THEN primary text is #00ff41, secondary text is #00cc33 (dimmer green), and disabled text is #003311 (very dim green)

Scenario: Border colors

  • WHEN rendering borders
  • THEN uses #00ff41 with 1px solid for active elements, #003311 for inactive borders

Requirement: Neon glow effects

The application SHALL apply glow effects to active and interactive elements.

Scenario: Button hover glow

  • WHEN user hovers over any button
  • THEN button shows box-shadow: 0 0 10px #00ff41, 0 0 20px #00ff4180

Scenario: Active tool glow

  • WHEN a tool is active (selected)
  • THEN button shows pulsing glow animation with box-shadow: 0 0 15px #00ff41, 0 0 30px #00ff4180

Scenario: Selected element glow

  • WHEN a line or label is selected
  • THEN element shows glow effect with filter: drop-shadow(0 0 8px #00ff41)

Scenario: Input focus glow

  • WHEN user focuses on text input or search field
  • THEN input shows border glow: box-shadow: 0 0 8px #00ff41

Scenario: Cursor circle glow

  • WHEN drawing line with cursor circle visible
  • THEN cursor circle has stroke glow with filter: drop-shadow(0 0 4px currentColor)

Requirement: ASCII-style borders

The application SHALL use terminal-inspired border styling with corner characters.

Scenario: Container borders

  • WHEN rendering bordered containers (Toolbox, label list sections)
  • THEN uses 1px solid borders with #00ff41 color

Scenario: Border corners with pseudo-elements

  • WHEN rendering section headers or important containers
  • THEN uses CSS ::before and ::after pseudo-elements to display ASCII corner characters: ┌ ┐ └ ┘

Scenario: Separator lines

  • WHEN rendering section separators
  • THEN uses border-top: 1px solid #003311 with optional ASCII characters (─) via pseudo-elements

Scenario: Card-style containers

  • WHEN rendering label list entries or modal dialogs
  • THEN containers have 1px solid border with subtle inset shadow for depth

Requirement: Terminal-like feedback messages

The application SHALL display command-style feedback for user actions.

Scenario: Success message format

  • WHEN user completes an action successfully (delete, create, export)
  • THEN displays message in format: > SUCCESS: <action> completed [<count> items] in green text

Scenario: Error message format

  • WHEN an error occurs
  • THEN displays message in format: > ERROR: <description> [code: <error_code>] in red text

Scenario: Info message format

  • WHEN displaying informational message
  • THEN displays message in format: > INFO: <message> in cyan text

Scenario: Message container styling

  • WHEN displaying any feedback message
  • THEN container has monospace font, left-aligned text, subtle border, and auto-dismiss after 4 seconds

Scenario: Message animation

  • WHEN feedback message appears
  • THEN slides in from top with fade-in animation (0.3s ease-out)

Requirement: Minimalist icon treatment

The application SHALL use simplified, outline-style icons or ASCII alternatives.

Scenario: Lucide icon styling

  • WHEN rendering Lucide React icons
  • THEN icons use stroke-width: 1.5, size: 20px, and color matches text color (#00ff41)

Scenario: Icon hover effect

  • WHEN user hovers over icon button
  • THEN icon glows with filter: drop-shadow(0 0 4px currentColor)

Scenario: ASCII alternative icons (optional)

  • WHEN rendering simple actions (delete, expand, collapse)
  • THEN optionally uses ASCII characters: [×] for delete, [▼] for expand, [▲] for collapse, [>] for actions

Scenario: Icon color consistency

  • WHEN icon is in active/selected state
  • THEN icon color is #00ff41
  • WHEN icon is in disabled state
  • THEN icon color is #003311

Requirement: High contrast for readability

The application SHALL maintain WCAG AA contrast ratios for all text.

Scenario: Primary text contrast

  • WHEN displaying primary text (#00ff41) on dark background (#0a0e0a)
  • THEN contrast ratio is at least 4.5:1 (WCAG AA standard)

Scenario: Secondary text contrast

  • WHEN displaying secondary text (#00cc33) on dark background
  • THEN contrast ratio is at least 4.5:1

Scenario: Button text contrast

  • WHEN button is in any state (default, hover, active, disabled)
  • THEN text maintains minimum 4.5:1 contrast with background

Scenario: Chart element visibility

  • WHEN rendering lines and markers on chart
  • THEN all annotations have sufficient contrast against black background and candles

Requirement: Simplified button styling

The application SHALL use minimal, flat button design with terminal aesthetic.

Scenario: Default button appearance

  • WHEN rendering buttons in default state
  • THEN buttons have transparent background, 1px solid #00ff41 border, #00ff41 text, 4px padding, and no rounded corners (border-radius: 0)

Scenario: Hover button appearance

  • WHEN user hovers over button
  • THEN background changes to #00ff4110 (10% opacity), border glows, and text remains #00ff41

Scenario: Active button appearance

  • WHEN button is active/pressed
  • THEN background is #00ff4120 (20% opacity), border is 2px solid, and includes pulsing glow animation

Scenario: Disabled button appearance

  • WHEN button is disabled
  • THEN background is transparent, border is #003311, text is #003311, and no hover effects

Scenario: Destructive button styling

  • WHEN button represents destructive action (delete)
  • THEN uses #ff0040 (neon red) for border and text instead of green, with matching red glow on hover

Requirement: Cyber-retro aesthetic elements

The application SHALL include subtle design elements that enhance the hacker theme.

Scenario: Scanline effect (optional)

  • WHEN rendering main container
  • THEN applies subtle CSS repeating-linear-gradient overlay simulating CRT scanlines with 2px spacing at 5% opacity

Scenario: Noise texture (optional)

  • WHEN rendering background
  • THEN applies subtle noise texture using CSS filter or background-image at 3% opacity for grain effect

Scenario: Typewriter animation for messages

  • WHEN displaying new feedback message
  • THEN text appears with brief letter-by-letter typing animation (0.02s per character, max 0.5s total)

Scenario: Flicker animation on focus

  • WHEN user focuses on input field
  • THEN border shows brief flicker animation (0.1s) simulating electrical surge

Scenario: ASCII art branding (optional)

  • WHEN application loads or in header
  • THEN displays application name in ASCII art style using monospace font

Requirement: Responsive dark theme

The application SHALL maintain theme consistency across all components and states.

Scenario: Modal dialogs

  • WHEN displaying confirmation dialogs
  • THEN modal has dark background (#0d110d), neon green border, monospace font, and terminal-style title (e.g., "> CONFIRM ACTION")

Scenario: Input fields

  • WHEN rendering text inputs or search fields
  • THEN inputs have transparent background, #00ff41 border, #00ff41 text, #00ff4120 placeholder, and cursor color #00ff41

Scenario: Dropdown menus

  • WHEN displaying filter or select dropdowns
  • THEN dropdown has dark background (#0d110d), neon green border, #00ff41 option text, hover state with #00ff4120 background

Scenario: Scrollbars

  • WHEN content requires scrolling
  • THEN custom scrollbar with #003311 track, #00ff41 thumb, and 8px width

Scenario: Tooltips

  • WHEN displaying tooltips on hover
  • THEN tooltip has dark background (#0d110d), 1px #00ff41 border, monospace font, and terminal-style text

Requirement: Animation performance

The application SHALL use performant CSS animations that don't impact chart rendering.

Scenario: GPU acceleration

  • WHEN applying animations (glow, pulse, fade)
  • THEN uses CSS transform and opacity properties with will-change hints for GPU acceleration

Scenario: Animation duration

  • WHEN defining animations
  • THEN all animations complete within 0.5s, with most hover effects at 0.2s

Scenario: Reduced motion support

  • WHEN user has prefers-reduced-motion enabled
  • THEN system disables glow animations, typewriter effects, and pulsing, keeping only instant transitions

Scenario: Chart performance

  • WHEN theme is active and chart is rendering
  • THEN SVG overlay and chart rendering maintains 60fps without jank from theme effects

Requirement: Tailwind CSS configuration

The Tailwind config SHALL be updated to support hacker theme tokens.

Scenario: Custom colors in tailwind.config

  • WHEN tailwind.config.js is parsed
  • THEN defines custom colors: matrix: '#00ff41', matrixDim: '#00cc33', matrixDark: '#003311', neonRed: '#ff0040', neonCyan: '#00d4ff', neonYellow: '#ffff00', terminal: '#0a0e0a', terminalLight: '#0d110d'

Scenario: Custom font families

  • WHEN tailwind.config.js is parsed
  • THEN defines fontFamily: { mono: ['JetBrains Mono', 'Fira Code', 'Courier New', 'monospace'] }

Scenario: Custom animations

  • WHEN tailwind.config.js is parsed
  • THEN defines keyframes for 'glow-pulse', 'flicker', 'scanline-move' and corresponding animation utilities

Scenario: Custom shadows

  • WHEN tailwind.config.js is parsed
  • THEN defines boxShadow: { 'glow-sm': '0 0 8px #00ff41', 'glow': '0 0 15px #00ff41, 0 0 30px #00ff4180', 'glow-lg': '0 0 20px #00ff41, 0 0 40px #00ff4180' }

Requirement: globals.css updates

The globals.css file SHALL define base styles and CSS variables for the hacker theme.

Scenario: CSS custom properties

  • WHEN globals.css is loaded
  • THEN defines CSS variables: --color-matrix, --color-matrix-dim, --color-matrix-dark, --color-neon-red, --color-neon-cyan, --color-terminal, --font-mono

Scenario: Base body styles

  • WHEN page loads
  • THEN body element has background: --color-terminal, color: --color-matrix, font-family: --font-mono, and -webkit-font-smoothing: antialiased

Scenario: Selection styling

  • WHEN user selects text
  • THEN selection background is #00ff4140 (40% opacity) and text is #00ff41

Scenario: Scrollbar styling

  • WHEN globals.css is loaded
  • THEN defines custom scrollbar styles using ::-webkit-scrollbar pseudo-elements with theme colors