Commit Graph
312 Commits
Author SHA1 Message Date
phranck 2f44f45c3c chore: Trigger CI workflow 2026-02-04 00:40:55 +01:00
phranck b38fc7064c Fix: Resolve all ESLint errors and optimize TypeScript
Lint Fixes:
- Fix setState in useEffect warnings by using lazy initialization and useLayoutEffect
- Remove unused parameters and variables (patterns, zoomed)
- Add eslint-disable comments for legitimate patterns (hydration, cleanup)
- Fix ref mutation warnings in cleanup functions

Code Optimizations:
- Remove dead Patterns interface and regex objects from CodePreview
- Simplify tokenizeLine to use combined regex directly
- Use lazy state initialization in ThemeProvider to avoid SSR mismatch
- Split audio preload and mount state into separate effects
- Use useLayoutEffect for synchronous DOM updates (terminalOpacity reset)
- Improve cleanup by copying ref values before use
- Add proper cancelAnimationFrame cleanup for fade animation

Result: ✓ All lint errors fixed, production build successful
2026-02-02 11:17:06 +01:00
phranck 33f993e834 Fix: Remove readonly constraint from terminal data
- Remove 'as const' from generated terminal-data.ts
- Add type assertion for INTERACTIONS array to fix TypeScript error
- Fixes production build failure with readonly type mismatch
2026-02-02 11:12:03 +01:00
phranck fbfbdc3420 Feat: Add terminal script parser and markdown-based terminal content
- Create terminal-parser.ts to parse terminal-script.md
- Add build script (generate-terminal-data.ts) to convert markdown to TypeScript
- Refactor TerminalScreen.tsx to use generated data instead of hardcoded arrays
- Add prebuild script to package.json for automatic data generation
- Install tsx and @types/howler dev dependencies
- Fix parser to preserve spacing in COUNTER prefix (Memory Test:  )
- Update terminal-script.md documentation with [INLINE] tag explanation

Now terminal content can be edited in markdown without touching TypeScript:
1. Edit terminal-script.md
2. Run: npx tsx scripts/generate-terminal-data.ts
3. Reload browser - changes are live
2026-02-02 11:08:12 +01:00
phranck 6ae898c2c2 Feat: Add complete WarGames terminal animation with hard drive sounds
- Install Howler.js for gapless audio looping
- Add authentic hard drive sounds (boot, spin, seek, power-on/off)
- Implement power-on beep (0.3 volume)
- Boot sound: 20.18s with seamless transition to spin loop
- Spin sound: gapless loop with Howler.js (0.6 volume)
- Random seek sounds every 15-25s with 30% double-seek chance (0.4 volume)
- Add school computer grade change scene (WarGames film authentic)
  - Login as DABNEY/PENCIL
  - Change David's and Jennifer's Biology grades from F/C to A
  - Inline input format (prompt and input on same line)
  - Grade reports displayed as table
- Add complete Joshua/WOPR dialogue sequence
- Sequence flow: Boot → 12s UNIX → School → 12s UNIX → Joshua → loop
- Reduce CRT scanline opacity for subtler effect
- Add 6-second fade-in for entire terminal output
- Create terminal-script.md documentation with full script
2026-02-02 10:33:52 +01:00
phranck 8cf54ca6a8 Feat: Implement CRT cathode ray scanline effect
Adds realistic CRT monitor scanline sweep effect to terminal:

**Visual Effect:**
- Sharp bottom edge (cathode ray current position)
- Trailing phosphor glow upward (150px trail)
- Gradient: transparent → 0.02 → 0.04 → 0.08 → 0.1
- Sharp edge: 0.08 opacity, no blur
- Trail: blur(3px) for smooth phosphor decay

**Animation:**
- 15s linear infinite
- Moves from top to bottom within terminal area only
- Minimal pause between cycles
- Only active when terminal is powered on

**Implementation:**
- Container (150px) with gradient + sharp 2px bottom edge
- Uses transform: translateY() for smooth animation
- CSS @keyframes crt-scanline-move
- Positioned within CRT glow layer (z-index 3)

Inspired by real CRT electron beam behavior where the
cathode ray sweeps the screen with phosphor persistence
trailing behind.
2026-02-02 01:16:26 +01:00
phranck 6069dbf46c Fix: Make CRT scanline more visible and ensure 30s animation
- Increased scanline height from 3px to 8px
- Set animation directly in style instead of via Tailwind class
  to ensure 30s duration is applied correctly
2026-02-02 00:42:16 +01:00
phranck f8c5ea3b6e Fix: Remove duplicate crt-scanline keyframes (old fast version)
The old 'background-position' animation was still present and
overriding the new slower 'translateY' version. Now only the
30s animation remains active.
2026-02-02 00:41:13 +01:00
phranck 8193335039 Fix: Slow down CRT scanline animation from 8s to 30s 2026-02-02 00:39:30 +01:00
phranck 3cbcce9b88 Feat: Add CRT monitor visual effects to terminal
Inspired by cool-retro-term, implements vintage CRT display effects:

**New Component: CRTEffects.tsx**
- Scanlines (horizontal raster lines)
- Screen curvature simulation (vignette)
- Glow/bloom effect
- Subtle flicker animation
- Animated noise overlay (Canvas API)
- Moving scanline sweep

**CSS Animations (globals.css)**
- @keyframes crt-flicker: Subtle brightness variation (0.15s loop)
- @keyframes crt-scanline: Horizontal line sweep (8s loop)

**Integration (HeroTerminal.tsx)**
- CRT effects only active when terminal is powered+zoomed
- Optimized parameters:
  - scanlineIntensity: 0.12
  - curvature: 0.08
  - glowIntensity: 0.25
  - flickerIntensity: 0.02
  - noiseIntensity: 0.04

Effects layer at z-index 200 with mix-blend-mode screen.
All effects are pointer-events-none to preserve interactivity.
2026-02-02 00:37:35 +01:00
phranck e7d68fd4cc Remove: CRT power-on sound completely
- Removed AudioContext setup and management
- Removed playCrtPowerOnSound() function (95 lines)
- Removed audio unlock listeners
- Cleaned up handlePowerOn comment

Audio caused issues with browser autoplay policies and added
unnecessary complexity. Terminal animation works fine without it.
2026-02-02 00:33:59 +01:00
phranck ae552adfce Fix: CRT power-on sound blocked by browser autoplay policy
- Make playCrtPowerOnSound() async with proper AudioContext.resume()
- Add AudioContext unlock on first user interaction (click/touchstart)
- Add error handling for audio failures
- Ensures sound works in all browsers with autoplay restrictions
2026-02-02 00:28:01 +01:00
phranck 9b0a82ab15 Merge pull request #56 from phranck/feat/landing-page-nunito-font
Replace SN Pro with Nunito font on landing page
2026-02-02 00:23:13 +01:00
phranck dc2f0992f4 Feat: Replace SN Pro with Nunito font on landing page
- Remove SN Pro Google Font import from globals.css
- Add Nunito font import with weights 400, 500, 600, 700
- Update CSS variables to use --font-nunito
- Apply Nunito as primary font family for body text
- Keep Geist Mono for monospace elements
2026-02-01 22:15:03 +01:00
phranck f4141d0ecf Test: Strengthen 17 weak test assertions
Replace vague assertions with concrete, specific checks:

**Pattern 1: !buffer.isEmpty → Specific content checks**
- ViewTests.swift (1): Check bold ANSI code + content
- StatusBarTests.swift (4): Check item labels present
- ModifierTests.swift (1): Check border characters
- ButtonTests.swift (3): Check height + border characters
- ComponentViewTests.swift (4): Check titles + content
- ContainerViewTests.swift (1): Check height + content
- FrameBufferTests.swift (2): Check overlay composition

**Pattern 2: Weak contains() → Exact ANSI codes**
- ANSIRendererFullTests.swift (1): contains("1") → contains("\u{1B}[1m")

**Summary:**
- 17 tests strengthened across 8 files
- All tests now assert observable behavior
- No property readback, no empty checks
- 412 tests passing

Addresses to-dos.md line 34: "Weak Test Rewrites"
2026-02-01 22:00:22 +01:00
phranck b8918ed6b8 Merge pull request #55 from phranck/test/audit-cleanup
Test: Remove 78 worthless tests
2026-02-01 04:25:40 +01:00
phranck 0e7dd858f8 Docs: Update test count badge and references (498/181 → 412) 2026-02-01 04:22:44 +01:00
phranck 32f06bcd98 Test: Remove 78 worthless tests (property readback, tautologies, redundancies) 2026-02-01 04:20:46 +01:00
phranck 07ad15320c Merge pull request #54 from phranck/feat/seo-improvements
Feat: Comprehensive SEO improvements for landing page
2026-02-01 04:04:49 +01:00
phranck 42b0597075 Feat: Comprehensive SEO improvements for landing page
- Add robots.txt and sitemap.xml (static files for export mode)
- Add OG image (1200x630) with terminal icon + branding
- Add Twitter Card meta tags (summary_large_image)
- Add canonical URL via metadataBase
- Add JSON-LD structured data (SoftwareSourceCode schema)
- Add <main> landmark and skip-navigation link for accessibility
- Add preconnect hints for Google Fonts, Google Static, and Umami
- Add web app manifest (site.webmanifest)
- Add meta keywords for secondary search engines
- Add aria-hidden on decorative SF Symbol icons
2026-02-01 04:00:02 +01:00
phranck 561d38b6cc Merge pull request #53 from phranck/feat/favicon-and-theme-shortcut
Feat: Cropped terminal favicon and keyboard theme cycling
2026-02-01 03:52:16 +01:00
phranck 0ba791c1eb Feat: Cropped terminal favicon and keyboard theme cycling
- Generate cropped favicon from tuikit-logo.png (transparent edges removed)
- Add multi-size favicons (16, 32, 192, 512px + .ico)
- Update metadata.icons in layout.tsx with proper sizes
- Add global 't' keydown listener in ThemeProvider to cycle themes
- Fix TUIKit → TUIkit typo in palette-preview.html
2026-02-01 03:50:00 +01:00
phranck 3e35f14999 Merge pull request #52 from phranck/feat/cursor-blink-and-analytics
Feat: Blinking cursor in headline and Umami analytics
2026-02-01 03:29:23 +01:00
phranck 58140d78fc Feat: Blinking cursor in headline and Umami analytics
- Add blinking terminal cursor (_) to headline via @utility and @keyframes
- Add Umami analytics script to layout head
2026-02-01 03:23:57 +01:00
phranck b4024eaaf2 Merge pull request #51 from phranck/feat/blade-runner-atmosphere
Feat: Blade Runner atmosphere effects, System V terminal rewrite, and visual polish
2026-02-01 02:53:18 +01:00
phranck 620c62c2e8 Feat: Blade Runner atmosphere effects, System V terminal rewrite, and visual polish
- Add full-screen canvas rain overlay (RainOverlay) with theme-colored drops
- Add random-position pulsing spinner lights (SpinnerLights) with drift effect
- Add anamorphic lens flares to HeroTerminal CRT screen
- Rewrite all ~65 terminal interactions for AT&T UNIX System V accuracy (1984)
- Add human-like variable typing speed for David (Joshua sequence)
- Fix AudioContext leak with shared lazy instance
- Fix SpinnerLights timer leak with Set-based cleanup
- Fix stale lineRefsRef in clearScreen, canvas lineWidth jitter
- Fix uncontrolled HeroTerminal timeout refs
- Remove redundant mounted state, WIND_DRIFT constant, opacity no-op
- Replace getComputedStyle polling with MutationObserver for theme changes
- Fix unstable React key causing DOM remounts
- Fix pickInteraction off-by-two for full exhaustion
- Add frosted glass effect to FeatureCards, CodePreview, and Built right box
- Add glowing text to PackageBadge, simplify ThemeSwitcher logic
- Layer content above atmosphere effects with z-index stacking
2026-02-01 02:50:58 +01:00
phranck bf08a745e4 Merge pull request #50 from phranck/feat/terminal-boot-delay-and-chime
Feat: UNIX System V boot, Joshua easter egg, CRT effects and theme fixes
2026-02-01 01:34:34 +01:00
phranck 4af5d1cfc4 Feat: Remove static welcome text and add CRT glass sheen overlay
- Powered-off terminal shows no text (realistic CRT behavior)
- Add permanent glass sheen with diagonal specular highlight in theme color
- Glass overlay covers full screen area with vignette effect
2026-02-01 01:32:29 +01:00
phranck 106eb5b1cd Feat: UNIX System V boot sequence, Joshua easter egg, CRT effects and theme fixes
- Replace Swift/TUIKit boot content with authentic System V Release 3.2 boot sequence
- Rewrite all ~53 terminal interactions as classic UNIX commands
- Add complete WarGames/Joshua easter egg with film-accurate screenplay dialog
- Add CRT power-on sound (degauss thump, mains hum, flyback whine)
- Add scanline sweep animation and random scanline glitch effect
- Restructure CRT layers: black backing, terminal content, inner glow, frame mask
- Update logo to frame-only PNG with transparent center
- Fix theme hydration flash (null initial state, localStorage-first reading)
- Add cursor-pointer and null-safe active indicator to ThemeSwitcher
2026-02-01 01:26:40 +01:00
phranck 713323dded Feat: Add CRT power-on hum and delay boot until zoom animation completes 2026-01-31 23:19:23 +01:00
phranck 965745d5e0 Merge pull request #49 from phranck/feat/animated-terminal-logo
Feat: Interactive CRT terminal animation for Hero section
2026-01-31 23:11:42 +01:00
phranck b8028e83e0 Feat: Replace static logo with interactive CRT terminal animation 2026-01-31 23:09:37 +01:00
phranck 06b80556e5 Merge pull request #48 from phranck/refactor/palette-essentials-block-palette
Refactor: Split Palette into Palette (13) + BlockPalette (3) protocol hierarchy
2026-01-31 21:37:30 +01:00
phranck 3e959d8026 Refactor: Split Palette into Palette (13) + BlockPalette (3) protocol hierarchy
- Reduce Palette protocol from 18 to 13 essential properties
- Add BlockPalette protocol with surfaceBackground, surfaceHeaderBackground, elevatedBackground
- BlockPalette defaults compute via lighter(by:) from background
- Add Color.rgbComponents for universal ANSI/256/RGB conversion
- Make lighter(by:), darker(by:), opacity() work on all color types
- Migrate views to use BlockPalette accessors
- Remove NCursesPalette (to be reworked later)
- Update all 6 palette structs to BlockPalette conformance
- Update DocC articles, topic index, and palette-preview.html
- All 492 tests in 83 suites passing
2026-01-31 21:35:17 +01:00
phranck 1cb13fbd40 Merge pull request #47 from phranck/chore/palette-preview-fixes
Chore: Fix palette preview — responsive + sync SDK colors
2026-01-31 20:57:41 +01:00
phranck bb015d9c5b Chore: Fix palette preview — responsive hue bar, single-column mobile, sync SDK colors
- Move media queries after base styles (fixes 2-column on mobile)
- Fix hue bar losing gradient in vertical layout (flex: none + width: 100%)
- Add statusBarBackground to Backgrounds swatch group
- Add foregroundPlaceholder to all palettes and Foregrounds group
- Remove deleted properties from palette data and swatchGroups
- Update existing palettes with correct SDK values including Violet HSL hex
2026-01-31 20:47:11 +01:00
phranck bba460daa5 Merge pull request #46 from phranck/refactor/remove-derived-palette-properties
Refactor: Remove derived Palette properties
2026-01-31 20:44:52 +01:00
phranck e1f702c921 Refactor: Remove derived Palette properties, views use essentials directly
Remove borderFocused, separator, selection, selectionBackground, disabled,
statusBarForeground, statusBarHighlight from Palette protocol and all
consumers. Views now use palette essentials directly (e.g. palette.accent
instead of palette.borderFocused, palette.foregroundTertiary instead of
palette.disabled). Update tests and DocC articles accordingly.
2026-01-31 20:19:09 +01:00
phranck 66d4547228 Merge pull request #45 from phranck/refactor/palette-backgrounds
Refactor: Restructure Palette background properties
2026-01-31 20:15:40 +01:00
phranck e835c0f57f Refactor: Reduce Palette to essentials, add foregroundPlaceholder
Remove explicit borderFocused, selection, selectionBackground,
statusBarForeground, statusBarHighlight from all palette implementations.
These remain as default-derived properties on the protocol extension.

Add foregroundPlaceholder as 4th foreground level for input field
placeholder text, dimmer than foregroundTertiary.

Fix SwiftLint force_try violations in luminance tests.
2026-01-31 20:10:05 +01:00
phranck b1d2362490 Chore: Increase swatch minimum width for fewer columns 2026-01-31 19:59:04 +01:00
phranck aa1a09b1e7 Chore: Improve swatch labels with proper word breaks and larger font 2026-01-31 19:57:45 +01:00
phranck 769ba91fc1 Chore: Remove terminal preview from palette page, keep swatches only 2026-01-31 19:55:10 +01:00
phranck 2f8bf6047c Fix: Make terminal preview horizontal rules stretch to full width via flexbox 2026-01-31 19:54:21 +01:00
phranck ee5d526c6c Fix: Restore two-column palette grid, swatches fill card width 2026-01-31 19:49:54 +01:00
phranck 2ca69df85a Fix: Align terminal preview borders using flexbox layout 2026-01-31 19:48:27 +01:00
phranck 67f9b5a94b Chore: Tighten terminal preview line-height to 1.3 2026-01-31 19:47:09 +01:00
phranck 7c11ba62c4 Chore: Make palette preview responsive with fluid swatch grid 2026-01-31 19:45:50 +01:00
phranck 142221627d Refactor: Restructure Palette background properties for semantic clarity
Replace generic backgroundSecondary/backgroundTertiary with purpose-specific
background properties (containerBodyBackground, containerCapBackground,
buttonBackground, appHeaderBackground, overlayBackground).

- Update Palette protocol and all 7 palette implementations
- Update SemanticColor, Color.Semantic namespace, and view consumers
- Rewrite background hierarchy tests with luminance assertions
- Update DocC articles (PaletteReference, ThemingGuide, AppearanceAndColors)
- Sync landing page CSS variables and components to new naming
- Update palette-preview.html with new property names
- Replace landing page logo with tuikit-logo-blank.png
2026-01-31 19:44:46 +01:00
phranck f6d0e58ef5 Merge pull request #44 from phranck/feat/blue-theme-and-color-sync
Feat: Add Blue/Violet palettes, sync theme colors and order between SDK and landing page
2026-01-31 19:08:15 +01:00