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 +130 -100
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +38 -9
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +38 -9
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +38 -9
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/dist/tv-console.d.ts +2 -0
- package/dist/tv-console.d.ts.map +1 -1
- package/package.json +2 -2
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
82
|
-
|
|
83
|
-
| `enabled`
|
|
84
|
-
| `maxEntries`
|
|
85
|
-
| `position`
|
|
86
|
-
| `width`
|
|
87
|
-
| `height`
|
|
88
|
-
| `backgroundColor`
|
|
89
|
-
| `textColor`
|
|
90
|
-
| `fontSize`
|
|
91
|
-
| `opacity`
|
|
92
|
-
| `showTimestamp`
|
|
93
|
-
| `className`
|
|
94
|
-
| `zIndex`
|
|
95
|
-
| `showLogLevel`
|
|
96
|
-
| `logLevels`
|
|
97
|
-
| `formatter`
|
|
98
|
-
| `focusKey`
|
|
99
|
-
| `unfocusKey`
|
|
100
|
-
| `onFocus`
|
|
101
|
-
| `onUnfocus`
|
|
102
|
-
| `enableKeyboardNav`
|
|
103
|
-
| `showFocusIndicator` | `boolean`
|
|
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()` -
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
206
|
-
-
|
|
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
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
})
|
|
238
|
+
enabled: isDevelopment,
|
|
239
|
+
position: 'top-right',
|
|
240
|
+
})
|
|
221
241
|
|
|
222
242
|
// Conditionally show console
|
|
223
243
|
if (isDevelopment) {
|
|
224
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
240
|
-
|
|
259
|
+
color: #ff4444;
|
|
260
|
+
font-weight: bold;
|
|
241
261
|
}
|
|
242
262
|
|
|
243
263
|
.tv-console-warn {
|
|
244
|
-
|
|
264
|
+
color: #ffaa00;
|
|
245
265
|
}
|
|
246
266
|
|
|
247
267
|
.tv-console-info {
|
|
248
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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.
|
|
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.
|
|
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;
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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
|
-
|
|
224
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
226
|
-
|
|
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.
|
|
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.
|
|
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;
|
package/dist/index.umd.js.map
CHANGED
|
@@ -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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"}
|
package/dist/index.umd.min.js
CHANGED
|
@@ -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",
|
|
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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"}
|
package/dist/tv-console.d.ts
CHANGED
|
@@ -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;
|
package/dist/tv-console.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
+
"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.
|
|
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",
|