tv-console 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,6 +10,8 @@ A console replacement for TV apps where browser console is not accessible. This
10
10
  - 📱 **TV-optimized** - Designed for smart TV applications and set-top boxes
11
11
  - 🔧 **Flexible configuration** - Enable/disable, filter log levels, custom formatting
12
12
  - 📊 **Log management** - Export logs, clear console, show/hide overlay
13
+ - 🎯 **Focus memory** - Captures and restores the host application's focused element when the console gains/releases focus
14
+ - 🖱️ **Safe keyboard takeover** - Focus only activates when the console is visible; all event listeners are removed on destroy
13
15
 
14
16
  ## Installation
15
17
 
@@ -17,70 +19,107 @@ A console replacement for TV apps where browser console is not accessible. This
17
19
  npm install tv-console
18
20
  ```
19
21
 
22
+ ### CDN Usage
23
+
24
+ You can also use TV Console directly from CDN:
25
+
26
+ ```html
27
+ <!-- Using unpkg -->
28
+ <script src="https://unpkg.com/tv-console@1.0.3/dist/index.umd.min.js"></script>
29
+
30
+ <!-- Using jsDelivr -->
31
+ <script src="https://cdn.jsdelivr.net/npm/tv-console@1.0.3/dist/index.umd.min.js"></script>
32
+
33
+ <!-- Using CDNJS (once approved) -->
34
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tv-console/1.0.3/index.umd.min.js"></script>
35
+ ```
36
+
37
+ When using CDN, the library is available globally. You may need to access it in one of these ways:
38
+
39
+ ```html
40
+ <script>
41
+ // Method 1: Direct access (most common)
42
+ const tvConsole = new TVConsole()
43
+
44
+ // Method 2: If the above doesn't work, try:
45
+ const TVConsoleConstructor =
46
+ window.TVConsole && window.TVConsole.TVConsole
47
+ ? window.TVConsole.TVConsole
48
+ : window.TVConsole && window.TVConsole.default
49
+ ? window.TVConsole.default
50
+ : window.TVConsole
51
+ const tvConsole = new TVConsoleConstructor()
52
+
53
+ // Test it
54
+ console.log('Hello from CDN!')
55
+ </script>
56
+ ```
57
+
20
58
  ## Quick Start
21
59
 
22
60
  ```typescript
23
- import { TVConsole } from 'tv-console';
61
+ import { TVConsole } from 'tv-console'
24
62
 
25
63
  // Initialize with default settings
26
- const tvConsole = new TVConsole();
64
+ const tvConsole = new TVConsole()
27
65
 
28
66
  // Your existing console calls will now appear on screen
29
- console.log('Hello TV World!');
30
- console.error('Something went wrong');
31
- console.warn('Warning message');
67
+ console.log('Hello TV World!')
68
+ console.error('Something went wrong')
69
+ console.warn('Warning message')
32
70
  ```
33
71
 
34
72
  ## Configuration
35
73
 
36
74
  ```typescript
37
- import { TVConsole } from 'tv-console';
75
+ import { TVConsole } from 'tv-console'
38
76
 
39
77
  const tvConsole = new TVConsole({
40
- enabled: true,
41
- position: 'bottom-right',
42
- backgroundColor: 'rgba(0, 0, 0, 0.9)',
43
- textColor: '#00ff00',
44
- fontSize: '16px',
45
- maxEntries: 200,
46
- showTimestamp: true,
47
- showLogLevel: true,
48
- logLevels: ['log', 'error', 'warn'], // Only show these levels
49
- zIndex: 10000
50
- });
78
+ enabled: true,
79
+ position: 'bottom-right',
80
+ backgroundColor: 'rgba(0, 0, 0, 0.9)',
81
+ textColor: '#00ff00',
82
+ fontSize: '16px',
83
+ maxEntries: 200,
84
+ showTimestamp: true,
85
+ showLogLevel: true,
86
+ logLevels: ['log', 'error', 'warn'], // Only show these levels
87
+ zIndex: 10000,
88
+ })
51
89
  ```
52
90
 
53
91
  ## API Reference
54
92
 
55
93
  ### Constructor Options
56
94
 
57
- | Option | Type | Default | Description |
58
- |--------|------|---------|-------------|
59
- | `enabled` | `boolean` | `true` | Enable/disable the TV console |
60
- | `maxEntries` | `number` | `100` | Maximum number of log entries to keep |
61
- | `position` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-right'` | Position of the console overlay |
62
- | `width` | `string` | `'400px'` | Width of the console overlay |
63
- | `height` | `string` | `'300px'` | Height of the console overlay |
64
- | `backgroundColor` | `string` | `'rgba(0, 0, 0, 0.8)'` | Background color of the overlay |
65
- | `textColor` | `string` | `'#ffffff'` | Text color |
66
- | `fontSize` | `string` | `'14px'` | Font size |
67
- | `opacity` | `number` | `0.9` | Opacity of the overlay |
68
- | `showTimestamp` | `boolean` | `true` | Show timestamp with each log entry |
69
- | `className` | `string` | `'tv-console'` | CSS class for styling |
70
- | `zIndex` | `number` | `9999` | Z-index of the overlay |
71
- | `showLogLevel` | `boolean` | `true` | Show log level indicators |
72
- | `logLevels` | `LogLevel[]` | `['log', 'info', 'warn', 'error', 'debug']` | Filter which log levels to display |
73
- | `formatter` | `(entry: LogEntry) => string` | Default formatter | Custom formatter for log messages |
74
- | `focusKey` | `string` | `'12345'` | Key combination to focus the console |
75
- | `unfocusKey` | `string` | `'Escape'` | Key to unfocus the console |
76
- | `onFocus` | `() => void` | `() => {}` | Callback when console gains focus |
77
- | `onUnfocus` | `() => void` | `() => {}` | Callback when console loses focus |
78
- | `enableKeyboardNav` | `boolean` | `true` | Enable keyboard navigation for scrolling |
79
- | `showFocusIndicator` | `boolean` | `true` | Show focus indicator when console is focused |
95
+ | Option | Type | Default | Description |
96
+ | -------------------- | -------------------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------- |
97
+ | `enabled` | `boolean` | `true` | Enable/disable the TV console |
98
+ | `maxEntries` | `number` | `100` | Maximum number of log entries to keep |
99
+ | `position` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-right'` | Position of the console overlay |
100
+ | `width` | `string` | `'400px'` | Width of the console overlay |
101
+ | `height` | `string` | `'300px'` | Height of the console overlay |
102
+ | `backgroundColor` | `string` | `'rgba(0, 0, 0, 0.8)'` | Background color of the overlay |
103
+ | `textColor` | `string` | `'#ffffff'` | Text color |
104
+ | `fontSize` | `string` | `'14px'` | Font size |
105
+ | `opacity` | `number` | `0.9` | Opacity of the overlay |
106
+ | `showTimestamp` | `boolean` | `true` | Show timestamp with each log entry |
107
+ | `className` | `string` | `'tv-console'` | CSS class for styling |
108
+ | `zIndex` | `number` | `9999` | Z-index of the overlay |
109
+ | `showLogLevel` | `boolean` | `true` | Show log level indicators |
110
+ | `logLevels` | `LogLevel[]` | `['log', 'info', 'warn', 'error', 'debug']` | Filter which log levels to display |
111
+ | `formatter` | `(entry: LogEntry) => string` | Default formatter | Custom formatter for log messages |
112
+ | `focusKey` | `string` | `'12345'` | Key combination to focus the console |
113
+ | `unfocusKey` | `string` | `'Escape'` | Key to unfocus the console |
114
+ | `onFocus` | `() => void` | `() => {}` | Callback when console gains focus |
115
+ | `onUnfocus` | `() => void` | `() => {}` | Callback when console loses focus |
116
+ | `enableKeyboardNav` | `boolean` | `true` | Enable keyboard navigation for scrolling |
117
+ | `showFocusIndicator` | `boolean` | `true` | Show a subtle outline on the console when focused (no layout shift) |
80
118
 
81
119
  ### Instance Methods
82
120
 
83
121
  #### Logging Methods
122
+
84
123
  - `log(...args: any[])` - Log a message
85
124
  - `info(...args: any[])` - Log an info message
86
125
  - `warn(...args: any[])` - Log a warning message
@@ -88,18 +127,21 @@ const tvConsole = new TVConsole({
88
127
  - `debug(...args: any[])` - Log a debug message
89
128
 
90
129
  #### Console Control
130
+
91
131
  - `show()` - Show the console overlay
92
132
  - `hide()` - Hide the console overlay
93
133
  - `toggle()` - Toggle visibility
94
134
  - `clear()` - Clear all log entries
95
- - `destroy()` - Remove the console overlay and restore original console
135
+ - `destroy()` - Unfocus (restoring previously focused element), remove all event listeners, and remove the overlay
96
136
 
97
137
  #### Focus Management
138
+
98
139
  - `focus()` - Focus the console for keyboard navigation
99
140
  - `unfocus()` - Unfocus the console
100
141
  - `isFocused(): boolean` - Check if console is currently focused
101
142
 
102
143
  #### Data Management
144
+
103
145
  - `getLogs(): LogEntry[]` - Get all current log entries
104
146
  - `setConfig(config: Partial<TVConsoleConfig>)` - Update configuration
105
147
  - `exportLogs(): string` - Export logs as formatted text
@@ -109,44 +151,44 @@ const tvConsole = new TVConsole({
109
151
  ### Basic Usage
110
152
 
111
153
  ```typescript
112
- import { TVConsole } from 'tv-console';
154
+ import { TVConsole } from 'tv-console'
113
155
 
114
156
  // Initialize
115
- const tvConsole = new TVConsole();
157
+ const tvConsole = new TVConsole()
116
158
 
117
159
  // Your app code
118
160
  function handleUserAction() {
119
- console.log('User clicked button');
120
- console.info('Processing request...');
121
-
122
- try {
123
- // Some operation
124
- console.log('Operation successful');
125
- } catch (error) {
126
- console.error('Operation failed:', error);
127
- }
161
+ console.log('User clicked button')
162
+ console.info('Processing request...')
163
+
164
+ try {
165
+ // Some operation
166
+ console.log('Operation successful')
167
+ } catch (error) {
168
+ console.error('Operation failed:', error)
169
+ }
128
170
  }
129
171
  ```
130
172
 
131
173
  ### Advanced Configuration
132
174
 
133
175
  ```typescript
134
- import { TVConsole } from 'tv-console';
176
+ import { TVConsole } from 'tv-console'
135
177
 
136
178
  const tvConsole = new TVConsole({
137
- position: 'bottom-left',
138
- backgroundColor: 'rgba(0, 20, 40, 0.95)',
139
- textColor: '#00ff88',
140
- fontSize: '18px',
141
- maxEntries: 50,
142
- logLevels: ['error', 'warn'], // Only show errors and warnings
143
- formatter: (entry) => {
144
- return `[${entry.timestamp.toLocaleTimeString()}] ${entry.message}`;
145
- }
146
- });
179
+ position: 'bottom-left',
180
+ backgroundColor: 'rgba(0, 20, 40, 0.95)',
181
+ textColor: '#00ff88',
182
+ fontSize: '18px',
183
+ maxEntries: 50,
184
+ logLevels: ['error', 'warn'], // Only show errors and warnings
185
+ formatter: entry => {
186
+ return `[${entry.timestamp.toLocaleTimeString()}] ${entry.message}`
187
+ },
188
+ })
147
189
 
148
190
  // Show console when app starts
149
- tvConsole.show();
191
+ tvConsole.show()
150
192
  ```
151
193
 
152
194
  ### TV Remote Control Support
@@ -155,22 +197,22 @@ The TV Console includes built-in support for TV remote controls and keyboard nav
155
197
 
156
198
  ```typescript
157
199
  const tvConsole = new TVConsole({
158
- focusKey: '12345', // Key combination to focus console
159
- unfocusKey: 'Escape', // Key to unfocus console
160
- enableKeyboardNav: true, // Enable arrow key scrolling
161
- showFocusIndicator: true, // Show green border when focused
162
- onFocus: () => {
163
- console.log('Console gained focus - pausing app functionality');
164
- // Handle focus gain (e.g., pause app, show instructions)
165
- },
166
- onUnfocus: () => {
167
- console.log('Console lost focus - returning to app');
168
- // Handle focus loss (e.g., resume app functionality)
169
- }
170
- });
200
+ focusKey: '12345', // Key sequence to focus console (ignored when hidden)
201
+ unfocusKey: 'Escape', // Key to unfocus console
202
+ enableKeyboardNav: true, // Enable arrow key scrolling
203
+ showFocusIndicator: true, // Show subtle outline when focused
204
+ onFocus: () => {
205
+ // Handle focus gain (e.g., pause app, show instructions)
206
+ },
207
+ onUnfocus: () => {
208
+ // Handle focus loss (e.g., resume app functionality)
209
+ // Previously focused host element is restored automatically
210
+ },
211
+ })
171
212
  ```
172
213
 
173
214
  **Keyboard Navigation (when focused):**
215
+
174
216
  - `Arrow Up/Down` - Scroll up/down by 20px
175
217
  - `Page Up/Down` - Scroll up/down by one page
176
218
  - `Home` - Scroll to top
@@ -178,26 +220,28 @@ const tvConsole = new TVConsole({
178
220
  - `Escape` - Unfocus console
179
221
 
180
222
  **Focus Management:**
181
- - Type `12345` (or your custom key combination) to focus the console
182
- - When focused, the console shows a green border indicator
223
+
224
+ - Type `12345` (or your custom key combination) to focus the console only works when the console is visible
225
+ - When focused, the console shows a subtle outline indicator (no layout shift)
226
+ - On focus, the library captures the host application's currently focused element
183
227
  - Use arrow keys to scroll through log history
184
- - Press `Escape` to unfocus and return to your app
228
+ - Press `Escape` to unfocus the previously focused host element regains focus automatically
185
229
 
186
230
  ### Conditional Console
187
231
 
188
232
  ```typescript
189
- import { TVConsole } from 'tv-console';
233
+ import { TVConsole } from 'tv-console'
190
234
 
191
235
  // Only enable in development
192
- const isDevelopment = process.env.NODE_ENV === 'development';
236
+ const isDevelopment = process.env.NODE_ENV === 'development'
193
237
  const tvConsole = new TVConsole({
194
- enabled: isDevelopment,
195
- position: 'top-right'
196
- });
238
+ enabled: isDevelopment,
239
+ position: 'top-right',
240
+ })
197
241
 
198
242
  // Conditionally show console
199
243
  if (isDevelopment) {
200
- tvConsole.show();
244
+ tvConsole.show()
201
245
  }
202
246
  ```
203
247
 
@@ -206,28 +250,29 @@ if (isDevelopment) {
206
250
  ```css
207
251
  /* Custom CSS for the console overlay */
208
252
  .tv-console {
209
- border: 2px solid #00ff00;
210
- border-radius: 8px;
211
- font-family: 'Courier New', monospace;
253
+ border: 2px solid #00ff00;
254
+ border-radius: 8px;
255
+ font-family: 'Courier New', monospace;
212
256
  }
213
257
 
214
258
  .tv-console-error {
215
- color: #ff4444;
216
- font-weight: bold;
259
+ color: #ff4444;
260
+ font-weight: bold;
217
261
  }
218
262
 
219
263
  .tv-console-warn {
220
- color: #ffaa00;
264
+ color: #ffaa00;
221
265
  }
222
266
 
223
267
  .tv-console-info {
224
- color: #44aaff;
268
+ color: #44aaff;
225
269
  }
226
270
  ```
227
271
 
228
272
  ## Browser Support
229
273
 
230
274
  This package works in all modern browsers that support:
275
+
231
276
  - ES2020 features
232
277
  - DOM manipulation
233
278
  - CSS Grid/Flexbox
@@ -246,9 +291,18 @@ MIT
246
291
 
247
292
  ## Changelog
248
293
 
294
+ ### 1.0.3
295
+
296
+ - Focus memory: host application's focused element is captured on console focus and restored on unfocus or destroy
297
+ - Focus visibility guard: focus key sequence is ignored when the console is hidden
298
+ - Outline-based focus indicator: replaced green border/glow with `outline: 2px solid currentColor` (no layout shift)
299
+ - Lifecycle cleanup: `destroy()` now restores focus memory and removes all document event listeners
300
+ - `setConfig({ enabled })` transitions: switching `enabled` from `true→false` calls `destroy()`; `false→true` calls `initialize()`
301
+
249
302
  ### 1.0.0
303
+
250
304
  - Initial release
251
305
  - Basic console overlay functionality
252
306
  - Configurable styling and positioning
253
307
  - Log level filtering
254
- - Export functionality
308
+ - Export functionality
package/dist/index.d.ts CHANGED
@@ -79,6 +79,8 @@ declare class TVConsole implements TVConsoleInstance {
79
79
  private _isFocused;
80
80
  private keyBuffer;
81
81
  private keyBufferTimeout;
82
+ private previouslyFocusedElement;
83
+ private boundKeyDownHandler;
82
84
  constructor(config?: TVConsoleConfig);
83
85
  private initialize;
84
86
  private createContainer;
package/dist/index.esm.js CHANGED
@@ -76,6 +76,18 @@ class TVConsole {
76
76
  writable: true,
77
77
  value: null
78
78
  });
79
+ Object.defineProperty(this, "previouslyFocusedElement", {
80
+ enumerable: true,
81
+ configurable: true,
82
+ writable: true,
83
+ value: null
84
+ });
85
+ Object.defineProperty(this, "boundKeyDownHandler", {
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true,
89
+ value: null
90
+ });
79
91
  this.config = { ...DEFAULT_CONFIG, ...config };
80
92
  this.originalConsole = console;
81
93
  this.initialize();
@@ -216,9 +228,8 @@ class TVConsole {
216
228
  return div.innerHTML;
217
229
  }
218
230
  setupKeyboardListeners() {
219
- document.addEventListener('keydown', (event) => {
220
- this.handleKeyDown(event);
221
- });
231
+ this.boundKeyDownHandler = (event) => this.handleKeyDown(event);
232
+ document.addEventListener('keydown', this.boundKeyDownHandler);
222
233
  }
223
234
  handleKeyDown(event) {
224
235
  // Handle focus key combination
@@ -316,28 +327,32 @@ class TVConsole {
316
327
  }
317
328
  }
318
329
  focus() {
319
- if (!this.container || this._isFocused)
330
+ if (!this.container || this._isFocused || !this.isVisible)
320
331
  return;
332
+ this.previouslyFocusedElement = document.activeElement;
321
333
  this._isFocused = true;
322
334
  this.container.focus();
323
335
  if (this.config.showFocusIndicator) {
324
- this.container.style.border = '2px solid #00ff00';
325
- this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';
336
+ this.container.style.outline = '2px solid currentColor';
326
337
  }
327
338
  // Call onFocus callback if provided
328
339
  if (this.config.onFocus) {
329
340
  this.config.onFocus();
330
341
  }
331
- console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');
332
342
  }
333
343
  unfocus() {
334
344
  if (!this.container || !this._isFocused)
335
345
  return;
336
346
  this._isFocused = false;
337
347
  this.container.blur();
348
+ if (this.previouslyFocusedElement &&
349
+ document.body.contains(this.previouslyFocusedElement) &&
350
+ this.previouslyFocusedElement instanceof HTMLElement) {
351
+ this.previouslyFocusedElement.focus();
352
+ }
353
+ this.previouslyFocusedElement = null;
338
354
  if (this.config.showFocusIndicator) {
339
- this.container.style.border = '';
340
- this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';
355
+ this.container.style.outline = 'none';
341
356
  }
342
357
  // Call onUnfocus callback if provided
343
358
  if (this.config.onUnfocus) {
@@ -348,6 +363,11 @@ class TVConsole {
348
363
  return this._isFocused;
349
364
  }
350
365
  destroy() {
366
+ this.unfocus();
367
+ if (this.boundKeyDownHandler) {
368
+ document.removeEventListener('keydown', this.boundKeyDownHandler);
369
+ this.boundKeyDownHandler = null;
370
+ }
351
371
  if (this.container) {
352
372
  document.body.removeChild(this.container);
353
373
  this.container = null;
@@ -359,7 +379,16 @@ class TVConsole {
359
379
  return [...this.logs];
360
380
  }
361
381
  setConfig(config) {
382
+ const wasEnabled = this.config.enabled;
362
383
  this.config = { ...this.config, ...config };
384
+ if (wasEnabled && !this.config.enabled) {
385
+ this.destroy();
386
+ return;
387
+ }
388
+ if (!wasEnabled && this.config.enabled) {
389
+ this.initialize();
390
+ return;
391
+ }
363
392
  if (this.container) {
364
393
  this.container.style.cssText = `
365
394
  position: fixed;
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n document.addEventListener('keydown', (event) => {\n this.handleKeyDown(event);\n });\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused) return;\n \n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '2px solid #00ff00';\n this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n \n console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '';\n this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';\n }\n \n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n \n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n this.config = { ...this.config, ...config };\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":[],"mappings":"AAEA,MAAM,cAAc,GAA8B;AAChD,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,UAAU,EAAE,GAAG;AACf,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,eAAe,EAAE,oBAAoB;AACrC,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,OAAO,EAAE,GAAG;AACZ,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;AACpD,IAAA,SAAS,EAAE,CAAC,KAAe,KAAI;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;QACvD,MAAM,KAAK,GAAiC,CAAI,CAAA,EAAA,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG,CAAK,CAAC;AAClF,QAAA,MAAM,MAAM,GAAkC,CAAA,CAAA,EAAI,SAAS,CAAG,CAAA,CAAA,CAAK,CAAC;AACpE,QAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,IAAI,EAAE,CAAC;KACrD;AACD,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,OAAO,EAAE,MAAK,GAAG;AACjB,IAAA,SAAS,EAAE,MAAK,GAAG;AACnB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,kBAAkB,EAAE,IAAI;CACzB,CAAC;MAEW,SAAS,CAAA;AAUpB,IAAA,WAAA,CAAY,SAA0B,EAAE,EAAA;AAThC,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,QAAA,EAAA;;;;;AAAkC,SAAA,CAAA,CAAA;AAClC,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,MAAA,EAAA;;;;mBAAmB,EAAE;AAAC,SAAA,CAAA,CAAA;AACtB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;;;mBAAmC,IAAI;AAAC,SAAA,CAAA,CAAA;AACxC,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;;;mBAAY,KAAK;AAAC,SAAA,CAAA,CAAA;AAClB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,iBAAA,EAAA;;;;;AAAyB,SAAA,CAAA,CAAA;AACzB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;;;mBAAa,KAAK;AAAC,SAAA,CAAA,CAAA;AACnB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;;;mBAAY,EAAE;AAAC,SAAA,CAAA,CAAA;AACf,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,kBAAA,EAAA;;;;mBAAkC,IAAI;AAAC,SAAA,CAAA,CAAA;QAG7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IAEO,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAEjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;KACf;IAEO,eAAe,GAAA;QACrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;QAE3B,IAAI,CAAC,iBAAiB,EAAE,CAAA;eACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;gBAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;0BACR,IAAI,CAAC,MAAM,CAAC,eAAe,CAAA;eACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA;;mBAEjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;;;;iBAItB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;iBAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;;;;;;KAM/B,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;KAC3C;IAEO,iBAAiB,GAAA;AACvB,QAAA,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC1B,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,wBAAwB,CAAC;AAClC,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,yBAAyB,CAAC;AACnC,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,2BAA2B,CAAC;AACrC,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,4BAA4B,CAAC;AACtC,YAAA;AACE,gBAAA,OAAO,yBAAyB,CAAC;SACpC;KACF;IAEO,gBAAgB,GAAA;AACtB,QAAA,MAAM,OAAO,GAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAEtE,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAW,KAAI;;gBAEhD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;;gBAG3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAC/B,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,MAAM,CAAC,KAAe,EAAE,GAAG,IAAW,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAClE,OAAO;SACR;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,QAAA,MAAM,KAAK,GAAa;YACtB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,KAAK;YACL,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,GAAG,SAAS;SACzD,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;AAGtB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAC7C,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;SACtD;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;KACf;AAEO,IAAA,cAAc,CAAC,GAAQ,EAAA;QAC7B,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,MAAM,CAAC;QAChC,IAAI,GAAG,KAAK,SAAS;AAAE,YAAA,OAAO,WAAW,CAAC;;AAG1C,QAAA,IAAI,GAAG,YAAY,KAAK,EAAE;YACxB,OAAO,CAAA,OAAA,EAAU,GAAG,CAAC,OAAO,CAAA,SAAA,EAAY,GAAG,CAAC,KAAK,IAAI,0BAA0B,CAAA,CAAE,CAAC;SACnF;;AAGD,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,YAAA,IAAI;;gBAEF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aACrC;AAAC,YAAA,MAAM;;AAEN,gBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;AAC9D,oBAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACvB;;gBAGD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,gBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnB,OAAO,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;iBACjD;qBAAM;AACL,oBAAA,OAAO,gBAAgB,CAAC;iBACzB;aACF;SACF;;AAGD,QAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;AAC7B,YAAA,OAAO,cAAc,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC;SACjD;;AAGD,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;KACpB;IAEO,MAAM,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAC1C,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,IAAG;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7C,YAAA,MAAM,UAAU,GAAG,CAAA,WAAA,EAAc,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7C,OAAO,CAAA,YAAA,EAAe,UAAU,CAAA,EAAA,EAAK,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA,MAAA,CAAQ,CAAC;AAC1E,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;QAGlD,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;KACxD;AAEO,IAAA,UAAU,CAAC,IAAY,EAAA;QAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC1C,QAAA,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;QACvB,OAAO,GAAG,CAAC,SAAS,CAAC;KACtB;IAEO,sBAAsB,GAAA;QAC5B,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAI;AAC7C,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC5B,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,aAAa,CAAC,KAAoB,EAAA;;AAExC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC;;AAG5B,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,gBAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACrC;YACD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AAC7C,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;aACrB,EAAE,IAAI,CAAC,CAAC;;AAGT,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;gBACjD,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;gBACpB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;aACR;SACF;;QAGD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;YACrF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACR;;AAGD,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,EAAE;AACtE,YAAA,QAAQ,KAAK,CAAC,GAAG;AACf,gBAAA,KAAK,SAAS;AACZ,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM;AACR,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM;AACR,gBAAA,KAAK,QAAQ;oBACX,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBACxD,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM;AACR,gBAAA,KAAK,UAAU;oBACb,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBACxD,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM;AACR,gBAAA,KAAK,MAAM;AACT,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;oBAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM;AACR,gBAAA,KAAK,KAAK;oBACR,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBACvD,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM;aACT;SACF;KACF;;IAGD,GAAG,CAAC,GAAG,IAAW,EAAA;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KAC7B;IAED,IAAI,CAAC,GAAG,IAAW,EAAA;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;KAC9B;IAED,IAAI,CAAC,GAAG,IAAW,EAAA;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;KAC9B;IAED,KAAK,CAAC,GAAG,IAAW,EAAA;QAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;KAC/B;IAED,KAAK,CAAC,GAAG,IAAW,EAAA;QAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;KAC/B;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,EAAE,CAAC;KACf;IAED,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACvC,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;SACvB;KACF;IAED,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACtC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;SACxB;KACF;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;aAAM;YACL,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;KACF;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;AAE/C,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;YAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,mBAAmB,CAAC;YAClD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,+BAA+B,CAAC;SAClE;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SACvB;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;KACjF;IAED,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;AAEhD,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AAEtB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;YAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,+BAA+B,CAAC;SAClE;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;SACzB;KACF;IAED,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;IAED,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;SACvB;;QAGD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;KAC9C;IAED,OAAO,GAAA;AACL,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;KACvB;AAED,IAAA,SAAS,CAAC,MAAgC,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAE5C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;UAE3B,IAAI,CAAC,iBAAiB,EAAE,CAAA;iBACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;kBAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;4BACR,IAAI,CAAC,MAAM,CAAC,eAAe,CAAA;iBACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA;;qBAEjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;;;;mBAItB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;mBAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;mBACnB,IAAI,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;;;;;OAK7C,CAAC;AACF,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;SAClE;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;KACf;IAED,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAG;YACzB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAC9C,YAAA,OAAO,CAAI,CAAA,EAAA,SAAS,CAAM,GAAA,EAAA,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAK,EAAA,EAAA,GAAG,CAAC,OAAO,EAAE,CAAC;AACtE,SAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACf;AACF;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n private previouslyFocusedElement: Element | null = null;\n private boundKeyDownHandler: ((event: KeyboardEvent) => void) | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n this.boundKeyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n document.addEventListener('keydown', this.boundKeyDownHandler);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused || !this.isVisible) return;\n\n this.previouslyFocusedElement = document.activeElement;\n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.outline = '2px solid currentColor';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n\n if (this.previouslyFocusedElement &&\n document.body.contains(this.previouslyFocusedElement) &&\n this.previouslyFocusedElement instanceof HTMLElement) {\n this.previouslyFocusedElement.focus();\n }\n this.previouslyFocusedElement = null;\n\n if (this.config.showFocusIndicator) {\n this.container.style.outline = 'none';\n }\n\n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n this.unfocus();\n\n if (this.boundKeyDownHandler) {\n document.removeEventListener('keydown', this.boundKeyDownHandler);\n this.boundKeyDownHandler = null;\n }\n\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n\n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n const wasEnabled = this.config.enabled;\n this.config = { ...this.config, ...config };\n\n if (wasEnabled && !this.config.enabled) {\n this.destroy();\n return;\n }\n\n if (!wasEnabled && this.config.enabled) {\n this.initialize();\n return;\n }\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -80,6 +80,18 @@ class TVConsole {
80
80
  writable: true,
81
81
  value: null
82
82
  });
83
+ Object.defineProperty(this, "previouslyFocusedElement", {
84
+ enumerable: true,
85
+ configurable: true,
86
+ writable: true,
87
+ value: null
88
+ });
89
+ Object.defineProperty(this, "boundKeyDownHandler", {
90
+ enumerable: true,
91
+ configurable: true,
92
+ writable: true,
93
+ value: null
94
+ });
83
95
  this.config = { ...DEFAULT_CONFIG, ...config };
84
96
  this.originalConsole = console;
85
97
  this.initialize();
@@ -220,9 +232,8 @@ class TVConsole {
220
232
  return div.innerHTML;
221
233
  }
222
234
  setupKeyboardListeners() {
223
- document.addEventListener('keydown', (event) => {
224
- this.handleKeyDown(event);
225
- });
235
+ this.boundKeyDownHandler = (event) => this.handleKeyDown(event);
236
+ document.addEventListener('keydown', this.boundKeyDownHandler);
226
237
  }
227
238
  handleKeyDown(event) {
228
239
  // Handle focus key combination
@@ -320,28 +331,32 @@ class TVConsole {
320
331
  }
321
332
  }
322
333
  focus() {
323
- if (!this.container || this._isFocused)
334
+ if (!this.container || this._isFocused || !this.isVisible)
324
335
  return;
336
+ this.previouslyFocusedElement = document.activeElement;
325
337
  this._isFocused = true;
326
338
  this.container.focus();
327
339
  if (this.config.showFocusIndicator) {
328
- this.container.style.border = '2px solid #00ff00';
329
- this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';
340
+ this.container.style.outline = '2px solid currentColor';
330
341
  }
331
342
  // Call onFocus callback if provided
332
343
  if (this.config.onFocus) {
333
344
  this.config.onFocus();
334
345
  }
335
- console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');
336
346
  }
337
347
  unfocus() {
338
348
  if (!this.container || !this._isFocused)
339
349
  return;
340
350
  this._isFocused = false;
341
351
  this.container.blur();
352
+ if (this.previouslyFocusedElement &&
353
+ document.body.contains(this.previouslyFocusedElement) &&
354
+ this.previouslyFocusedElement instanceof HTMLElement) {
355
+ this.previouslyFocusedElement.focus();
356
+ }
357
+ this.previouslyFocusedElement = null;
342
358
  if (this.config.showFocusIndicator) {
343
- this.container.style.border = '';
344
- this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';
359
+ this.container.style.outline = 'none';
345
360
  }
346
361
  // Call onUnfocus callback if provided
347
362
  if (this.config.onUnfocus) {
@@ -352,6 +367,11 @@ class TVConsole {
352
367
  return this._isFocused;
353
368
  }
354
369
  destroy() {
370
+ this.unfocus();
371
+ if (this.boundKeyDownHandler) {
372
+ document.removeEventListener('keydown', this.boundKeyDownHandler);
373
+ this.boundKeyDownHandler = null;
374
+ }
355
375
  if (this.container) {
356
376
  document.body.removeChild(this.container);
357
377
  this.container = null;
@@ -363,7 +383,16 @@ class TVConsole {
363
383
  return [...this.logs];
364
384
  }
365
385
  setConfig(config) {
386
+ const wasEnabled = this.config.enabled;
366
387
  this.config = { ...this.config, ...config };
388
+ if (wasEnabled && !this.config.enabled) {
389
+ this.destroy();
390
+ return;
391
+ }
392
+ if (!wasEnabled && this.config.enabled) {
393
+ this.initialize();
394
+ return;
395
+ }
367
396
  if (this.container) {
368
397
  this.container.style.cssText = `
369
398
  position: fixed;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n document.addEventListener('keydown', (event) => {\n this.handleKeyDown(event);\n });\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused) return;\n \n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '2px solid #00ff00';\n this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n \n console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '';\n this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';\n }\n \n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n \n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n this.config = { ...this.config, ...config };\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n private previouslyFocusedElement: Element | null = null;\n private boundKeyDownHandler: ((event: KeyboardEvent) => void) | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n this.boundKeyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n document.addEventListener('keydown', this.boundKeyDownHandler);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused || !this.isVisible) return;\n\n this.previouslyFocusedElement = document.activeElement;\n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.outline = '2px solid currentColor';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n\n if (this.previouslyFocusedElement &&\n document.body.contains(this.previouslyFocusedElement) &&\n this.previouslyFocusedElement instanceof HTMLElement) {\n this.previouslyFocusedElement.focus();\n }\n this.previouslyFocusedElement = null;\n\n if (this.config.showFocusIndicator) {\n this.container.style.outline = 'none';\n }\n\n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n this.unfocus();\n\n if (this.boundKeyDownHandler) {\n document.removeEventListener('keydown', this.boundKeyDownHandler);\n this.boundKeyDownHandler = null;\n }\n\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n\n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n const wasEnabled = this.config.enabled;\n this.config = { ...this.config, ...config };\n\n if (wasEnabled && !this.config.enabled) {\n this.destroy();\n return;\n }\n\n if (!wasEnabled && this.config.enabled) {\n this.initialize();\n return;\n }\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":[],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -82,6 +82,18 @@
82
82
  writable: true,
83
83
  value: null
84
84
  });
85
+ Object.defineProperty(this, "previouslyFocusedElement", {
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true,
89
+ value: null
90
+ });
91
+ Object.defineProperty(this, "boundKeyDownHandler", {
92
+ enumerable: true,
93
+ configurable: true,
94
+ writable: true,
95
+ value: null
96
+ });
85
97
  this.config = { ...DEFAULT_CONFIG, ...config };
86
98
  this.originalConsole = console;
87
99
  this.initialize();
@@ -222,9 +234,8 @@
222
234
  return div.innerHTML;
223
235
  }
224
236
  setupKeyboardListeners() {
225
- document.addEventListener('keydown', (event) => {
226
- this.handleKeyDown(event);
227
- });
237
+ this.boundKeyDownHandler = (event) => this.handleKeyDown(event);
238
+ document.addEventListener('keydown', this.boundKeyDownHandler);
228
239
  }
229
240
  handleKeyDown(event) {
230
241
  // Handle focus key combination
@@ -322,28 +333,32 @@
322
333
  }
323
334
  }
324
335
  focus() {
325
- if (!this.container || this._isFocused)
336
+ if (!this.container || this._isFocused || !this.isVisible)
326
337
  return;
338
+ this.previouslyFocusedElement = document.activeElement;
327
339
  this._isFocused = true;
328
340
  this.container.focus();
329
341
  if (this.config.showFocusIndicator) {
330
- this.container.style.border = '2px solid #00ff00';
331
- this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';
342
+ this.container.style.outline = '2px solid currentColor';
332
343
  }
333
344
  // Call onFocus callback if provided
334
345
  if (this.config.onFocus) {
335
346
  this.config.onFocus();
336
347
  }
337
- console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');
338
348
  }
339
349
  unfocus() {
340
350
  if (!this.container || !this._isFocused)
341
351
  return;
342
352
  this._isFocused = false;
343
353
  this.container.blur();
354
+ if (this.previouslyFocusedElement &&
355
+ document.body.contains(this.previouslyFocusedElement) &&
356
+ this.previouslyFocusedElement instanceof HTMLElement) {
357
+ this.previouslyFocusedElement.focus();
358
+ }
359
+ this.previouslyFocusedElement = null;
344
360
  if (this.config.showFocusIndicator) {
345
- this.container.style.border = '';
346
- this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';
361
+ this.container.style.outline = 'none';
347
362
  }
348
363
  // Call onUnfocus callback if provided
349
364
  if (this.config.onUnfocus) {
@@ -354,6 +369,11 @@
354
369
  return this._isFocused;
355
370
  }
356
371
  destroy() {
372
+ this.unfocus();
373
+ if (this.boundKeyDownHandler) {
374
+ document.removeEventListener('keydown', this.boundKeyDownHandler);
375
+ this.boundKeyDownHandler = null;
376
+ }
357
377
  if (this.container) {
358
378
  document.body.removeChild(this.container);
359
379
  this.container = null;
@@ -365,7 +385,16 @@
365
385
  return [...this.logs];
366
386
  }
367
387
  setConfig(config) {
388
+ const wasEnabled = this.config.enabled;
368
389
  this.config = { ...this.config, ...config };
390
+ if (wasEnabled && !this.config.enabled) {
391
+ this.destroy();
392
+ return;
393
+ }
394
+ if (!wasEnabled && this.config.enabled) {
395
+ this.initialize();
396
+ return;
397
+ }
369
398
  if (this.container) {
370
399
  this.container.style.cssText = `
371
400
  position: fixed;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n document.addEventListener('keydown', (event) => {\n this.handleKeyDown(event);\n });\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused) return;\n \n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '2px solid #00ff00';\n this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n \n console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '';\n this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';\n }\n \n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n \n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n this.config = { ...this.config, ...config };\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":[],"mappings":";;;;;;IAEA,MAAM,cAAc,GAA8B;IAChD,IAAA,OAAO,EAAE,IAAI;IACb,IAAA,UAAU,EAAE,GAAG;IACf,IAAA,QAAQ,EAAE,WAAW;IACrB,IAAA,KAAK,EAAE,OAAO;IACd,IAAA,MAAM,EAAE,OAAO;IACf,IAAA,eAAe,EAAE,oBAAoB;IACrC,IAAA,SAAS,EAAE,SAAS;IACpB,IAAA,QAAQ,EAAE,MAAM;IAChB,IAAA,OAAO,EAAE,GAAG;IACZ,IAAA,aAAa,EAAE,IAAI;IACnB,IAAA,SAAS,EAAE,YAAY;IACvB,IAAA,MAAM,EAAE,IAAI;IACZ,IAAA,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IACpD,IAAA,SAAS,EAAE,CAAC,KAAe,KAAI;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;YACvD,MAAM,KAAK,GAAiC,CAAI,CAAA,EAAA,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG,CAAK,CAAC;IAClF,QAAA,MAAM,MAAM,GAAkC,CAAA,CAAA,EAAI,SAAS,CAAG,CAAA,CAAA,CAAK,CAAC;IACpE,QAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,KAAK,CAAC,OAAO,CAAE,CAAA,CAAC,IAAI,EAAE,CAAC;SACrD;IACD,IAAA,QAAQ,EAAE,OAAO;IACjB,IAAA,UAAU,EAAE,QAAQ;IACpB,IAAA,OAAO,EAAE,MAAK,GAAG;IACjB,IAAA,SAAS,EAAE,MAAK,GAAG;IACnB,IAAA,iBAAiB,EAAE,IAAI;IACvB,IAAA,kBAAkB,EAAE,IAAI;KACzB,CAAC;UAEW,SAAS,CAAA;IAUpB,IAAA,WAAA,CAAY,SAA0B,EAAE,EAAA;IAThC,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,QAAA,EAAA;;;;;IAAkC,SAAA,CAAA,CAAA;IAClC,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,MAAA,EAAA;;;;uBAAmB,EAAE;IAAC,SAAA,CAAA,CAAA;IACtB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;;;uBAAmC,IAAI;IAAC,SAAA,CAAA,CAAA;IACxC,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;;;uBAAY,KAAK;IAAC,SAAA,CAAA,CAAA;IAClB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,iBAAA,EAAA;;;;;IAAyB,SAAA,CAAA,CAAA;IACzB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;;;uBAAa,KAAK;IAAC,SAAA,CAAA,CAAA;IACnB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;;;uBAAY,EAAE;IAAC,SAAA,CAAA,CAAA;IACf,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,kBAAA,EAAA;;;;uBAAkC,IAAI;IAAC,SAAA,CAAA,CAAA;YAG7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/C,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;YAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;SACnB;QAEO,UAAU,GAAA;IAChB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAEjC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;SACf;QAEO,eAAe,GAAA;YACrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IACjD,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;QAE3B,IAAI,CAAC,iBAAiB,EAAE,CAAA;eACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;gBAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;0BACR,IAAI,CAAC,MAAM,CAAC,eAAe,CAAA;eACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA;;mBAEjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;;;;iBAItB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;iBAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;;;;;;KAM/B,CAAC;YAEF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC3C;QAEO,iBAAiB,GAAA;IACvB,QAAA,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ;IAC1B,YAAA,KAAK,UAAU;IACb,gBAAA,OAAO,wBAAwB,CAAC;IAClC,YAAA,KAAK,WAAW;IACd,gBAAA,OAAO,yBAAyB,CAAC;IACnC,YAAA,KAAK,aAAa;IAChB,gBAAA,OAAO,2BAA2B,CAAC;IACrC,YAAA,KAAK,cAAc;IACjB,gBAAA,OAAO,4BAA4B,CAAC;IACtC,YAAA;IACE,gBAAA,OAAO,yBAAyB,CAAC;aACpC;SACF;QAEO,gBAAgB,GAAA;IACtB,QAAA,MAAM,OAAO,GAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtE,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;gBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAW,KAAI;;oBAEhD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;;oBAG3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/B,aAAC,CAAC;IACJ,SAAC,CAAC,CAAC;SACJ;IAEO,IAAA,MAAM,CAAC,KAAe,EAAE,GAAG,IAAW,EAAA;IAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAClE,OAAO;aACR;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpE,QAAA,MAAM,KAAK,GAAa;gBACtB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnE,KAAK;gBACL,OAAO;gBACP,SAAS,EAAE,IAAI,IAAI,EAAE;IACrB,YAAA,IAAI,EAAE,IAAI;IACV,YAAA,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,GAAG,SAAS;aACzD,CAAC;IAEF,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;IAGtB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;IAC7C,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aACtD;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;SACf;IAEO,IAAA,cAAc,CAAC,GAAQ,EAAA;YAC7B,IAAI,GAAG,KAAK,IAAI;IAAE,YAAA,OAAO,MAAM,CAAC;YAChC,IAAI,GAAG,KAAK,SAAS;IAAE,YAAA,OAAO,WAAW,CAAC;;IAG1C,QAAA,IAAI,GAAG,YAAY,KAAK,EAAE;gBACxB,OAAO,CAAA,OAAA,EAAU,GAAG,CAAC,OAAO,CAAA,SAAA,EAAY,GAAG,CAAC,KAAK,IAAI,0BAA0B,CAAA,CAAE,CAAC;aACnF;;IAGD,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;IAC3B,YAAA,IAAI;;oBAEF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;iBACrC;IAAC,YAAA,MAAM;;IAEN,gBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;IAC9D,oBAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;qBACvB;;oBAGD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,gBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;wBACnB,OAAO,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;qBACjD;yBAAM;IACL,oBAAA,OAAO,gBAAgB,CAAC;qBACzB;iBACF;aACF;;IAGD,QAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;IAC7B,YAAA,OAAO,cAAc,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC;aACjD;;IAGD,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;SACpB;QAEO,MAAM,GAAA;YACZ,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAC1C,CAAC;YAEF,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,IAAG;gBAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7C,YAAA,MAAM,UAAU,GAAG,CAAA,WAAA,EAAc,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7C,OAAO,CAAA,YAAA,EAAe,UAAU,CAAA,EAAA,EAAK,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA,MAAA,CAAQ,CAAC;IAC1E,SAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;YAGlD,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;SACxD;IAEO,IAAA,UAAU,CAAC,IAAY,EAAA;YAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,QAAA,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;YACvB,OAAO,GAAG,CAAC,SAAS,CAAC;SACtB;QAEO,sBAAsB,GAAA;YAC5B,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAI;IAC7C,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,SAAC,CAAC,CAAC;SACJ;IAEO,IAAA,aAAa,CAAC,KAAoB,EAAA;;IAExC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACxB,YAAA,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC;;IAG5B,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;IACzB,gBAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBACrC;gBACD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;IAC7C,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;iBACrB,EAAE,IAAI,CAAC,CAAC;;IAGT,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACjD,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;oBACpB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO;iBACR;aACF;;YAGD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;gBACrF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;aACR;;IAGD,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,EAAE;IACtE,YAAA,QAAQ,KAAK,CAAC,GAAG;IACf,gBAAA,KAAK,SAAS;IACZ,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;wBAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM;IACR,gBAAA,KAAK,WAAW;IACd,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;wBAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM;IACR,gBAAA,KAAK,QAAQ;wBACX,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;wBACxD,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM;IACR,gBAAA,KAAK,UAAU;wBACb,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;wBACxD,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM;IACR,gBAAA,KAAK,MAAM;IACT,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;wBAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM;IACR,gBAAA,KAAK,KAAK;wBACR,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;wBACvD,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM;iBACT;aACF;SACF;;QAGD,GAAG,CAAC,GAAG,IAAW,EAAA;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;SAC7B;QAED,IAAI,CAAC,GAAG,IAAW,EAAA;YACjB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,GAAG,IAAW,EAAA;YACjB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;SAC9B;QAED,KAAK,CAAC,GAAG,IAAW,EAAA;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;SAC/B;QAED,KAAK,CAAC,GAAG,IAAW,EAAA;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;SAC/B;QAED,KAAK,GAAA;IACH,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,EAAE,CAAC;SACf;QAED,IAAI,GAAA;IACF,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACvC,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;aACvB;SACF;QAED,IAAI,GAAA;IACF,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACtC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;SACF;QAED,MAAM,GAAA;IACJ,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,IAAI,EAAE,CAAC;aACb;iBAAM;gBACL,IAAI,CAAC,IAAI,EAAE,CAAC;aACb;SACF;QAED,KAAK,GAAA;IACH,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU;gBAAE,OAAO;IAE/C,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACvB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAEvB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,mBAAmB,CAAC;gBAClD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,+BAA+B,CAAC;aAClE;;IAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;IACvB,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;aACvB;IAED,QAAA,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;SACjF;QAED,OAAO,GAAA;YACL,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,OAAO;IAEhD,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAEtB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,+BAA+B,CAAC;aAClE;;IAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;IACzB,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;aACzB;SACF;QAED,SAAS,GAAA;YACP,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;QAED,OAAO,GAAA;IACL,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;aACvB;;YAGD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SAC9C;QAED,OAAO,GAAA;IACL,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;SACvB;IAED,IAAA,SAAS,CAAC,MAAgC,EAAA;IACxC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAE5C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;IAClB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;UAE3B,IAAI,CAAC,iBAAiB,EAAE,CAAA;iBACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;kBAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;4BACR,IAAI,CAAC,MAAM,CAAC,eAAe,CAAA;iBACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA;;qBAEjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;;;;mBAItB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;mBAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;mBACnB,IAAI,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;;;;;OAK7C,CAAC;IACF,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aAClE;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;SACf;QAED,UAAU,GAAA;YACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAG;gBACzB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IAC9C,YAAA,OAAO,CAAI,CAAA,EAAA,SAAS,CAAM,GAAA,EAAA,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAK,EAAA,EAAA,GAAG,CAAC,OAAO,EAAE,CAAC;IACtE,SAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACf;IACF;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n private previouslyFocusedElement: Element | null = null;\n private boundKeyDownHandler: ((event: KeyboardEvent) => void) | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n this.boundKeyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n document.addEventListener('keydown', this.boundKeyDownHandler);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused || !this.isVisible) return;\n\n this.previouslyFocusedElement = document.activeElement;\n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.outline = '2px solid currentColor';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n\n if (this.previouslyFocusedElement &&\n document.body.contains(this.previouslyFocusedElement) &&\n this.previouslyFocusedElement instanceof HTMLElement) {\n this.previouslyFocusedElement.focus();\n }\n this.previouslyFocusedElement = null;\n\n if (this.config.showFocusIndicator) {\n this.container.style.outline = 'none';\n }\n\n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n this.unfocus();\n\n if (this.boundKeyDownHandler) {\n document.removeEventListener('keydown', this.boundKeyDownHandler);\n this.boundKeyDownHandler = null;\n }\n\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n\n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n const wasEnabled = this.config.enabled;\n this.config = { ...this.config, ...config };\n\n if (wasEnabled && !this.config.enabled) {\n this.destroy();\n return;\n }\n\n if (!wasEnabled && this.config.enabled) {\n this.initialize();\n return;\n }\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TVConsole={})}(this,function(e){"use strict";const t={enabled:!0,maxEntries:100,position:"top-right",width:"400px",height:"300px",backgroundColor:"rgba(0, 0, 0, 0.8)",textColor:"#ffffff",fontSize:"14px",opacity:.9,showTimestamp:!0,className:"tv-console",zIndex:9999,showLogLevel:!0,logLevels:["log","info","warn","error","debug"],formatter:e=>`${`[${e.timestamp.toLocaleTimeString()}]`} ${`[${e.level.toUpperCase()}]`} ${e.message}`.trim(),focusKey:"12345",unfocusKey:"Escape",onFocus:()=>{},onUnfocus:()=>{},enableKeyboardNav:!0,showFocusIndicator:!0};class i{constructor(e={}){Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"logs",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"container",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isVisible",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"originalConsole",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_isFocused",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"keyBuffer",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"keyBufferTimeout",{enumerable:!0,configurable:!0,writable:!0,value:null}),this.config={...t,...e},this.originalConsole=console,this.initialize()}initialize(){this.config.enabled&&(this.createContainer(),this.interceptConsole(),this.setupKeyboardListeners(),this.render())}createContainer(){this.container=document.createElement("div"),this.container.className=this.config.className,this.container.tabIndex=this.config.enableKeyboardNav?0:-1,this.container.style.cssText=`\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `,document.body.appendChild(this.container)}getPositionStyles(){switch(this.config.position){case"top-left":return"top: 10px; left: 10px;";case"top-right":default:return"top: 10px; right: 10px;";case"bottom-left":return"bottom: 10px; left: 10px;";case"bottom-right":return"bottom: 10px; right: 10px;"}}interceptConsole(){["log","info","warn","error","debug"].forEach(e=>{const t=this.originalConsole[e];this.originalConsole[e]=(...i)=>{t.apply(this.originalConsole,i),this.addLog(e,...i)}})}addLog(e,...t){if(!this.config.enabled||!this.config.logLevels.includes(e))return;const i=t.map(e=>this.formatArgument(e)).join(" "),o={id:Date.now().toString()+Math.random().toString(36).substr(2,9),level:e,message:i,timestamp:new Date,data:t,stack:"error"===e?(new Error).stack:void 0};this.logs.push(o),this.logs.length>this.config.maxEntries&&(this.logs=this.logs.slice(-this.config.maxEntries)),this.render()}formatArgument(e){if(null===e)return"null";if(void 0===e)return"undefined";if(e instanceof Error)return`Error: ${e.message}\nStack: ${e.stack||"No stack trace available"}`;if("object"==typeof e)try{return JSON.stringify(e,null,2)}catch{if(e.toString&&e.toString!==Object.prototype.toString)return e.toString();const t=Object.keys(e);return t.length>0?`[Object with keys: ${t.join(", ")}]`:"[Empty Object]"}return"function"==typeof e?`[Function: ${e.name||"anonymous"}]`:String(e)}render(){if(!this.container)return;const e=this.logs.filter(e=>this.config.logLevels.includes(e.level)).map(e=>{const t=this.config.formatter(e);return`<div class="${`tv-console-${e.level}`}">${this.escapeHtml(t)}</div>`});this.container.innerHTML=e.join(""),this.container.scrollTop=this.container.scrollHeight}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}setupKeyboardListeners(){document.addEventListener("keydown",e=>{this.handleKeyDown(e)})}handleKeyDown(e){if(this.config.focusKey&&(this.keyBuffer+=e.key,this.keyBufferTimeout&&clearTimeout(this.keyBufferTimeout),this.keyBufferTimeout=window.setTimeout(()=>{this.keyBuffer=""},2e3),this.keyBuffer.includes(this.config.focusKey)))return this.focus(),this.keyBuffer="",void e.preventDefault();if(this.config.unfocusKey&&e.key===this.config.unfocusKey&&this._isFocused)return this.unfocus(),void e.preventDefault();if(this._isFocused&&this.config.enableKeyboardNav&&this.container)switch(e.key){case"ArrowUp":this.container.scrollTop-=20,e.preventDefault();break;case"ArrowDown":this.container.scrollTop+=20,e.preventDefault();break;case"PageUp":this.container.scrollTop-=this.container.clientHeight,e.preventDefault();break;case"PageDown":this.container.scrollTop+=this.container.clientHeight,e.preventDefault();break;case"Home":this.container.scrollTop=0,e.preventDefault();break;case"End":this.container.scrollTop=this.container.scrollHeight,e.preventDefault()}}log(...e){this.addLog("log",...e)}info(...e){this.addLog("info",...e)}warn(...e){this.addLog("warn",...e)}error(...e){this.addLog("error",...e)}debug(...e){this.addLog("debug",...e)}clear(){this.logs=[],this.render()}show(){this.container&&(this.container.style.display="block",this.isVisible=!0)}hide(){this.container&&(this.container.style.display="none",this.isVisible=!1)}toggle(){this.isVisible?this.hide():this.show()}focus(){this.container&&!this._isFocused&&(this._isFocused=!0,this.container.focus(),this.config.showFocusIndicator&&(this.container.style.border="2px solid #00ff00",this.container.style.boxShadow="0 0 10px rgba(0, 255, 0, 0.5)"),this.config.onFocus&&this.config.onFocus(),console.log("TV Console focused - Use arrow keys to scroll, Escape to unfocus"))}unfocus(){this.container&&this._isFocused&&(this._isFocused=!1,this.container.blur(),this.config.showFocusIndicator&&(this.container.style.border="",this.container.style.boxShadow="0 2px 10px rgba(0, 0, 0, 0.3)"),this.config.onUnfocus&&this.config.onUnfocus())}isFocused(){return this._isFocused}destroy(){this.container&&(document.body.removeChild(this.container),this.container=null),Object.assign(console,this.originalConsole)}getLogs(){return[...this.logs]}setConfig(e){this.config={...this.config,...e},this.container&&(this.container.style.cssText=`\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible?"block":"none"};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `,this.container.tabIndex=this.config.enableKeyboardNav?0:-1),this.render()}exportLogs(){return this.logs.map(e=>`[${e.timestamp.toISOString()}] [${e.level.toUpperCase()}] ${e.message}`).join("\n")}}e.TVConsole=i,e.default=i,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TVConsole={})}(this,function(e){"use strict";const t={enabled:!0,maxEntries:100,position:"top-right",width:"400px",height:"300px",backgroundColor:"rgba(0, 0, 0, 0.8)",textColor:"#ffffff",fontSize:"14px",opacity:.9,showTimestamp:!0,className:"tv-console",zIndex:9999,showLogLevel:!0,logLevels:["log","info","warn","error","debug"],formatter:e=>`${`[${e.timestamp.toLocaleTimeString()}]`} ${`[${e.level.toUpperCase()}]`} ${e.message}`.trim(),focusKey:"12345",unfocusKey:"Escape",onFocus:()=>{},onUnfocus:()=>{},enableKeyboardNav:!0,showFocusIndicator:!0};class i{constructor(e={}){Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"logs",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"container",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isVisible",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"originalConsole",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_isFocused",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"keyBuffer",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"keyBufferTimeout",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"previouslyFocusedElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"boundKeyDownHandler",{enumerable:!0,configurable:!0,writable:!0,value:null}),this.config={...t,...e},this.originalConsole=console,this.initialize()}initialize(){this.config.enabled&&(this.createContainer(),this.interceptConsole(),this.setupKeyboardListeners(),this.render())}createContainer(){this.container=document.createElement("div"),this.container.className=this.config.className,this.container.tabIndex=this.config.enableKeyboardNav?0:-1,this.container.style.cssText=`\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `,document.body.appendChild(this.container)}getPositionStyles(){switch(this.config.position){case"top-left":return"top: 10px; left: 10px;";case"top-right":default:return"top: 10px; right: 10px;";case"bottom-left":return"bottom: 10px; left: 10px;";case"bottom-right":return"bottom: 10px; right: 10px;"}}interceptConsole(){["log","info","warn","error","debug"].forEach(e=>{const t=this.originalConsole[e];this.originalConsole[e]=(...i)=>{t.apply(this.originalConsole,i),this.addLog(e,...i)}})}addLog(e,...t){if(!this.config.enabled||!this.config.logLevels.includes(e))return;const i=t.map(e=>this.formatArgument(e)).join(" "),o={id:Date.now().toString()+Math.random().toString(36).substr(2,9),level:e,message:i,timestamp:new Date,data:t,stack:"error"===e?(new Error).stack:void 0};this.logs.push(o),this.logs.length>this.config.maxEntries&&(this.logs=this.logs.slice(-this.config.maxEntries)),this.render()}formatArgument(e){if(null===e)return"null";if(void 0===e)return"undefined";if(e instanceof Error)return`Error: ${e.message}\nStack: ${e.stack||"No stack trace available"}`;if("object"==typeof e)try{return JSON.stringify(e,null,2)}catch{if(e.toString&&e.toString!==Object.prototype.toString)return e.toString();const t=Object.keys(e);return t.length>0?`[Object with keys: ${t.join(", ")}]`:"[Empty Object]"}return"function"==typeof e?`[Function: ${e.name||"anonymous"}]`:String(e)}render(){if(!this.container)return;const e=this.logs.filter(e=>this.config.logLevels.includes(e.level)).map(e=>{const t=this.config.formatter(e);return`<div class="${`tv-console-${e.level}`}">${this.escapeHtml(t)}</div>`});this.container.innerHTML=e.join(""),this.container.scrollTop=this.container.scrollHeight}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}setupKeyboardListeners(){this.boundKeyDownHandler=e=>this.handleKeyDown(e),document.addEventListener("keydown",this.boundKeyDownHandler)}handleKeyDown(e){if(this.config.focusKey&&(this.keyBuffer+=e.key,this.keyBufferTimeout&&clearTimeout(this.keyBufferTimeout),this.keyBufferTimeout=window.setTimeout(()=>{this.keyBuffer=""},2e3),this.keyBuffer.includes(this.config.focusKey)))return this.focus(),this.keyBuffer="",void e.preventDefault();if(this.config.unfocusKey&&e.key===this.config.unfocusKey&&this._isFocused)return this.unfocus(),void e.preventDefault();if(this._isFocused&&this.config.enableKeyboardNav&&this.container)switch(e.key){case"ArrowUp":this.container.scrollTop-=20,e.preventDefault();break;case"ArrowDown":this.container.scrollTop+=20,e.preventDefault();break;case"PageUp":this.container.scrollTop-=this.container.clientHeight,e.preventDefault();break;case"PageDown":this.container.scrollTop+=this.container.clientHeight,e.preventDefault();break;case"Home":this.container.scrollTop=0,e.preventDefault();break;case"End":this.container.scrollTop=this.container.scrollHeight,e.preventDefault()}}log(...e){this.addLog("log",...e)}info(...e){this.addLog("info",...e)}warn(...e){this.addLog("warn",...e)}error(...e){this.addLog("error",...e)}debug(...e){this.addLog("debug",...e)}clear(){this.logs=[],this.render()}show(){this.container&&(this.container.style.display="block",this.isVisible=!0)}hide(){this.container&&(this.container.style.display="none",this.isVisible=!1)}toggle(){this.isVisible?this.hide():this.show()}focus(){this.container&&!this._isFocused&&this.isVisible&&(this.previouslyFocusedElement=document.activeElement,this._isFocused=!0,this.container.focus(),this.config.showFocusIndicator&&(this.container.style.outline="2px solid currentColor"),this.config.onFocus&&this.config.onFocus())}unfocus(){this.container&&this._isFocused&&(this._isFocused=!1,this.container.blur(),this.previouslyFocusedElement&&document.body.contains(this.previouslyFocusedElement)&&this.previouslyFocusedElement instanceof HTMLElement&&this.previouslyFocusedElement.focus(),this.previouslyFocusedElement=null,this.config.showFocusIndicator&&(this.container.style.outline="none"),this.config.onUnfocus&&this.config.onUnfocus())}isFocused(){return this._isFocused}destroy(){this.unfocus(),this.boundKeyDownHandler&&(document.removeEventListener("keydown",this.boundKeyDownHandler),this.boundKeyDownHandler=null),this.container&&(document.body.removeChild(this.container),this.container=null),Object.assign(console,this.originalConsole)}getLogs(){return[...this.logs]}setConfig(e){const t=this.config.enabled;this.config={...this.config,...e},!t||this.config.enabled?t||!this.config.enabled?(this.container&&(this.container.style.cssText=`\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible?"block":"none"};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `,this.container.tabIndex=this.config.enableKeyboardNav?0:-1),this.render()):this.initialize():this.destroy()}exportLogs(){return this.logs.map(e=>`[${e.timestamp.toISOString()}] [${e.level.toUpperCase()}] ${e.message}`).join("\n")}}e.TVConsole=i,e.default=i,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=index.umd.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.min.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n document.addEventListener('keydown', (event) => {\n this.handleKeyDown(event);\n });\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused) return;\n \n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '2px solid #00ff00';\n this.container.style.boxShadow = '0 0 10px rgba(0, 255, 0, 0.5)';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n \n console.log('TV Console focused - Use arrow keys to scroll, Escape to unfocus');\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n \n if (this.config.showFocusIndicator) {\n this.container.style.border = '';\n this.container.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';\n }\n \n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n \n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n this.config = { ...this.config, ...config };\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":["DEFAULT_CONFIG","enabled","maxEntries","position","width","height","backgroundColor","textColor","fontSize","opacity","showTimestamp","className","zIndex","showLogLevel","logLevels","formatter","entry","timestamp","toLocaleTimeString","level","toUpperCase","message","trim","focusKey","unfocusKey","onFocus","onUnfocus","enableKeyboardNav","showFocusIndicator","TVConsole","constructor","config","Object","defineProperty","this","originalConsole","console","initialize","createContainer","interceptConsole","setupKeyboardListeners","render","container","document","createElement","tabIndex","style","cssText","getPositionStyles","body","appendChild","forEach","method","original","args","apply","addLog","includes","map","arg","formatArgument","join","id","Date","now","toString","Math","random","substr","data","stack","Error","undefined","logs","push","length","slice","JSON","stringify","prototype","keys","name","String","formattedLogs","filter","log","formatted","escapeHtml","innerHTML","scrollTop","scrollHeight","text","div","textContent","addEventListener","event","handleKeyDown","keyBuffer","key","keyBufferTimeout","clearTimeout","window","setTimeout","focus","preventDefault","_isFocused","unfocus","clientHeight","info","warn","error","debug","clear","show","display","isVisible","hide","toggle","border","boxShadow","blur","isFocused","destroy","removeChild","assign","getLogs","setConfig","exportLogs","toISOString"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.min.js","sources":["../src/tv-console.ts"],"sourcesContent":["import type { TVConsoleConfig, LogLevel, LogEntry, TVConsoleInstance } from './types';\n\nconst DEFAULT_CONFIG: Required<TVConsoleConfig> = {\n enabled: true,\n maxEntries: 100,\n position: 'top-right',\n width: '400px',\n height: '300px',\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n textColor: '#ffffff',\n fontSize: '14px',\n opacity: 0.9,\n showTimestamp: true,\n className: 'tv-console',\n zIndex: 9999,\n showLogLevel: true,\n logLevels: ['log', 'info', 'warn', 'error', 'debug'],\n formatter: (entry: LogEntry) => {\n const timestamp = entry.timestamp.toLocaleTimeString();\n const level = DEFAULT_CONFIG.showLogLevel ? `[${entry.level.toUpperCase()}]` : '';\n const prefix = DEFAULT_CONFIG.showTimestamp ? `[${timestamp}]` : '';\n return `${prefix} ${level} ${entry.message}`.trim();\n },\n focusKey: '12345',\n unfocusKey: 'Escape',\n onFocus: () => {},\n onUnfocus: () => {},\n enableKeyboardNav: true,\n showFocusIndicator: true\n};\n\nexport class TVConsole implements TVConsoleInstance {\n private config: Required<TVConsoleConfig>;\n private logs: LogEntry[] = [];\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private originalConsole: Console;\n private _isFocused = false;\n private keyBuffer = '';\n private keyBufferTimeout: number | null = null;\n private previouslyFocusedElement: Element | null = null;\n private boundKeyDownHandler: ((event: KeyboardEvent) => void) | null = null;\n\n constructor(config: TVConsoleConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.originalConsole = console;\n this.initialize();\n }\n\n private initialize(): void {\n if (!this.config.enabled) return;\n\n this.createContainer();\n this.interceptConsole();\n this.setupKeyboardListeners();\n this.render();\n }\n\n private createContainer(): void {\n this.container = document.createElement('div');\n this.container.className = this.config.className;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: none;\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n\n document.body.appendChild(this.container);\n }\n\n private getPositionStyles(): string {\n switch (this.config.position) {\n case 'top-left':\n return 'top: 10px; left: 10px;';\n case 'top-right':\n return 'top: 10px; right: 10px;';\n case 'bottom-left':\n return 'bottom: 10px; left: 10px;';\n case 'bottom-right':\n return 'bottom: 10px; right: 10px;';\n default:\n return 'top: 10px; right: 10px;';\n }\n }\n\n private interceptConsole(): void {\n const methods: LogLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\n \n methods.forEach(method => {\n const original = this.originalConsole[method];\n this.originalConsole[method] = (...args: any[]) => {\n // Call original console method\n original.apply(this.originalConsole, args);\n \n // Add to TV console\n this.addLog(method, ...args);\n };\n });\n }\n\n private addLog(level: LogLevel, ...args: any[]): void {\n if (!this.config.enabled || !this.config.logLevels.includes(level)) {\n return;\n }\n\n const message = args.map(arg => this.formatArgument(arg)).join(' ');\n const entry: LogEntry = {\n id: Date.now().toString() + Math.random().toString(36).substr(2, 9),\n level,\n message,\n timestamp: new Date(),\n data: args,\n stack: level === 'error' ? new Error().stack : undefined\n };\n\n this.logs.push(entry);\n\n // Keep only the latest entries\n if (this.logs.length > this.config.maxEntries) {\n this.logs = this.logs.slice(-this.config.maxEntries);\n }\n\n this.render();\n }\n\n private formatArgument(arg: any): string {\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n \n // Handle Error objects specifically\n if (arg instanceof Error) {\n return `Error: ${arg.message}\\nStack: ${arg.stack || 'No stack trace available'}`;\n }\n \n // Handle other objects\n if (typeof arg === 'object') {\n try {\n // Try JSON.stringify first\n return JSON.stringify(arg, null, 2);\n } catch {\n // If JSON.stringify fails, try to get a meaningful string representation\n if (arg.toString && arg.toString !== Object.prototype.toString) {\n return arg.toString();\n }\n \n // For objects that don't have a custom toString, show their keys\n const keys = Object.keys(arg);\n if (keys.length > 0) {\n return `[Object with keys: ${keys.join(', ')}]`;\n } else {\n return '[Empty Object]';\n }\n }\n }\n \n // Handle functions\n if (typeof arg === 'function') {\n return `[Function: ${arg.name || 'anonymous'}]`;\n }\n \n // Handle other primitive types\n return String(arg);\n }\n\n private render(): void {\n if (!this.container) return;\n\n const filteredLogs = this.logs.filter(log => \n this.config.logLevels.includes(log.level)\n );\n\n const formattedLogs = filteredLogs.map(log => {\n const formatted = this.config.formatter(log);\n const levelClass = `tv-console-${log.level}`;\n return `<div class=\"${levelClass}\">${this.escapeHtml(formatted)}</div>`;\n });\n\n this.container.innerHTML = formattedLogs.join('');\n \n // Auto-scroll to the bottom to show the most recent logs\n this.container.scrollTop = this.container.scrollHeight;\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n private setupKeyboardListeners(): void {\n this.boundKeyDownHandler = (event: KeyboardEvent) => this.handleKeyDown(event);\n document.addEventListener('keydown', this.boundKeyDownHandler);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Handle focus key combination\n if (this.config.focusKey) {\n this.keyBuffer += event.key;\n \n // Clear buffer after 2 seconds of inactivity\n if (this.keyBufferTimeout) {\n clearTimeout(this.keyBufferTimeout);\n }\n this.keyBufferTimeout = window.setTimeout(() => {\n this.keyBuffer = '';\n }, 2000);\n\n // Check if key combination matches\n if (this.keyBuffer.includes(this.config.focusKey)) {\n this.focus();\n this.keyBuffer = '';\n event.preventDefault();\n return;\n }\n }\n\n // Handle unfocus key\n if (this.config.unfocusKey && event.key === this.config.unfocusKey && this._isFocused) {\n this.unfocus();\n event.preventDefault();\n return;\n }\n\n // Handle keyboard navigation when focused\n if (this._isFocused && this.config.enableKeyboardNav && this.container) {\n switch (event.key) {\n case 'ArrowUp':\n this.container.scrollTop -= 20;\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.container.scrollTop += 20;\n event.preventDefault();\n break;\n case 'PageUp':\n this.container.scrollTop -= this.container.clientHeight;\n event.preventDefault();\n break;\n case 'PageDown':\n this.container.scrollTop += this.container.clientHeight;\n event.preventDefault();\n break;\n case 'Home':\n this.container.scrollTop = 0;\n event.preventDefault();\n break;\n case 'End':\n this.container.scrollTop = this.container.scrollHeight;\n event.preventDefault();\n break;\n }\n }\n }\n\n // Public API methods\n log(...args: any[]): void {\n this.addLog('log', ...args);\n }\n\n info(...args: any[]): void {\n this.addLog('info', ...args);\n }\n\n warn(...args: any[]): void {\n this.addLog('warn', ...args);\n }\n\n error(...args: any[]): void {\n this.addLog('error', ...args);\n }\n\n debug(...args: any[]): void {\n this.addLog('debug', ...args);\n }\n\n clear(): void {\n this.logs = [];\n this.render();\n }\n\n show(): void {\n if (this.container) {\n this.container.style.display = 'block';\n this.isVisible = true;\n }\n }\n\n hide(): void {\n if (this.container) {\n this.container.style.display = 'none';\n this.isVisible = false;\n }\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n focus(): void {\n if (!this.container || this._isFocused || !this.isVisible) return;\n\n this.previouslyFocusedElement = document.activeElement;\n this._isFocused = true;\n this.container.focus();\n \n if (this.config.showFocusIndicator) {\n this.container.style.outline = '2px solid currentColor';\n }\n \n // Call onFocus callback if provided\n if (this.config.onFocus) {\n this.config.onFocus();\n }\n }\n\n unfocus(): void {\n if (!this.container || !this._isFocused) return;\n \n this._isFocused = false;\n this.container.blur();\n\n if (this.previouslyFocusedElement &&\n document.body.contains(this.previouslyFocusedElement) &&\n this.previouslyFocusedElement instanceof HTMLElement) {\n this.previouslyFocusedElement.focus();\n }\n this.previouslyFocusedElement = null;\n\n if (this.config.showFocusIndicator) {\n this.container.style.outline = 'none';\n }\n\n // Call onUnfocus callback if provided\n if (this.config.onUnfocus) {\n this.config.onUnfocus();\n }\n }\n\n isFocused(): boolean {\n return this._isFocused;\n }\n\n destroy(): void {\n this.unfocus();\n\n if (this.boundKeyDownHandler) {\n document.removeEventListener('keydown', this.boundKeyDownHandler);\n this.boundKeyDownHandler = null;\n }\n\n if (this.container) {\n document.body.removeChild(this.container);\n this.container = null;\n }\n\n // Restore original console methods\n Object.assign(console, this.originalConsole);\n }\n\n getLogs(): LogEntry[] {\n return [...this.logs];\n }\n\n setConfig(config: Partial<TVConsoleConfig>): void {\n const wasEnabled = this.config.enabled;\n this.config = { ...this.config, ...config };\n\n if (wasEnabled && !this.config.enabled) {\n this.destroy();\n return;\n }\n\n if (!wasEnabled && this.config.enabled) {\n this.initialize();\n return;\n }\n \n if (this.container) {\n this.container.style.cssText = `\n position: fixed;\n ${this.getPositionStyles()}\n width: ${this.config.width};\n height: ${this.config.height};\n background-color: ${this.config.backgroundColor};\n color: ${this.config.textColor};\n font-family: 'Courier New', monospace;\n font-size: ${this.config.fontSize};\n padding: 10px;\n border-radius: 5px;\n overflow-y: auto;\n z-index: ${this.config.zIndex};\n opacity: ${this.config.opacity};\n display: ${this.isVisible ? 'block' : 'none'};\n word-wrap: break-word;\n white-space: pre-wrap;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n outline: none;\n `;\n this.container.tabIndex = this.config.enableKeyboardNav ? 0 : -1;\n }\n \n this.render();\n }\n\n exportLogs(): string {\n return this.logs.map(log => {\n const timestamp = log.timestamp.toISOString();\n return `[${timestamp}] [${log.level.toUpperCase()}] ${log.message}`;\n }).join('\\n');\n }\n} "],"names":["DEFAULT_CONFIG","enabled","maxEntries","position","width","height","backgroundColor","textColor","fontSize","opacity","showTimestamp","className","zIndex","showLogLevel","logLevels","formatter","entry","timestamp","toLocaleTimeString","level","toUpperCase","message","trim","focusKey","unfocusKey","onFocus","onUnfocus","enableKeyboardNav","showFocusIndicator","TVConsole","constructor","config","Object","defineProperty","this","originalConsole","console","initialize","createContainer","interceptConsole","setupKeyboardListeners","render","container","document","createElement","tabIndex","style","cssText","getPositionStyles","body","appendChild","forEach","method","original","args","apply","addLog","includes","map","arg","formatArgument","join","id","Date","now","toString","Math","random","substr","data","stack","Error","undefined","logs","push","length","slice","JSON","stringify","prototype","keys","name","String","formattedLogs","filter","log","formatted","escapeHtml","innerHTML","scrollTop","scrollHeight","text","div","textContent","boundKeyDownHandler","event","handleKeyDown","addEventListener","keyBuffer","key","keyBufferTimeout","clearTimeout","window","setTimeout","focus","preventDefault","_isFocused","unfocus","clientHeight","info","warn","error","debug","clear","show","display","isVisible","hide","toggle","previouslyFocusedElement","activeElement","outline","blur","contains","HTMLElement","isFocused","destroy","removeEventListener","removeChild","assign","getLogs","setConfig","wasEnabled","exportLogs","toISOString"],"mappings":"gPAEA,MAAMA,EAA4C,CAChDC,SAAS,EACTC,WAAY,IACZC,SAAU,YACVC,MAAO,QACPC,OAAQ,QACRC,gBAAiB,qBACjBC,UAAW,UACXC,SAAU,OACVC,QAAS,GACTC,eAAe,EACfC,UAAW,aACXC,OAAQ,KACRC,cAAc,EACdC,UAAW,CAAC,MAAO,OAAQ,OAAQ,QAAS,SAC5CC,UAAYC,GAIH,GADuC,IAF5BA,EAAMC,UAAUC,2BACU,IAAIF,EAAMG,MAAMC,oBAE/BJ,EAAMK,UAAUC,OAE/CC,SAAU,QACVC,WAAY,SACZC,QAAS,OACTC,UAAW,OACXC,mBAAmB,EACnBC,oBAAoB,SAGTC,EAYX,WAAAC,CAAYC,EAA0B,IAX9BC,OAAAC,eAAAC,KAAA,SAAA,0DACAF,OAAAC,eAAAC,KAAA,OAAA,iDAAmB,KACnBF,OAAAC,eAAAC,KAAA,YAAA,iDAAmC,OACnCF,OAAAC,eAAAC,KAAA,YAAA,kDAAY,IACZF,OAAAC,eAAAC,KAAA,kBAAA,0DACAF,OAAAC,eAAAC,KAAA,aAAA,kDAAa,IACbF,OAAAC,eAAAC,KAAA,YAAA,iDAAY,KACZF,OAAAC,eAAAC,KAAA,mBAAA,iDAAkC,OAClCF,OAAAC,eAAAC,KAAA,2BAAA,iDAA2C,OAC3CF,OAAAC,eAAAC,KAAA,sBAAA,iDAA+D,OAGrEA,KAAKH,OAAS,IAAK/B,KAAmB+B,GACtCG,KAAKC,gBAAkBC,QACvBF,KAAKG,YACN,CAEO,UAAAA,GACDH,KAAKH,OAAO9B,UAEjBiC,KAAKI,kBACLJ,KAAKK,mBACLL,KAAKM,yBACLN,KAAKO,SACN,CAEO,eAAAH,GACNJ,KAAKQ,UAAYC,SAASC,cAAc,OACxCV,KAAKQ,UAAU/B,UAAYuB,KAAKH,OAAOpB,UACvCuB,KAAKQ,UAAUG,SAAWX,KAAKH,OAAOJ,kBAAoB,GAAK,EAC/DO,KAAKQ,UAAUI,MAAMC,QAAU,mCAE3Bb,KAAKc,qCACEd,KAAKH,OAAO3B,yBACX8B,KAAKH,OAAO1B,oCACF6B,KAAKH,OAAOzB,kCACvB4B,KAAKH,OAAOxB,8EAER2B,KAAKH,OAAOvB,uGAId0B,KAAKH,OAAOnB,2BACZsB,KAAKH,OAAOtB,2KAQzBkC,SAASM,KAAKC,YAAYhB,KAAKQ,UAChC,CAEO,iBAAAM,GACN,OAAQd,KAAKH,OAAO5B,UAClB,IAAK,WACH,MAAO,yBACT,IAAK,YAML,QACE,MAAO,0BALT,IAAK,cACH,MAAO,4BACT,IAAK,eACH,MAAO,6BAIZ,CAEO,gBAAAoC,GACsB,CAAC,MAAO,OAAQ,OAAQ,QAAS,SAErDY,QAAQC,IACd,MAAMC,EAAWnB,KAAKC,gBAAgBiB,GACtClB,KAAKC,gBAAgBiB,GAAU,IAAIE,KAEjCD,EAASE,MAAMrB,KAAKC,gBAAiBmB,GAGrCpB,KAAKsB,OAAOJ,KAAWE,KAG5B,CAEO,MAAAE,CAAOrC,KAAoBmC,GACjC,IAAKpB,KAAKH,OAAO9B,UAAYiC,KAAKH,OAAOjB,UAAU2C,SAAStC,GAC1D,OAGF,MAAME,EAAUiC,EAAKI,IAAIC,GAAOzB,KAAK0B,eAAeD,IAAME,KAAK,KACzD7C,EAAkB,CACtB8C,GAAIC,KAAKC,MAAMC,WAAaC,KAAKC,SAASF,SAAS,IAAIG,OAAO,EAAG,GACjEjD,QACAE,UACAJ,UAAW,IAAI8C,KACfM,KAAMf,EACNgB,MAAiB,UAAVnD,GAAoB,IAAIoD,OAAQD,WAAQE,GAGjDtC,KAAKuC,KAAKC,KAAK1D,GAGXkB,KAAKuC,KAAKE,OAASzC,KAAKH,OAAO7B,aACjCgC,KAAKuC,KAAOvC,KAAKuC,KAAKG,OAAO1C,KAAKH,OAAO7B,aAG3CgC,KAAKO,QACN,CAEO,cAAAmB,CAAeD,GACrB,GAAY,OAARA,EAAc,MAAO,OACzB,QAAYa,IAARb,EAAmB,MAAO,YAG9B,GAAIA,aAAeY,MACjB,MAAO,UAAUZ,EAAItC,mBAAmBsC,EAAIW,OAAS,6BAIvD,GAAmB,iBAARX,EACT,IAEE,OAAOkB,KAAKC,UAAUnB,EAAK,KAAM,EAClC,CAAC,MAEA,GAAIA,EAAIM,UAAYN,EAAIM,WAAajC,OAAO+C,UAAUd,SACpD,OAAON,EAAIM,WAIb,MAAMe,EAAOhD,OAAOgD,KAAKrB,GACzB,OAAIqB,EAAKL,OAAS,EACT,sBAAsBK,EAAKnB,KAAK,SAEhC,gBAEV,CAIH,MAAmB,mBAARF,EACF,cAAcA,EAAIsB,MAAQ,eAI5BC,OAAOvB,EACf,CAEO,MAAAlB,GACN,IAAKP,KAAKQ,UAAW,OAErB,MAIMyC,EAJejD,KAAKuC,KAAKW,OAAOC,GACpCnD,KAAKH,OAAOjB,UAAU2C,SAAS4B,EAAIlE,QAGFuC,IAAI2B,IACrC,MAAMC,EAAYpD,KAAKH,OAAOhB,UAAUsE,GAExC,MAAO,eADY,cAAcA,EAAIlE,YACAe,KAAKqD,WAAWD,aAGvDpD,KAAKQ,UAAU8C,UAAYL,EAActB,KAAK,IAG9C3B,KAAKQ,UAAU+C,UAAYvD,KAAKQ,UAAUgD,YAC3C,CAEO,UAAAH,CAAWI,GACjB,MAAMC,EAAMjD,SAASC,cAAc,OAEnC,OADAgD,EAAIC,YAAcF,EACXC,EAAIJ,SACZ,CAEO,sBAAAhD,GACNN,KAAK4D,oBAAuBC,GAAyB7D,KAAK8D,cAAcD,GACxEpD,SAASsD,iBAAiB,UAAW/D,KAAK4D,oBAC3C,CAEO,aAAAE,CAAcD,GAEpB,GAAI7D,KAAKH,OAAOR,WACdW,KAAKgE,WAAaH,EAAMI,IAGpBjE,KAAKkE,kBACPC,aAAanE,KAAKkE,kBAEpBlE,KAAKkE,iBAAmBE,OAAOC,WAAW,KACxCrE,KAAKgE,UAAY,IAChB,KAGChE,KAAKgE,UAAUzC,SAASvB,KAAKH,OAAOR,WAItC,OAHAW,KAAKsE,QACLtE,KAAKgE,UAAY,QACjBH,EAAMU,iBAMV,GAAIvE,KAAKH,OAAOP,YAAcuE,EAAMI,MAAQjE,KAAKH,OAAOP,YAAcU,KAAKwE,WAGzE,OAFAxE,KAAKyE,eACLZ,EAAMU,iBAKR,GAAIvE,KAAKwE,YAAcxE,KAAKH,OAAOJ,mBAAqBO,KAAKQ,UAC3D,OAAQqD,EAAMI,KACZ,IAAK,UACHjE,KAAKQ,UAAU+C,WAAa,GAC5BM,EAAMU,iBACN,MACF,IAAK,YACHvE,KAAKQ,UAAU+C,WAAa,GAC5BM,EAAMU,iBACN,MACF,IAAK,SACHvE,KAAKQ,UAAU+C,WAAavD,KAAKQ,UAAUkE,aAC3Cb,EAAMU,iBACN,MACF,IAAK,WACHvE,KAAKQ,UAAU+C,WAAavD,KAAKQ,UAAUkE,aAC3Cb,EAAMU,iBACN,MACF,IAAK,OACHvE,KAAKQ,UAAU+C,UAAY,EAC3BM,EAAMU,iBACN,MACF,IAAK,MACHvE,KAAKQ,UAAU+C,UAAYvD,KAAKQ,UAAUgD,aAC1CK,EAAMU,iBAIb,CAGD,GAAApB,IAAO/B,GACLpB,KAAKsB,OAAO,SAAUF,EACvB,CAED,IAAAuD,IAAQvD,GACNpB,KAAKsB,OAAO,UAAWF,EACxB,CAED,IAAAwD,IAAQxD,GACNpB,KAAKsB,OAAO,UAAWF,EACxB,CAED,KAAAyD,IAASzD,GACPpB,KAAKsB,OAAO,WAAYF,EACzB,CAED,KAAA0D,IAAS1D,GACPpB,KAAKsB,OAAO,WAAYF,EACzB,CAED,KAAA2D,GACE/E,KAAKuC,KAAO,GACZvC,KAAKO,QACN,CAED,IAAAyE,GACMhF,KAAKQ,YACPR,KAAKQ,UAAUI,MAAMqE,QAAU,QAC/BjF,KAAKkF,WAAY,EAEpB,CAED,IAAAC,GACMnF,KAAKQ,YACPR,KAAKQ,UAAUI,MAAMqE,QAAU,OAC/BjF,KAAKkF,WAAY,EAEpB,CAED,MAAAE,GACMpF,KAAKkF,UACPlF,KAAKmF,OAELnF,KAAKgF,MAER,CAED,KAAAV,GACOtE,KAAKQ,YAAaR,KAAKwE,YAAexE,KAAKkF,YAEhDlF,KAAKqF,yBAA2B5E,SAAS6E,cACzCtF,KAAKwE,YAAa,EAClBxE,KAAKQ,UAAU8D,QAEXtE,KAAKH,OAAOH,qBACdM,KAAKQ,UAAUI,MAAM2E,QAAU,0BAI7BvF,KAAKH,OAAON,SACdS,KAAKH,OAAON,UAEf,CAED,OAAAkF,GACOzE,KAAKQ,WAAcR,KAAKwE,aAE7BxE,KAAKwE,YAAa,EAClBxE,KAAKQ,UAAUgF,OAEXxF,KAAKqF,0BACL5E,SAASM,KAAK0E,SAASzF,KAAKqF,2BAC5BrF,KAAKqF,oCAAoCK,aAC3C1F,KAAKqF,yBAAyBf,QAEhCtE,KAAKqF,yBAA2B,KAE5BrF,KAAKH,OAAOH,qBACdM,KAAKQ,UAAUI,MAAM2E,QAAU,QAI7BvF,KAAKH,OAAOL,WACdQ,KAAKH,OAAOL,YAEf,CAED,SAAAmG,GACE,OAAO3F,KAAKwE,UACb,CAED,OAAAoB,GACE5F,KAAKyE,UAEDzE,KAAK4D,sBACPnD,SAASoF,oBAAoB,UAAW7F,KAAK4D,qBAC7C5D,KAAK4D,oBAAsB,MAGzB5D,KAAKQ,YACPC,SAASM,KAAK+E,YAAY9F,KAAKQ,WAC/BR,KAAKQ,UAAY,MAInBV,OAAOiG,OAAO7F,QAASF,KAAKC,gBAC7B,CAED,OAAA+F,GACE,MAAO,IAAIhG,KAAKuC,KACjB,CAED,SAAA0D,CAAUpG,GACR,MAAMqG,EAAalG,KAAKH,OAAO9B,QAC/BiC,KAAKH,OAAS,IAAKG,KAAKH,UAAWA,IAE/BqG,GAAelG,KAAKH,OAAO9B,QAK1BmI,IAAclG,KAAKH,OAAO9B,SAK3BiC,KAAKQ,YACPR,KAAKQ,UAAUI,MAAMC,QAAU,uCAE3Bb,KAAKc,uCACEd,KAAKH,OAAO3B,2BACX8B,KAAKH,OAAO1B,sCACF6B,KAAKH,OAAOzB,oCACvB4B,KAAKH,OAAOxB,kFAER2B,KAAKH,OAAOvB,+GAId0B,KAAKH,OAAOnB,6BACZsB,KAAKH,OAAOtB,8BACZyB,KAAKkF,UAAY,QAAU,8JAMxClF,KAAKQ,UAAUG,SAAWX,KAAKH,OAAOJ,kBAAoB,GAAK,GAGjEO,KAAKO,UA5BHP,KAAKG,aALLH,KAAK4F,SAkCR,CAED,UAAAO,GACE,OAAOnG,KAAKuC,KAAKf,IAAI2B,GAEZ,IADWA,EAAIpE,UAAUqH,mBACNjD,EAAIlE,MAAMC,kBAAkBiE,EAAIhE,WACzDwC,KAAK,KACT"}
@@ -8,6 +8,8 @@ export declare class TVConsole implements TVConsoleInstance {
8
8
  private _isFocused;
9
9
  private keyBuffer;
10
10
  private keyBufferTimeout;
11
+ private previouslyFocusedElement;
12
+ private boundKeyDownHandler;
11
13
  constructor(config?: TVConsoleConfig);
12
14
  private initialize;
13
15
  private createContainer;
@@ -1 +1 @@
1
- {"version":3,"file":"tv-console.d.ts","sourceRoot":"","sources":["../src/tv-console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAY,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA+BtF,qBAAa,SAAU,YAAW,iBAAiB;IACjD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,MAAM,GAAE,eAAoB;IAMxC,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,MAAM;IAyBd,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,MAAM;IAmBd,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,aAAa;IA6DrB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAOZ,IAAI,IAAI,IAAI;IAOZ,MAAM,IAAI,IAAI;IAQd,KAAK,IAAI,IAAI;IAmBb,OAAO,IAAI,IAAI;IAiBf,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAUf,OAAO,IAAI,QAAQ,EAAE;IAIrB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IA8BjD,UAAU,IAAI,MAAM;CAMrB"}
1
+ {"version":3,"file":"tv-console.d.ts","sourceRoot":"","sources":["../src/tv-console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAY,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA+BtF,qBAAa,SAAU,YAAW,iBAAiB;IACjD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,wBAAwB,CAAwB;IACxD,OAAO,CAAC,mBAAmB,CAAiD;gBAEhE,MAAM,GAAE,eAAoB;IAMxC,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,MAAM;IAyBd,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,MAAM;IAmBd,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,aAAa;IA6DrB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAOZ,IAAI,IAAI,IAAI;IAOZ,MAAM,IAAI,IAAI;IAQd,KAAK,IAAI,IAAI;IAiBb,OAAO,IAAI,IAAI;IAuBf,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAiBf,OAAO,IAAI,QAAQ,EAAE;IAIrB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAyCjD,UAAU,IAAI,MAAM;CAMrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tv-console",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "A console replacement for TV apps where browser console is not accessible",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -40,7 +40,7 @@
40
40
  "devDependencies": {
41
41
  "@rollup/plugin-commonjs": "^25.0.0",
42
42
  "@rollup/plugin-node-resolve": "^15.0.0",
43
- "@rollup/plugin-terser": "^0.4.4",
43
+ "@rollup/plugin-terser": "^1.0.0",
44
44
  "@rollup/plugin-typescript": "^11.0.0",
45
45
  "@types/jest": "^29.0.0",
46
46
  "@typescript-eslint/eslint-plugin": "^6.0.0",