TTS disabled by default for all users (tickets #002 freeze, #003 truncation).
Embedders re-enable with window.UNCLOSEAI_ENABLE_TTS = true.
Floating button bottom 20px to 141px to avoid overlapping page buttons.
Added docs/tickets/ with 5 issues from cthegray.
Bundle extension script and biome config updates.
modified: CLAUDE.md
modified: Makefile
new file: languages/awk/Dockerfile
new file: languages/awk/uncloseai.awk
modified: languages/bash/Dockerfile
deleted: languages/bash/examples.sh
new file: languages/bash/uncloseai.sh
new file: languages/c/curl/Dockerfile
new file: languages/c/curl/Makefile
new file: languages/c/curl/index.html
new file: languages/c/curl/uncloseai.c
new file: languages/c/libh2o/Dockerfile
new file: languages/c/libh2o/Makefile
new file: languages/c/libh2o/uncloseai.c
new file: languages/c/nghttp2/Dockerfile
new file: languages/c/nghttp2/Makefile
new file: languages/c/nghttp2/uncloseai.c
new file: languages/clojure/Dockerfile
new file: languages/clojure/deps.edn
new file: languages/clojure/uncloseai.clj
new file: languages/cobol/Dockerfile
new file: languages/cobol/discover.sh
new file: languages/cobol/hermes.sh
new file: languages/cobol/qwen.sh
new file: languages/cobol/tts.sh
new file: languages/cobol/uncloseai.cob
new file: languages/cpp/boost-beast/Dockerfile
new file: languages/cpp/boost-beast/Makefile
new file: languages/cpp/boost-beast/uncloseai.cpp
new file: languages/cpp/cpp-httplib/Dockerfile
new file: languages/cpp/cpp-httplib/Makefile
new file: languages/cpp/cpp-httplib/uncloseai.cpp
new file: languages/cpp/libcurl/Dockerfile
new file: languages/cpp/libcurl/Makefile
new file: languages/cpp/libcurl/uncloseai.cpp
new file: languages/crystal/Dockerfile
new file: languages/crystal/uncloseai.cr
new file: languages/csharp/Dockerfile
new file: languages/csharp/Uncloseai.cs
new file: languages/csharp/csharp.csproj
new file: languages/dart/Dockerfile
new file: languages/dart/bin/uncloseai.dart
new file: languages/dart/pubspec.yaml
new file: languages/deno/Dockerfile
new file: languages/deno/uncloseai.ts
new file: languages/elixir/Dockerfile
new file: languages/elixir/lib/uncloseai.ex
new file: languages/elixir/mix.exs
new file: languages/elixir/run.exs
new file: languages/erlang/Dockerfile
new file: languages/erlang/rebar.config
new file: languages/erlang/src/uncloseai.app.src
new file: languages/erlang/src/uncloseai.erl
new file: languages/fortran/Dockerfile
new file: languages/fortran/uncloseai.f90
new file: languages/fsharp/Dockerfile
new file: languages/fsharp/Uncloseai.fs
new file: languages/fsharp/fsharp.fsproj
new file: languages/go/Dockerfile
new file: languages/go/README.md
new file: languages/go/examples/basic.go
new file: languages/go/go.mod
new file: languages/go/uncloseai.go
new file: languages/go/uncloseai/uncloseai.go
new file: languages/haskell/Dockerfile
new file: languages/haskell/UncloseAI.hs
new file: languages/haskell/uncloseai.cabal
new file: languages/java/Dockerfile
new file: languages/java/UncloseAI.java
new file: languages/javascript/bun/Dockerfile
new file: languages/javascript/bun/uncloseai.ts
new file: languages/javascript/nodejs/Dockerfile
new file: languages/javascript/nodejs/README.md
new file: languages/javascript/nodejs/package.json
new file: languages/javascript/nodejs/uncloseai.js
new file: languages/javascript/typescript/Dockerfile
new file: languages/javascript/typescript/package.json
new file: languages/javascript/typescript/tsconfig.json
new file: languages/javascript/typescript/uncloseai.ts
new file: languages/javascript/vanilla/Dockerfile
new file: languages/javascript/vanilla/uncloseai.html
new file: languages/julia/Dockerfile
new file: languages/julia/Project.toml
new file: languages/julia/src/uncloseai.jl
new file: languages/kotlin/Dockerfile
new file: languages/kotlin/build.gradle.kts
new file: languages/kotlin/src/main/kotlin/UncloseAI.kt
new file: languages/kotlin/uncloseai.kt
new file: languages/lua/Dockerfile
new file: languages/lua/uncloseai.lua
new file: languages/nim/Dockerfile
new file: languages/nim/uncloseai.nim
new file: languages/ocaml/Dockerfile
new file: languages/ocaml/dune
new file: languages/ocaml/dune-project
new file: languages/ocaml/uncloseai.ml
new file: languages/odin/Dockerfile
new file: languages/odin/uncloseai.odin
new file: languages/perl/Dockerfile
new file: languages/perl/uncloseai.pl
new file: languages/php/Dockerfile
new file: languages/php/uncloseai.php
new file: languages/powershell/Dockerfile
new file: languages/powershell/uncloseai.ps1
new file: languages/prolog/Dockerfile
new file: languages/prolog/uncloseai.pl
new file: languages/python/aiohttp/Dockerfile
new file: languages/python/aiohttp/requirements.txt
new file: languages/python/aiohttp/uncloseai.py
modified: languages/python/httpx-async/Dockerfile
deleted: languages/python/httpx-async/examples.py
new file: languages/python/httpx-async/uncloseai.py
modified: languages/python/openai-client/Dockerfile
deleted: languages/python/openai-client/examples.py
new file: languages/python/openai-client/uncloseai.py
modified: languages/python/requests/Dockerfile
deleted: languages/python/requests/examples.py
new file: languages/python/requests/uncloseai.py
new file: languages/r/Dockerfile
new file: languages/r/uncloseai.R
new file: languages/ruby/Dockerfile
new file: languages/ruby/README.md
new file: languages/ruby/uncloseai.rb
new file: languages/rust/Cargo.toml
new file: languages/rust/Dockerfile
new file: languages/rust/README.md
new file: languages/rust/examples/basic.rs
new file: languages/rust/src/lib.rs
new file: languages/rust/src/uncloseai.rs
new file: languages/scala/Dockerfile
new file: languages/scala/build.sbt
new file: languages/scala/project/build.properties
new file: languages/scala/project/plugins.sbt
new file: languages/scala/src/main/scala/UncloseAI.scala
new file: languages/tcl/Dockerfile
new file: languages/tcl/uncloseai.tcl
new file: languages/v/Dockerfile
new file: languages/v/uncloseai.v
new file: languages/v/v.mod
new file: languages/vbnet/Dockerfile
new file: languages/vbnet/UncloseAI.vb
new file: languages/vbnet/UncloseAI.vbproj
modified: languages/zig/Dockerfile
modified: languages/zig/build.zig
deleted: languages/zig/src/main.zig
new file: languages/zig/src/uncloseai.zig
## Jest Configuration & Setup:
- Configure Jest with jsdom environment for DOM testing
- Set up test mocks for external dependencies (marked, hljs)
- Create test setup with localStorage, fetch, and dialog element mocks
- Add npm scripts for testing: test, test:watch, test:coverage, test:modals
- Update Makefile with Jest test targets and CI integration
## TTS Modal Tests (89 test cases):
- Modal creation, display, and structure validation
- Voice selection dropdown with 6+ voice options
- Speed control slider (0.5x-2.0x range)
- Audio generation with API integration testing
- Download functionality with blob handling
- Modal closing and cleanup
- Accessibility (ARIA, keyboard navigation, focus management)
- Error handling (API failures, malformed responses, network issues)
## Translate Modal Tests (85 test cases):
- Modal creation with source/target language selection
- Language detection and auto-population
- Translation API integration with streaming responses
- Copy functionality with clipboard API
- Text editing and retranslation
- Language swap functionality
- Modal state management
- Accessibility compliance
- Comprehensive error handling
## Embed Modal Tests (78 test cases):
- Main chat modal with conversation management
- Model loading and selection from endpoints
- Conversation history persistence with localStorage
- Real-time chat with streaming AI responses
- Message actions (copy, delete, TTS buttons)
- Action buttons with fallback modal opening
- Toggle functionality and state management
- User input handling (Enter key, send button)
- Accessibility and keyboard navigation
- Error handling for chat API, storage, and network issues
## Total: 252 comprehensive test cases covering:
- UI component creation and rendering
- User interaction and event handling
- API integration and streaming responses
- State management and persistence
- Accessibility compliance
- Error boundary testing
- Modal lifecycle management
- Cross-browser compatibility patterns
All tests include proper mocking, async handling, and cleanup for reliable CI execution.