tv-console 1.0.3 → 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
 
@@ -23,88 +25,101 @@ You can also use TV Console directly from CDN:
23
25
 
24
26
  ```html
25
27
  <!-- Using unpkg -->
26
- <script src="https://unpkg.com/tv-console@1.0.2/dist/index.umd.min.js"></script>
28
+ <script src="https://unpkg.com/tv-console@1.0.3/dist/index.umd.min.js"></script>
27
29
 
28
30
  <!-- Using jsDelivr -->
29
- <script src="https://cdn.jsdelivr.net/npm/tv-console@1.0.2/dist/index.umd.min.js"></script>
31
+ <script src="https://cdn.jsdelivr.net/npm/tv-console@1.0.3/dist/index.umd.min.js"></script>
30
32
 
31
33
  <!-- Using CDNJS (once approved) -->
32
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tv-console/1.0.2/index.umd.min.js"></script>
34
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tv-console/1.0.3/index.umd.min.js"></script>
33
35
  ```
34
36
 
35
- When using CDN, the library is available globally as `TVConsole`:
37
+ When using CDN, the library is available globally. You may need to access it in one of these ways:
36
38
 
37
39
  ```html
38
40
  <script>
39
- const tvConsole = new TVConsole();
40
- console.log('Hello from CDN!');
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!')
41
55
  </script>
42
56
  ```
43
57
 
44
58
  ## Quick Start
45
59
 
46
60
  ```typescript
47
- import { TVConsole } from 'tv-console';
61
+ import { TVConsole } from 'tv-console'
48
62
 
49
63
  // Initialize with default settings
50
- const tvConsole = new TVConsole();
64
+ const tvConsole = new TVConsole()
51
65
 
52
66
  // Your existing console calls will now appear on screen
53
- console.log('Hello TV World!');
54
- console.error('Something went wrong');
55
- console.warn('Warning message');
67
+ console.log('Hello TV World!')
68
+ console.error('Something went wrong')
69
+ console.warn('Warning message')
56
70
  ```
57
71
 
58
72
  ## Configuration
59
73
 
60
74
  ```typescript
61
- import { TVConsole } from 'tv-console';
75
+ import { TVConsole } from 'tv-console'
62
76
 
63
77
  const tvConsole = new TVConsole({
64
- enabled: true,
65
- position: 'bottom-right',
66
- backgroundColor: 'rgba(0, 0, 0, 0.9)',
67
- textColor: '#00ff00',
68
- fontSize: '16px',
69
- maxEntries: 200,
70
- showTimestamp: true,
71
- showLogLevel: true,
72
- logLevels: ['log', 'error', 'warn'], // Only show these levels
73
- zIndex: 10000
74
- });
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
+ })
75
89
  ```
76
90
 
77
91
  ## API Reference
78
92
 
79
93
  ### Constructor Options
80
94
 
81
- | Option | Type | Default | Description |
82
- |--------|------|---------|-------------|
83
- | `enabled` | `boolean` | `true` | Enable/disable the TV console |
84
- | `maxEntries` | `number` | `100` | Maximum number of log entries to keep |
85
- | `position` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-right'` | Position of the console overlay |
86
- | `width` | `string` | `'400px'` | Width of the console overlay |
87
- | `height` | `string` | `'300px'` | Height of the console overlay |
88
- | `backgroundColor` | `string` | `'rgba(0, 0, 0, 0.8)'` | Background color of the overlay |
89
- | `textColor` | `string` | `'#ffffff'` | Text color |
90
- | `fontSize` | `string` | `'14px'` | Font size |
91
- | `opacity` | `number` | `0.9` | Opacity of the overlay |
92
- | `showTimestamp` | `boolean` | `true` | Show timestamp with each log entry |
93
- | `className` | `string` | `'tv-console'` | CSS class for styling |
94
- | `zIndex` | `number` | `9999` | Z-index of the overlay |
95
- | `showLogLevel` | `boolean` | `true` | Show log level indicators |
96
- | `logLevels` | `LogLevel[]` | `['log', 'info', 'warn', 'error', 'debug']` | Filter which log levels to display |
97
- | `formatter` | `(entry: LogEntry) => string` | Default formatter | Custom formatter for log messages |
98
- | `focusKey` | `string` | `'12345'` | Key combination to focus the console |
99
- | `unfocusKey` | `string` | `'Escape'` | Key to unfocus the console |
100
- | `onFocus` | `() => void` | `() => {}` | Callback when console gains focus |
101
- | `onUnfocus` | `() => void` | `() => {}` | Callback when console loses focus |
102
- | `enableKeyboardNav` | `boolean` | `true` | Enable keyboard navigation for scrolling |
103
- | `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) |
104
118
 
105
119
  ### Instance Methods
106
120
 
107
121
  #### Logging Methods
122
+
108
123
  - `log(...args: any[])` - Log a message
109
124
  - `info(...args: any[])` - Log an info message
110
125
  - `warn(...args: any[])` - Log a warning message
@@ -112,18 +127,21 @@ const tvConsole = new TVConsole({
112
127
  - `debug(...args: any[])` - Log a debug message
113
128
 
114
129
  #### Console Control
130
+
115
131
  - `show()` - Show the console overlay
116
132
  - `hide()` - Hide the console overlay
117
133
  - `toggle()` - Toggle visibility
118
134
  - `clear()` - Clear all log entries
119
- - `destroy()` - Remove the console overlay and restore original console
135
+ - `destroy()` - Unfocus (restoring previously focused element), remove all event listeners, and remove the overlay
120
136
 
121
137
  #### Focus Management
138
+
122
139
  - `focus()` - Focus the console for keyboard navigation
123
140
  - `unfocus()` - Unfocus the console
124
141
  - `isFocused(): boolean` - Check if console is currently focused
125
142
 
126
143
  #### Data Management
144
+
127
145
  - `getLogs(): LogEntry[]` - Get all current log entries
128
146
  - `setConfig(config: Partial<TVConsoleConfig>)` - Update configuration
129
147
  - `exportLogs(): string` - Export logs as formatted text
@@ -133,44 +151,44 @@ const tvConsole = new TVConsole({
133
151
  ### Basic Usage
134
152
 
135
153
  ```typescript
136
- import { TVConsole } from 'tv-console';
154
+ import { TVConsole } from 'tv-console'
137
155
 
138
156
  // Initialize
139
- const tvConsole = new TVConsole();
157
+ const tvConsole = new TVConsole()
140
158
 
141
159
  // Your app code
142
160
  function handleUserAction() {
143
- console.log('User clicked button');
144
- console.info('Processing request...');
145
-
146
- try {
147
- // Some operation
148
- console.log('Operation successful');
149
- } catch (error) {
150
- console.error('Operation failed:', error);
151
- }
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
+ }
152
170
  }
153
171
  ```
154
172
 
155
173
  ### Advanced Configuration
156
174
 
157
175
  ```typescript
158
- import { TVConsole } from 'tv-console';
176
+ import { TVConsole } from 'tv-console'
159
177
 
160
178
  const tvConsole = new TVConsole({
161
- position: 'bottom-left',
162
- backgroundColor: 'rgba(0, 20, 40, 0.95)',
163
- textColor: '#00ff88',
164
- fontSize: '18px',
165
- maxEntries: 50,
166
- logLevels: ['error', 'warn'], // Only show errors and warnings
167
- formatter: (entry) => {
168
- return `[${entry.timestamp.toLocaleTimeString()}] ${entry.message}`;
169
- }
170
- });
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
+ })
171
189
 
172
190
  // Show console when app starts
173
- tvConsole.show();
191
+ tvConsole.show()
174
192
  ```
175
193
 
176
194
  ### TV Remote Control Support
@@ -179,22 +197,22 @@ The TV Console includes built-in support for TV remote controls and keyboard nav
179
197
 
180
198
  ```typescript
181
199
  const tvConsole = new TVConsole({
182
- focusKey: '12345', // Key combination to focus console
183
- unfocusKey: 'Escape', // Key to unfocus console
184
- enableKeyboardNav: true, // Enable arrow key scrolling
185
- showFocusIndicator: true, // Show green border when focused
186
- onFocus: () => {
187
- console.log('Console gained focus - pausing app functionality');
188
- // Handle focus gain (e.g., pause app, show instructions)
189
- },
190
- onUnfocus: () => {
191
- console.log('Console lost focus - returning to app');
192
- // Handle focus loss (e.g., resume app functionality)
193
- }
194
- });
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
+ })
195
212
  ```
196
213
 
197
214
  **Keyboard Navigation (when focused):**
215
+
198
216
  - `Arrow Up/Down` - Scroll up/down by 20px
199
217
  - `Page Up/Down` - Scroll up/down by one page
200
218
  - `Home` - Scroll to top
@@ -202,26 +220,28 @@ const tvConsole = new TVConsole({
202
220
  - `Escape` - Unfocus console
203
221
 
204
222
  **Focus Management:**
205
- - Type `12345` (or your custom key combination) to focus the console
206
- - 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
207
227
  - Use arrow keys to scroll through log history
208
- - Press `Escape` to unfocus and return to your app
228
+ - Press `Escape` to unfocus the previously focused host element regains focus automatically
209
229
 
210
230
  ### Conditional Console
211
231
 
212
232
  ```typescript
213
- import { TVConsole } from 'tv-console';
233
+ import { TVConsole } from 'tv-console'
214
234
 
215
235
  // Only enable in development
216
- const isDevelopment = process.env.NODE_ENV === 'development';
236
+ const isDevelopment = process.env.NODE_ENV === 'development'
217
237
  const tvConsole = new TVConsole({
218
- enabled: isDevelopment,
219
- position: 'top-right'
220
- });
238
+ enabled: isDevelopment,
239
+ position: 'top-right',
240
+ })
221
241
 
222
242
  // Conditionally show console
223
243
  if (isDevelopment) {
224
- tvConsole.show();
244
+ tvConsole.show()
225
245
  }
226
246
  ```
227
247
 
@@ -230,28 +250,29 @@ if (isDevelopment) {
230
250
  ```css
231
251
  /* Custom CSS for the console overlay */
232
252
  .tv-console {
233
- border: 2px solid #00ff00;
234
- border-radius: 8px;
235
- font-family: 'Courier New', monospace;
253
+ border: 2px solid #00ff00;
254
+ border-radius: 8px;
255
+ font-family: 'Courier New', monospace;
236
256
  }
237
257
 
238
258
  .tv-console-error {
239
- color: #ff4444;
240
- font-weight: bold;
259
+ color: #ff4444;
260
+ font-weight: bold;
241
261
  }
242
262
 
243
263
  .tv-console-warn {
244
- color: #ffaa00;
264
+ color: #ffaa00;
245
265
  }
246
266
 
247
267
  .tv-console-info {
248
- color: #44aaff;
268
+ color: #44aaff;
249
269
  }
250
270
  ```
251
271
 
252
272
  ## Browser Support
253
273
 
254
274
  This package works in all modern browsers that support:
275
+
255
276
  - ES2020 features
256
277
  - DOM manipulation
257
278
  - CSS Grid/Flexbox
@@ -270,9 +291,18 @@ MIT
270
291
 
271
292
  ## Changelog
272
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
+
273
302
  ### 1.0.0
303
+
274
304
  - Initial release
275
305
  - Basic console overlay functionality
276
306
  - Configurable styling and positioning
277
307
  - Log level filtering
278
- - 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":"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"}
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":"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"}
@@ -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.3",
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",