snice 3.5.0 → 3.6.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.
@@ -7,6 +7,7 @@ export declare class SniceAudioRecorder extends HTMLElement implements SniceAudi
7
7
  showVisualizer: boolean;
8
8
  maxDuration: number;
9
9
  showTimer: boolean;
10
+ showPlayback: boolean;
10
11
  private mediaRecorder;
11
12
  private stream;
12
13
  private audioChunks;
@@ -20,10 +21,15 @@ export declare class SniceAudioRecorder extends HTMLElement implements SniceAudi
20
21
  private analyser;
21
22
  private visualizerData;
22
23
  private animationFrame;
23
- private recordedUrl;
24
+ recordedUrl: string;
25
+ private isPlaying;
26
+ private playbackTime;
27
+ private audioElement;
28
+ private playbackInterval;
29
+ private timerElement?;
24
30
  styles(): import("snice").CSSResult;
25
- connectedCallback(): void;
26
- disconnectedCallback(): void;
31
+ init(): void;
32
+ cleanup(): void;
27
33
  render(): import("snice").TemplateResult;
28
34
  private renderVisualizer;
29
35
  private renderControls;
@@ -39,11 +45,15 @@ export declare class SniceAudioRecorder extends HTMLElement implements SniceAudi
39
45
  getDuration(): number;
40
46
  isRecording(): boolean;
41
47
  download(filename?: string): void;
48
+ reset(): void;
49
+ handleTogglePlayback(): void;
50
+ private stopPlayback;
51
+ handleSeek(e: MouseEvent): void;
42
52
  private handleRecordingComplete;
43
53
  private startTimer;
44
54
  private stopTimer;
45
55
  private updateVisualizer;
46
- private cleanup;
56
+ private cleanupMedia;
47
57
  private emitRecorderStart;
48
58
  private emitRecorderError;
49
59
  private emitRecorderPause;
@@ -1,7 +1,7 @@
1
- import { __runInitializers, __esDecorate } from 'tslib';
2
- import { element, property, styles, render, dispatch, css, html } from 'snice';
1
+ import { __esDecorate, __runInitializers } from 'tslib';
2
+ import { element, property, query, styles, ready, dispose, render, dispatch, css, html } from 'snice';
3
3
 
4
- var recorderStyles = ":host{display:block;width:100%;max-width:500px;font-family:var(--font-family, system-ui, -apple-system, sans-serif)}.recorder-container{background:var(--recorder-bg,#f5f5f5);border-radius:var(--recorder-border-radius,12px);padding:24px;box-shadow:0 2px 8px rgba(0,0,0,.1)}.recorder-status{text-align:center;margin-bottom:20px}.recorder-state{display:inline-flex;align-items:center;gap:8px;padding:8px 16px;border-radius:20px;font-size:14px;font-weight:500}.recorder-state.inactive{background:#e0e0e0;color:#666}.recorder-state.recording{background:#f443361a;color:#f44336}.recorder-state.paused{background:#ff98001a;color:#ff9800}.recorder-state-icon{width:8px;height:8px;border-radius:50%;background:currentColor}.recorder-state.recording .recorder-state-icon{animation:1.5s ease-in-out infinite pulse}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}.recorder-timer{font-size:32px;font-weight:300;text-align:center;margin:20px 0;font-variant-numeric:tabular-nums;color:var(--text-color,#333)}.recorder-visualizer{height:80px;display:flex;align-items:center;justify-content:center;gap:2px;margin:20px 0;background:rgba(0,0,0,.05);border-radius:8px;padding:10px}.visualizer-bar{flex:1;max-width:4px;background:var(--primary-color,#2196f3);border-radius:2px;transition:height .1s}.recorder-controls{display:flex;justify-content:center;align-items:center;gap:12px;margin-top:20px}.recorder-btn{width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.2s;color:#fff;font-size:20px;background:var(--primary-color,#2196f3)}.recorder-btn:hover{transform:scale(1.1)}.recorder-btn:active{transform:scale(.95)}.recorder-btn.record{width:64px;height:64px;background:#f44336}.recorder-btn.record:hover{background:#d32f2f}.recorder-btn.pause{background:#ff9800}.recorder-btn.pause:hover{background:#f57c00}.recorder-btn.stop{background:#666}.recorder-btn.stop:hover{background:#555}.recorder-btn.cancel{background:0 0;color:#666;border:2px solid #e0e0e0}.recorder-btn.cancel:hover{border-color:#666;color:#333}.recorder-btn.download{background:#4caf50}.recorder-btn.download:hover{background:#45a049}.recorder-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.recorder-info{display:flex;justify-content:space-between;align-items:center;margin-top:16px;padding-top:16px;border-top:1px solid #e0e0e0;font-size:12px;color:#666}.recorder-error{margin-top:12px;padding:12px;background:#ffebee;color:#c62828;border-radius:6px;font-size:14px;text-align:center}.recorder-playback{margin-top:20px}.recorder-playback audio{width:100%;border-radius:8px}";
4
+ var recorderStyles = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);contain:layout style paint}.recorder-container{background:var(--snice-color-background-element,rgb(252 251 249));border:1px solid var(--snice-color-border,rgb(226 226 226));border-radius:var(--snice-border-radius-lg,8px);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);box-shadow:var(--snice-shadow-sm,0 1px 2px 0 rgb(0 0 0 / .05));display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);position:relative}.recorder-status{margin:0;flex-shrink:0}.recorder-state{display:inline-flex;align-items:center;gap:var(--snice-spacing-2xs,.25rem);padding:var(--snice-spacing-2xs,.25rem) var(--snice-spacing-xs,.5rem);border-radius:20px;font-size:var(--snice-font-size-xs, .6875rem);font-weight:var(--snice-font-weight-medium,500)}.recorder-state.inactive{background:var(--snice-color-background-tertiary,rgb(241 241 241));color:var(--snice-color-text-secondary,rgb(82 82 82))}.recorder-state.recording{background:rgb(var(--snice-color-red-100,254 226 226));color:var(--snice-color-danger,rgb(220 38 38))}.recorder-state.paused{background:rgb(var(--snice-color-yellow-100,254 249 195));color:var(--snice-color-warning,rgb(202 138 4))}.recorder-state-icon{width:var(--snice-spacing-2xs,.25rem);height:var(--snice-spacing-2xs,.25rem);border-radius:50%;background:currentColor}.recorder-state.recording .recorder-state-icon{animation:1.5s ease-in-out infinite pulse}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}.recorder-timer{font-size:var(--snice-font-size-md, 1rem);font-weight:var(--snice-font-weight-normal,400);margin:0;flex-shrink:0;min-width:3.75rem;font-variant-numeric:tabular-nums;color:var(--snice-color-text,rgb(23 23 23))}.recorder-visualizer{height:1.875rem;display:flex;align-items:center;justify-content:center;gap:2px;margin:0;flex:1;min-width:0;background:rgba(0,0,0,.03);border-radius:var(--snice-border-radius-md,4px);padding:var(--snice-spacing-2xs,.25rem)}.visualizer-bar{flex:1;max-width:4px;background:var(--snice-color-primary,rgb(37 99 235));border-radius:2px;transition:height var(--snice-transition-fast, 100ms) ease}.recorder-controls{display:flex;justify-content:center;align-items:center;gap:var(--snice-spacing-2xs,.25rem);margin:0;flex-shrink:0}.recorder-btn{width:2rem;height:2rem;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--snice-transition-fast, 150ms);color:var(--snice-color-text-inverse,rgb(250 250 250));font-size:1rem;background:var(--snice-color-primary,rgb(37 99 235))}.recorder-btn:hover{transform:scale(1.1)}.recorder-btn:active{transform:scale(.95)}.recorder-btn.record{width:2.25rem;height:2.25rem;background:var(--snice-color-danger,rgb(220 38 38))}.recorder-btn.record:hover{background:var(--snice-color-danger-hover,rgb(185 28 28))}.recorder-btn.pause{background:var(--snice-color-warning,rgb(202 138 4))}.recorder-btn.pause:hover{background:var(--snice-color-warning-hover,rgb(161 98 7))}.recorder-btn.play{background:var(--snice-color-primary,rgb(37 99 235))}.recorder-btn.play:hover{background:var(--snice-color-primary-hover,rgb(29 78 216))}.recorder-btn.stop{background:var(--snice-color-neutral,rgb(82 82 82))}.recorder-btn.stop:hover{background:var(--snice-color-neutral-hover,rgb(64 64 64))}.recorder-btn.cancel{background:0 0;color:var(--snice-color-text-secondary,rgb(82 82 82));border:2px solid var(--snice-color-border,rgb(226 226 226))}.recorder-btn.cancel:hover{border-color:var(--snice-color-border-hover,rgb(204 204 204));color:var(--snice-color-text,rgb(23 23 23))}.recorder-btn.download{background:var(--snice-color-success,rgb(22 163 74))}.recorder-btn.download:hover{background:var(--snice-color-success-hover,rgb(21 128 61))}.recorder-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.recorder-info{display:none}.recorder-error{position:absolute;top:100%;left:0;right:0;margin-top:var(--snice-spacing-2xs,.25rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);background:rgb(var(--snice-color-red-50,254 242 242));color:var(--snice-color-danger,rgb(220 38 38));border-radius:var(--snice-border-radius-md,4px);font-size:var(--snice-font-size-sm, .875rem);text-align:center;border:1px solid rgb(var(--snice-color-red-200,254 202 202))}.playback-progress{flex:1;height:1.875rem;background:rgba(0,0,0,.03);border-radius:var(--snice-border-radius-md,4px);cursor:pointer;position:relative;overflow:hidden;display:flex;align-items:center}.playback-progress-fill{height:100%;background:var(--snice-color-primary,rgb(37 99 235));opacity:.2;transition:width .1s linear}";
5
5
 
6
6
  let SniceAudioRecorder = (() => {
7
7
  let _classDecorators = [element('snice-audio-recorder')];
@@ -31,7 +31,30 @@ let SniceAudioRecorder = (() => {
31
31
  let _showTimer_decorators;
32
32
  let _showTimer_initializers = [];
33
33
  let _showTimer_extraInitializers = [];
34
+ let _showPlayback_decorators;
35
+ let _showPlayback_initializers = [];
36
+ let _showPlayback_extraInitializers = [];
37
+ let _state_decorators;
38
+ let _state_initializers = [];
39
+ let _state_extraInitializers = [];
40
+ let _errorMessage_decorators;
41
+ let _errorMessage_initializers = [];
42
+ let _errorMessage_extraInitializers = [];
43
+ let _recordedUrl_decorators;
44
+ let _recordedUrl_initializers = [];
45
+ let _recordedUrl_extraInitializers = [];
46
+ let _isPlaying_decorators;
47
+ let _isPlaying_initializers = [];
48
+ let _isPlaying_extraInitializers = [];
49
+ let _playbackTime_decorators;
50
+ let _playbackTime_initializers = [];
51
+ let _playbackTime_extraInitializers = [];
52
+ let _timerElement_decorators;
53
+ let _timerElement_initializers = [];
54
+ let _timerElement_extraInitializers = [];
34
55
  let _styles_decorators;
56
+ let _init_decorators;
57
+ let _cleanup_decorators;
35
58
  let _render_decorators;
36
59
  let _emitRecorderStart_decorators;
37
60
  let _emitRecorderError_decorators;
@@ -41,30 +64,6 @@ let SniceAudioRecorder = (() => {
41
64
  let _emitRecorderStop_decorators;
42
65
  (class extends _classSuper {
43
66
  static { _classThis = this; }
44
- constructor() {
45
- super(...arguments);
46
- this.autoStart = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _autoStart_initializers, false));
47
- this.format = (__runInitializers(this, _autoStart_extraInitializers), __runInitializers(this, _format_initializers, 'audio/webm'));
48
- this.bitrate = (__runInitializers(this, _format_extraInitializers), __runInitializers(this, _bitrate_initializers, 128000));
49
- this.showControls = (__runInitializers(this, _bitrate_extraInitializers), __runInitializers(this, _showControls_initializers, true));
50
- this.showVisualizer = (__runInitializers(this, _showControls_extraInitializers), __runInitializers(this, _showVisualizer_initializers, true));
51
- this.maxDuration = (__runInitializers(this, _showVisualizer_extraInitializers), __runInitializers(this, _maxDuration_initializers, 0)); // 0 = unlimited
52
- this.showTimer = (__runInitializers(this, _maxDuration_extraInitializers), __runInitializers(this, _showTimer_initializers, true));
53
- this.mediaRecorder = (__runInitializers(this, _showTimer_extraInitializers), null);
54
- this.stream = null;
55
- this.audioChunks = [];
56
- this.state = 'inactive';
57
- this.startTime = 0;
58
- this.pausedTime = 0;
59
- this.duration = 0;
60
- this.timerInterval = null;
61
- this.errorMessage = '';
62
- this.audioContext = null;
63
- this.analyser = null;
64
- this.visualizerData = null;
65
- this.animationFrame = null;
66
- this.recordedUrl = '';
67
- }
68
67
  static {
69
68
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
70
69
  _autoStart_decorators = [property({ type: Boolean, attribute: 'auto-start' })];
@@ -74,7 +73,16 @@ let SniceAudioRecorder = (() => {
74
73
  _showVisualizer_decorators = [property({ type: Boolean, attribute: 'show-visualizer' })];
75
74
  _maxDuration_decorators = [property({ type: Number, attribute: 'max-duration' })];
76
75
  _showTimer_decorators = [property({ type: Boolean, attribute: 'show-timer' })];
76
+ _showPlayback_decorators = [property({ type: Boolean, attribute: 'show-playback' })];
77
+ _state_decorators = [property()];
78
+ _errorMessage_decorators = [property()];
79
+ _recordedUrl_decorators = [property({ type: String })];
80
+ _isPlaying_decorators = [property({ type: Boolean })];
81
+ _playbackTime_decorators = [property({ type: Number })];
82
+ _timerElement_decorators = [query('.recorder-timer')];
77
83
  _styles_decorators = [styles()];
84
+ _init_decorators = [ready()];
85
+ _cleanup_decorators = [dispose()];
78
86
  _render_decorators = [render()];
79
87
  _emitRecorderStart_decorators = [dispatch('@snice/recorder-start', { bubbles: true, composed: true })];
80
88
  _emitRecorderError_decorators = [dispatch('@snice/recorder-error', { bubbles: true, composed: true })];
@@ -83,6 +91,8 @@ let SniceAudioRecorder = (() => {
83
91
  _emitRecorderCancel_decorators = [dispatch('@snice/recorder-cancel', { bubbles: true, composed: true })];
84
92
  _emitRecorderStop_decorators = [dispatch('@snice/recorder-stop', { bubbles: true, composed: true })];
85
93
  __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
94
+ __esDecorate(this, null, _init_decorators, { kind: "method", name: "init", static: false, private: false, access: { has: obj => "init" in obj, get: obj => obj.init }, metadata: _metadata }, null, _instanceExtraInitializers);
95
+ __esDecorate(this, null, _cleanup_decorators, { kind: "method", name: "cleanup", static: false, private: false, access: { has: obj => "cleanup" in obj, get: obj => obj.cleanup }, metadata: _metadata }, null, _instanceExtraInitializers);
86
96
  __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
87
97
  __esDecorate(this, null, _emitRecorderStart_decorators, { kind: "method", name: "emitRecorderStart", static: false, private: false, access: { has: obj => "emitRecorderStart" in obj, get: obj => obj.emitRecorderStart }, metadata: _metadata }, null, _instanceExtraInitializers);
88
98
  __esDecorate(this, null, _emitRecorderError_decorators, { kind: "method", name: "emitRecorderError", static: false, private: false, access: { has: obj => "emitRecorderError" in obj, get: obj => obj.emitRecorderError }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -97,6 +107,13 @@ let SniceAudioRecorder = (() => {
97
107
  __esDecorate(null, null, _showVisualizer_decorators, { kind: "field", name: "showVisualizer", static: false, private: false, access: { has: obj => "showVisualizer" in obj, get: obj => obj.showVisualizer, set: (obj, value) => { obj.showVisualizer = value; } }, metadata: _metadata }, _showVisualizer_initializers, _showVisualizer_extraInitializers);
98
108
  __esDecorate(null, null, _maxDuration_decorators, { kind: "field", name: "maxDuration", static: false, private: false, access: { has: obj => "maxDuration" in obj, get: obj => obj.maxDuration, set: (obj, value) => { obj.maxDuration = value; } }, metadata: _metadata }, _maxDuration_initializers, _maxDuration_extraInitializers);
99
109
  __esDecorate(null, null, _showTimer_decorators, { kind: "field", name: "showTimer", static: false, private: false, access: { has: obj => "showTimer" in obj, get: obj => obj.showTimer, set: (obj, value) => { obj.showTimer = value; } }, metadata: _metadata }, _showTimer_initializers, _showTimer_extraInitializers);
110
+ __esDecorate(null, null, _showPlayback_decorators, { kind: "field", name: "showPlayback", static: false, private: false, access: { has: obj => "showPlayback" in obj, get: obj => obj.showPlayback, set: (obj, value) => { obj.showPlayback = value; } }, metadata: _metadata }, _showPlayback_initializers, _showPlayback_extraInitializers);
111
+ __esDecorate(null, null, _state_decorators, { kind: "field", name: "state", static: false, private: false, access: { has: obj => "state" in obj, get: obj => obj.state, set: (obj, value) => { obj.state = value; } }, metadata: _metadata }, _state_initializers, _state_extraInitializers);
112
+ __esDecorate(null, null, _errorMessage_decorators, { kind: "field", name: "errorMessage", static: false, private: false, access: { has: obj => "errorMessage" in obj, get: obj => obj.errorMessage, set: (obj, value) => { obj.errorMessage = value; } }, metadata: _metadata }, _errorMessage_initializers, _errorMessage_extraInitializers);
113
+ __esDecorate(null, null, _recordedUrl_decorators, { kind: "field", name: "recordedUrl", static: false, private: false, access: { has: obj => "recordedUrl" in obj, get: obj => obj.recordedUrl, set: (obj, value) => { obj.recordedUrl = value; } }, metadata: _metadata }, _recordedUrl_initializers, _recordedUrl_extraInitializers);
114
+ __esDecorate(null, null, _isPlaying_decorators, { kind: "field", name: "isPlaying", static: false, private: false, access: { has: obj => "isPlaying" in obj, get: obj => obj.isPlaying, set: (obj, value) => { obj.isPlaying = value; } }, metadata: _metadata }, _isPlaying_initializers, _isPlaying_extraInitializers);
115
+ __esDecorate(null, null, _playbackTime_decorators, { kind: "field", name: "playbackTime", static: false, private: false, access: { has: obj => "playbackTime" in obj, get: obj => obj.playbackTime, set: (obj, value) => { obj.playbackTime = value; } }, metadata: _metadata }, _playbackTime_initializers, _playbackTime_extraInitializers);
116
+ __esDecorate(null, null, _timerElement_decorators, { kind: "field", name: "timerElement", static: false, private: false, access: { has: obj => "timerElement" in obj, get: obj => obj.timerElement, set: (obj, value) => { obj.timerElement = value; } }, metadata: _metadata }, _timerElement_initializers, _timerElement_extraInitializers);
100
117
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
101
118
  _classThis = _classDescriptor.value;
102
119
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -105,46 +122,93 @@ let SniceAudioRecorder = (() => {
105
122
  styles() {
106
123
  return css /*css*/ `${recorderStyles}`;
107
124
  }
108
- connectedCallback() {
125
+ init() {
109
126
  if (this.autoStart) {
110
127
  this.start();
111
128
  }
112
129
  }
113
- disconnectedCallback() {
114
- this.cleanup();
130
+ cleanup() {
131
+ if (this.stream) {
132
+ this.stream.getTracks().forEach(track => track.stop());
133
+ this.stream = null;
134
+ }
135
+ if (this.audioContext) {
136
+ this.audioContext.close();
137
+ this.audioContext = null;
138
+ }
139
+ if (this.animationFrame !== null) {
140
+ cancelAnimationFrame(this.animationFrame);
141
+ this.animationFrame = null;
142
+ }
143
+ this.analyser = null;
144
+ this.visualizerData = null;
115
145
  }
116
146
  render() {
147
+ const showingPlayback = this.showPlayback && this.recordedUrl;
117
148
  return html /*html*/ `
118
149
  <div class="recorder-container">
119
- <div class="recorder-status">
120
- <div class="recorder-state ${this.state}">
121
- <div class="recorder-state-icon"></div>
122
- <span>${this.getStateLabel()}</span>
150
+ <if ${showingPlayback}>
151
+ <div class="recorder-status">
152
+ <div class="recorder-state inactive">
153
+ <div class="recorder-state-icon" style="background: var(--snice-color-primary, rgb(37 99 235));"></div>
154
+ <span>Playback</span>
155
+ </div>
123
156
  </div>
124
- </div>
125
-
126
- ${this.showTimer ? html `
127
- <div class="recorder-timer">${this.formatTime(this.duration)}</div>
128
- ` : ''}
129
157
 
130
- ${this.showVisualizer ? this.renderVisualizer() : ''}
158
+ <div class="recorder-timer">${this.formatTime(this.playbackTime)}</div>
131
159
 
132
- ${this.showControls ? this.renderControls() : ''}
160
+ <div class="playback-progress" @click=${(e) => this.handleSeek(e)}>
161
+ <div class="playback-progress-fill" style="width: ${this.duration > 0 ? (this.playbackTime / this.duration) * 100 : 0}%"></div>
162
+ </div>
133
163
 
134
- ${this.errorMessage ? html `
135
- <div class="recorder-error">${this.errorMessage}</div>
136
- ` : ''}
164
+ <div class="recorder-controls">
165
+ <button class="recorder-btn ${this.isPlaying ? 'pause' : 'play'}" @click=${() => this.handleTogglePlayback()} title="${this.isPlaying ? 'Pause' : 'Play'}">
166
+ <if ${this.isPlaying}>
167
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
168
+ <rect x="6" y="4" width="4" height="16"></rect>
169
+ <rect x="14" y="4" width="4" height="16"></rect>
170
+ </svg>
171
+ </if>
172
+ <if ${!this.isPlaying}>
173
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
174
+ <path d="M8 5v14l11-7z"/>
175
+ </svg>
176
+ </if>
177
+ </button>
178
+ <if ${this.showControls}>
179
+ <button class="recorder-btn record" @click=${() => this.reset()} title="Record Again">
180
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
181
+ <circle cx="12" cy="12" r="8"/>
182
+ </svg>
183
+ </button>
184
+ </if>
185
+ </div>
186
+ </if>
137
187
 
138
- ${this.recordedUrl ? html `
139
- <div class="recorder-playback">
140
- <audio src="${this.recordedUrl}" controls></audio>
188
+ <if ${!showingPlayback}>
189
+ <div class="recorder-status">
190
+ <div class="recorder-state ${this.state}">
191
+ <div class="recorder-state-icon"></div>
192
+ <span>${this.getStateLabel()}</span>
193
+ </div>
141
194
  </div>
142
- ` : ''}
143
195
 
144
- <div class="recorder-info">
145
- <span>Format: ${this.format.split('/')[1].toUpperCase()}</span>
146
- <span>Bitrate: ${this.bitrate / 1000}kbps</span>
147
- </div>
196
+ <if ${this.showTimer}>
197
+ <div class="recorder-timer">${this.formatTime(this.duration)}</div>
198
+ </if>
199
+
200
+ <if ${this.showVisualizer}>
201
+ ${this.renderVisualizer()}
202
+ </if>
203
+
204
+ <if ${this.showControls}>
205
+ ${this.renderControls()}
206
+ </if>
207
+
208
+ <if ${this.errorMessage}>
209
+ <div class="recorder-error">${this.errorMessage}</div>
210
+ </if>
211
+ </if>
148
212
  </div>
149
213
  `;
150
214
  }
@@ -227,11 +291,7 @@ let SniceAudioRecorder = (() => {
227
291
  return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
228
292
  }
229
293
  getVisualizerHeight(index) {
230
- if (!this.visualizerData || this.state !== 'recording') {
231
- return 4;
232
- }
233
- const value = this.visualizerData[index * 4] || 0;
234
- return 4 + (value / 255) * 60;
294
+ return 4;
235
295
  }
236
296
  async start() {
237
297
  try {
@@ -239,16 +299,6 @@ let SniceAudioRecorder = (() => {
239
299
  this.audioChunks = [];
240
300
  this.recordedUrl = '';
241
301
  this.stream = await navigator.mediaDevices.getUserMedia({ audio: true });
242
- // Setup visualizer
243
- if (this.showVisualizer) {
244
- this.audioContext = new AudioContext();
245
- this.analyser = this.audioContext.createAnalyser();
246
- const source = this.audioContext.createMediaStreamSource(this.stream);
247
- source.connect(this.analyser);
248
- this.analyser.fftSize = 256;
249
- this.visualizerData = new Uint8Array(this.analyser.frequencyBinCount);
250
- this.updateVisualizer();
251
- }
252
302
  const options = {
253
303
  mimeType: this.format,
254
304
  audioBitsPerSecond: this.bitrate
@@ -262,10 +312,22 @@ let SniceAudioRecorder = (() => {
262
312
  this.mediaRecorder.onstop = () => {
263
313
  this.handleRecordingComplete();
264
314
  };
265
- this.mediaRecorder.start();
315
+ // Request data every 1 second to ensure ondataavailable fires
316
+ this.mediaRecorder.start(1000);
266
317
  this.state = 'recording';
267
318
  this.startTime = Date.now();
268
319
  this.startTimer();
320
+ // Setup visualizer AFTER state is set to 'recording'
321
+ if (this.showVisualizer) {
322
+ this.audioContext = new AudioContext();
323
+ this.analyser = this.audioContext.createAnalyser();
324
+ const source = this.audioContext.createMediaStreamSource(this.stream);
325
+ source.connect(this.analyser);
326
+ this.analyser.fftSize = 128;
327
+ this.analyser.smoothingTimeConstant = 0.8;
328
+ this.visualizerData = new Uint8Array(this.analyser.frequencyBinCount);
329
+ this.updateVisualizer();
330
+ }
269
331
  this.emitRecorderStart();
270
332
  }
271
333
  catch (error) {
@@ -290,12 +352,12 @@ let SniceAudioRecorder = (() => {
290
352
  timestamp: Date.now()
291
353
  };
292
354
  this.recordedUrl = url;
355
+ this.cleanupMedia(); // Clean up AFTER recording completes
293
356
  resolve(recording);
294
357
  };
295
358
  this.mediaRecorder.addEventListener('stop', resolveWithRecording, { once: true });
296
359
  this.mediaRecorder.stop();
297
360
  this.stopTimer();
298
- this.cleanup();
299
361
  this.state = 'inactive';
300
362
  });
301
363
  }
@@ -324,7 +386,7 @@ let SniceAudioRecorder = (() => {
324
386
  }
325
387
  this.audioChunks = [];
326
388
  this.stopTimer();
327
- this.cleanup();
389
+ this.cleanupMedia();
328
390
  this.state = 'inactive';
329
391
  this.duration = 0;
330
392
  this.emitRecorderCancel();
@@ -347,12 +409,78 @@ let SniceAudioRecorder = (() => {
347
409
  a.download = filename;
348
410
  a.click();
349
411
  }
412
+ reset() {
413
+ this.stopPlayback();
414
+ this.recordedUrl = '';
415
+ this.audioChunks = [];
416
+ this.duration = 0;
417
+ this.playbackTime = 0;
418
+ this.state = 'inactive';
419
+ }
420
+ handleTogglePlayback() {
421
+ if (!this.recordedUrl)
422
+ return;
423
+ if (!this.audioElement) {
424
+ this.audioElement = new Audio(this.recordedUrl);
425
+ this.audioElement.addEventListener('ended', () => {
426
+ this.isPlaying = false;
427
+ this.playbackTime = 0;
428
+ if (this.playbackInterval) {
429
+ clearInterval(this.playbackInterval);
430
+ this.playbackInterval = null;
431
+ }
432
+ });
433
+ }
434
+ if (this.isPlaying) {
435
+ this.audioElement.pause();
436
+ this.isPlaying = false;
437
+ if (this.playbackInterval) {
438
+ clearInterval(this.playbackInterval);
439
+ this.playbackInterval = null;
440
+ }
441
+ }
442
+ else {
443
+ this.audioElement.play();
444
+ this.isPlaying = true;
445
+ this.playbackInterval = window.setInterval(() => {
446
+ if (this.audioElement) {
447
+ this.playbackTime = this.audioElement.currentTime;
448
+ }
449
+ }, 100);
450
+ }
451
+ }
452
+ stopPlayback() {
453
+ if (this.audioElement) {
454
+ this.audioElement.pause();
455
+ this.audioElement = null;
456
+ }
457
+ if (this.playbackInterval) {
458
+ clearInterval(this.playbackInterval);
459
+ this.playbackInterval = null;
460
+ }
461
+ this.isPlaying = false;
462
+ this.playbackTime = 0;
463
+ }
464
+ handleSeek(e) {
465
+ if (!this.audioElement || this.duration === 0)
466
+ return;
467
+ const progressBar = e.currentTarget;
468
+ const rect = progressBar.getBoundingClientRect();
469
+ const percent = (e.clientX - rect.left) / rect.width;
470
+ const seekTime = percent * this.duration;
471
+ this.audioElement.currentTime = seekTime;
472
+ this.playbackTime = seekTime;
473
+ }
350
474
  handleRecordingComplete() {
351
475
  this.emitRecorderStop();
352
476
  }
353
477
  startTimer() {
354
478
  this.timerInterval = window.setInterval(() => {
355
479
  this.duration = (Date.now() - this.startTime) / 1000;
480
+ // Update timer display directly
481
+ if (this.timerElement) {
482
+ this.timerElement.textContent = this.formatTime(this.duration);
483
+ }
356
484
  if (this.maxDuration > 0 && this.duration >= this.maxDuration) {
357
485
  this.stop();
358
486
  }
@@ -369,9 +497,27 @@ let SniceAudioRecorder = (() => {
369
497
  return;
370
498
  }
371
499
  this.analyser.getByteFrequencyData(this.visualizerData);
500
+ const bars = this.shadowRoot?.querySelectorAll('.visualizer-bar');
501
+ if (bars && bars.length > 0) {
502
+ // Focus on lower half of frequencies where speech is
503
+ const maxIndex = Math.floor(this.visualizerData.length / 2);
504
+ bars.forEach((bar, i) => {
505
+ // Map bars to lower frequencies only
506
+ const start = Math.floor((i / 32) * maxIndex);
507
+ const end = Math.floor(((i + 1) / 32) * maxIndex);
508
+ let sum = 0;
509
+ for (let j = start; j < end; j++) {
510
+ sum += this.visualizerData[j];
511
+ }
512
+ const avg = sum / (end - start);
513
+ const boosted = Math.min(255, avg * 2);
514
+ const height = 4 + (boosted / 255) * 60;
515
+ bar.style.height = `${height}px`;
516
+ });
517
+ }
372
518
  this.animationFrame = requestAnimationFrame(() => this.updateVisualizer());
373
519
  }
374
- cleanup() {
520
+ cleanupMedia() {
375
521
  if (this.stream) {
376
522
  this.stream.getTracks().forEach(track => track.stop());
377
523
  this.stream = null;
@@ -405,6 +551,37 @@ let SniceAudioRecorder = (() => {
405
551
  emitRecorderStop() {
406
552
  return { recorder: this };
407
553
  }
554
+ constructor() {
555
+ super(...arguments);
556
+ this.autoStart = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _autoStart_initializers, false));
557
+ this.format = (__runInitializers(this, _autoStart_extraInitializers), __runInitializers(this, _format_initializers, 'audio/webm'));
558
+ this.bitrate = (__runInitializers(this, _format_extraInitializers), __runInitializers(this, _bitrate_initializers, 128000));
559
+ this.showControls = (__runInitializers(this, _bitrate_extraInitializers), __runInitializers(this, _showControls_initializers, true));
560
+ this.showVisualizer = (__runInitializers(this, _showControls_extraInitializers), __runInitializers(this, _showVisualizer_initializers, true));
561
+ this.maxDuration = (__runInitializers(this, _showVisualizer_extraInitializers), __runInitializers(this, _maxDuration_initializers, 0)); // 0 = unlimited
562
+ this.showTimer = (__runInitializers(this, _maxDuration_extraInitializers), __runInitializers(this, _showTimer_initializers, true));
563
+ this.showPlayback = (__runInitializers(this, _showTimer_extraInitializers), __runInitializers(this, _showPlayback_initializers, true));
564
+ this.mediaRecorder = (__runInitializers(this, _showPlayback_extraInitializers), null);
565
+ this.stream = null;
566
+ this.audioChunks = [];
567
+ this.state = __runInitializers(this, _state_initializers, 'inactive');
568
+ this.startTime = (__runInitializers(this, _state_extraInitializers), 0);
569
+ this.pausedTime = 0;
570
+ this.duration = 0;
571
+ this.timerInterval = null;
572
+ this.errorMessage = __runInitializers(this, _errorMessage_initializers, '');
573
+ this.audioContext = (__runInitializers(this, _errorMessage_extraInitializers), null);
574
+ this.analyser = null;
575
+ this.visualizerData = null;
576
+ this.animationFrame = null;
577
+ this.recordedUrl = __runInitializers(this, _recordedUrl_initializers, '');
578
+ this.isPlaying = (__runInitializers(this, _recordedUrl_extraInitializers), __runInitializers(this, _isPlaying_initializers, false));
579
+ this.playbackTime = (__runInitializers(this, _isPlaying_extraInitializers), __runInitializers(this, _playbackTime_initializers, 0));
580
+ this.audioElement = (__runInitializers(this, _playbackTime_extraInitializers), null);
581
+ this.playbackInterval = null;
582
+ this.timerElement = __runInitializers(this, _timerElement_initializers, void 0);
583
+ __runInitializers(this, _timerElement_extraInitializers);
584
+ }
408
585
  });
409
586
  return _classThis;
410
587
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"snice-audio-recorder.js","sources":["../../../components/audio-recorder/snice-audio-recorder.css?inline","../../../../components/audio-recorder/snice-audio-recorder.ts"],"sourcesContent":["export default \":host{display:block;width:100%;max-width:500px;font-family:var(--font-family, system-ui, -apple-system, sans-serif)}.recorder-container{background:var(--recorder-bg,#f5f5f5);border-radius:var(--recorder-border-radius,12px);padding:24px;box-shadow:0 2px 8px rgba(0,0,0,.1)}.recorder-status{text-align:center;margin-bottom:20px}.recorder-state{display:inline-flex;align-items:center;gap:8px;padding:8px 16px;border-radius:20px;font-size:14px;font-weight:500}.recorder-state.inactive{background:#e0e0e0;color:#666}.recorder-state.recording{background:#f443361a;color:#f44336}.recorder-state.paused{background:#ff98001a;color:#ff9800}.recorder-state-icon{width:8px;height:8px;border-radius:50%;background:currentColor}.recorder-state.recording .recorder-state-icon{animation:1.5s ease-in-out infinite pulse}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}.recorder-timer{font-size:32px;font-weight:300;text-align:center;margin:20px 0;font-variant-numeric:tabular-nums;color:var(--text-color,#333)}.recorder-visualizer{height:80px;display:flex;align-items:center;justify-content:center;gap:2px;margin:20px 0;background:rgba(0,0,0,.05);border-radius:8px;padding:10px}.visualizer-bar{flex:1;max-width:4px;background:var(--primary-color,#2196f3);border-radius:2px;transition:height .1s}.recorder-controls{display:flex;justify-content:center;align-items:center;gap:12px;margin-top:20px}.recorder-btn{width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.2s;color:#fff;font-size:20px;background:var(--primary-color,#2196f3)}.recorder-btn:hover{transform:scale(1.1)}.recorder-btn:active{transform:scale(.95)}.recorder-btn.record{width:64px;height:64px;background:#f44336}.recorder-btn.record:hover{background:#d32f2f}.recorder-btn.pause{background:#ff9800}.recorder-btn.pause:hover{background:#f57c00}.recorder-btn.stop{background:#666}.recorder-btn.stop:hover{background:#555}.recorder-btn.cancel{background:0 0;color:#666;border:2px solid #e0e0e0}.recorder-btn.cancel:hover{border-color:#666;color:#333}.recorder-btn.download{background:#4caf50}.recorder-btn.download:hover{background:#45a049}.recorder-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.recorder-info{display:flex;justify-content:space-between;align-items:center;margin-top:16px;padding-top:16px;border-top:1px solid #e0e0e0;font-size:12px;color:#666}.recorder-error{margin-top:12px;padding:12px;background:#ffebee;color:#c62828;border-radius:6px;font-size:14px;text-align:center}.recorder-playback{margin-top:20px}.recorder-playback audio{width:100%;border-radius:8px}\";",null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snice-audio-recorder.js","sources":["../../../components/audio-recorder/snice-audio-recorder.css?inline","../../../../components/audio-recorder/snice-audio-recorder.ts"],"sourcesContent":["export default \":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);contain:layout style paint}.recorder-container{background:var(--snice-color-background-element,rgb(252 251 249));border:1px solid var(--snice-color-border,rgb(226 226 226));border-radius:var(--snice-border-radius-lg,8px);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);box-shadow:var(--snice-shadow-sm,0 1px 2px 0 rgb(0 0 0 / .05));display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);position:relative}.recorder-status{margin:0;flex-shrink:0}.recorder-state{display:inline-flex;align-items:center;gap:var(--snice-spacing-2xs,.25rem);padding:var(--snice-spacing-2xs,.25rem) var(--snice-spacing-xs,.5rem);border-radius:20px;font-size:var(--snice-font-size-xs, .6875rem);font-weight:var(--snice-font-weight-medium,500)}.recorder-state.inactive{background:var(--snice-color-background-tertiary,rgb(241 241 241));color:var(--snice-color-text-secondary,rgb(82 82 82))}.recorder-state.recording{background:rgb(var(--snice-color-red-100,254 226 226));color:var(--snice-color-danger,rgb(220 38 38))}.recorder-state.paused{background:rgb(var(--snice-color-yellow-100,254 249 195));color:var(--snice-color-warning,rgb(202 138 4))}.recorder-state-icon{width:var(--snice-spacing-2xs,.25rem);height:var(--snice-spacing-2xs,.25rem);border-radius:50%;background:currentColor}.recorder-state.recording .recorder-state-icon{animation:1.5s ease-in-out infinite pulse}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}.recorder-timer{font-size:var(--snice-font-size-md, 1rem);font-weight:var(--snice-font-weight-normal,400);margin:0;flex-shrink:0;min-width:3.75rem;font-variant-numeric:tabular-nums;color:var(--snice-color-text,rgb(23 23 23))}.recorder-visualizer{height:1.875rem;display:flex;align-items:center;justify-content:center;gap:2px;margin:0;flex:1;min-width:0;background:rgba(0,0,0,.03);border-radius:var(--snice-border-radius-md,4px);padding:var(--snice-spacing-2xs,.25rem)}.visualizer-bar{flex:1;max-width:4px;background:var(--snice-color-primary,rgb(37 99 235));border-radius:2px;transition:height var(--snice-transition-fast, 100ms) ease}.recorder-controls{display:flex;justify-content:center;align-items:center;gap:var(--snice-spacing-2xs,.25rem);margin:0;flex-shrink:0}.recorder-btn{width:2rem;height:2rem;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--snice-transition-fast, 150ms);color:var(--snice-color-text-inverse,rgb(250 250 250));font-size:1rem;background:var(--snice-color-primary,rgb(37 99 235))}.recorder-btn:hover{transform:scale(1.1)}.recorder-btn:active{transform:scale(.95)}.recorder-btn.record{width:2.25rem;height:2.25rem;background:var(--snice-color-danger,rgb(220 38 38))}.recorder-btn.record:hover{background:var(--snice-color-danger-hover,rgb(185 28 28))}.recorder-btn.pause{background:var(--snice-color-warning,rgb(202 138 4))}.recorder-btn.pause:hover{background:var(--snice-color-warning-hover,rgb(161 98 7))}.recorder-btn.play{background:var(--snice-color-primary,rgb(37 99 235))}.recorder-btn.play:hover{background:var(--snice-color-primary-hover,rgb(29 78 216))}.recorder-btn.stop{background:var(--snice-color-neutral,rgb(82 82 82))}.recorder-btn.stop:hover{background:var(--snice-color-neutral-hover,rgb(64 64 64))}.recorder-btn.cancel{background:0 0;color:var(--snice-color-text-secondary,rgb(82 82 82));border:2px solid var(--snice-color-border,rgb(226 226 226))}.recorder-btn.cancel:hover{border-color:var(--snice-color-border-hover,rgb(204 204 204));color:var(--snice-color-text,rgb(23 23 23))}.recorder-btn.download{background:var(--snice-color-success,rgb(22 163 74))}.recorder-btn.download:hover{background:var(--snice-color-success-hover,rgb(21 128 61))}.recorder-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.recorder-info{display:none}.recorder-error{position:absolute;top:100%;left:0;right:0;margin-top:var(--snice-spacing-2xs,.25rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);background:rgb(var(--snice-color-red-50,254 242 242));color:var(--snice-color-danger,rgb(220 38 38));border-radius:var(--snice-border-radius-md,4px);font-size:var(--snice-font-size-sm, .875rem);text-align:center;border:1px solid rgb(var(--snice-color-red-200,254 202 202))}.playback-progress{flex:1;height:1.875rem;background:rgba(0,0,0,.03);border-radius:var(--snice-border-radius-md,4px);cursor:pointer;position:relative;overflow:hidden;display:flex;align-items:center}.playback-progress-fill{height:100%;background:var(--snice-color-primary,rgb(37 99 235));opacity:.2;transition:width .1s linear}\";",null],"names":[],"mappings":"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"}
@@ -16,11 +16,13 @@ export interface SniceAudioRecorderElement extends HTMLElement {
16
16
  showVisualizer: boolean;
17
17
  maxDuration: number;
18
18
  showTimer: boolean;
19
+ showPlayback: boolean;
19
20
  start(): Promise<void>;
20
21
  stop(): Promise<AudioRecording>;
21
22
  pause(): void;
22
23
  resume(): void;
23
24
  cancel(): void;
25
+ reset(): void;
24
26
  getState(): RecorderState;
25
27
  getDuration(): number;
26
28
  isRecording(): boolean;
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
package/dist/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
package/dist/symbols.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v3.4.1
2
+ * snice v3.5.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
@@ -0,0 +1,147 @@
1
+ # snice-terminal
2
+
3
+ Shell terminal emulator with command execution, history, ANSI colors, and keyboard navigation.
4
+
5
+ ## Usage
6
+
7
+ ```html
8
+ <snice-terminal prompt="$ " cwd="~"></snice-terminal>
9
+ ```
10
+
11
+ ## Properties
12
+
13
+ - `prompt: string` - Terminal prompt (default: `"$ "`)
14
+ - `cwd: string` - Current working directory (default: `"~"`)
15
+ - `readonly: boolean` - Disable input (default: `false`)
16
+ - `maxLines: number` - Max lines in history (default: `1000`)
17
+ - `showTimestamps: boolean` - Show line timestamps (default: `false`)
18
+
19
+ ## Methods
20
+
21
+ - `write(content: string, type?: TerminalLineType): void` - Write without newline
22
+ - `writeln(content: string, type?: TerminalLineType): void` - Write with newline
23
+ - `writeLines(lines: Array<{ content: string; type?: TerminalLineType }>): void` - Write multiple lines
24
+ - `writeError(content: string): void` - Write error line
25
+ - `clear(): void` - Clear terminal
26
+ - `focus(): void` - Focus input
27
+ - `getHistory(): string[]` - Get command history
28
+ - `clearHistory(): void` - Clear command history
29
+
30
+ ## Events
31
+
32
+ - `@snice/terminal-command: CustomEvent<{ command: string; args: string[] }>` - Command entered
33
+ - `@snice/terminal-clear: CustomEvent<{}>` - Terminal cleared
34
+ - `@snice/terminal-ready: CustomEvent<{}>` - Terminal ready
35
+
36
+ ## Request/Response Pattern
37
+
38
+ Terminal uses `@request('terminal-command')` decorator pattern:
39
+
40
+ ```typescript
41
+ // Terminal component makes request
42
+ @request('terminal-command')
43
+ async *executeCommand(commandLine: string): any {
44
+ const response = await (yield payload);
45
+ return response;
46
+ }
47
+
48
+ // Controller responds
49
+ @respond('terminal-command')
50
+ async handleCommand(payload: TerminalCommandRequest) {
51
+ const { command, args, cwd } = payload;
52
+ // Execute command
53
+ return { output: 'result', exitCode: 0 };
54
+ }
55
+ ```
56
+
57
+ ## Line Types
58
+
59
+ - `input` - User input
60
+ - `output` - Command output
61
+ - `error` - Error message
62
+ - `info` - Info message
63
+ - `success` - Success message
64
+ - `warning` - Warning message
65
+
66
+ ## Keyboard Shortcuts
67
+
68
+ - `Enter` - Execute command
69
+ - `↑/↓` - Navigate history
70
+ - `Ctrl+C` - Cancel input
71
+ - `Ctrl+L` - Clear terminal
72
+ - `Tab` - Command completion (TODO)
73
+
74
+ ## ANSI Color Support
75
+
76
+ Supports ANSI escape codes for colors:
77
+ - `30-37` - Standard colors
78
+ - `90-97` - Bright colors
79
+
80
+ Special output `\x1B[CLEAR]` clears terminal.
81
+
82
+ ## CSS Variables
83
+
84
+ ```css
85
+ --snice-terminal-background
86
+ --snice-terminal-foreground
87
+ --snice-terminal-border
88
+ --snice-terminal-scrollbar
89
+ --snice-terminal-scrollbar-thumb
90
+ --snice-terminal-input-color
91
+ --snice-terminal-output-color
92
+ --snice-terminal-error-color
93
+ --snice-terminal-info-color
94
+ --snice-terminal-success-color
95
+ --snice-terminal-warning-color
96
+ --snice-terminal-prompt-color
97
+ --snice-terminal-selection
98
+ ```
99
+
100
+ ## Types
101
+
102
+ ```typescript
103
+ type TerminalLineType = 'input' | 'output' | 'error' | 'info' | 'success' | 'warning';
104
+
105
+ interface TerminalCommandRequest {
106
+ command: string;
107
+ args: string[];
108
+ cwd?: string;
109
+ history?: string[];
110
+ }
111
+
112
+ interface TerminalCommandResponse {
113
+ output?: string;
114
+ error?: string;
115
+ exitCode?: number;
116
+ }
117
+ ```
118
+
119
+ ## Example
120
+
121
+ ```javascript
122
+ const terminal = document.querySelector('snice-terminal');
123
+
124
+ // Listen for commands (event pattern)
125
+ terminal.addEventListener('@snice/terminal-command', (e) => {
126
+ console.log('Command:', e.detail.command, e.detail.args);
127
+ });
128
+
129
+ // Handle commands (@respond pattern)
130
+ class TerminalController extends HTMLElement {
131
+ @respond('terminal-command')
132
+ async handleCommand(req) {
133
+ if (req.command === 'echo') {
134
+ return { output: req.args.join(' '), exitCode: 0 };
135
+ }
136
+ if (req.command === 'clear') {
137
+ return { output: '\x1B[CLEAR]' };
138
+ }
139
+ return { error: `Command not found: ${req.command}`, exitCode: 127 };
140
+ }
141
+ }
142
+
143
+ // Write to terminal
144
+ terminal.writeln('Welcome to the terminal!', 'info');
145
+ terminal.writeln('\x1b[32mGreen text\x1b[0m', 'output');
146
+ terminal.writeError('Error: Something went wrong');
147
+ ```
@@ -0,0 +1,451 @@
1
+ # snice-terminal
2
+
3
+ A shell terminal emulator component with command execution, history navigation, ANSI color support, and keyboard shortcuts.
4
+
5
+ ## Features
6
+
7
+ - **Command execution** - Execute commands with @request/@respond pattern
8
+ - **Command history** - Navigate with arrow keys (↑/↓)
9
+ - **ANSI colors** - Support for ANSI escape sequences
10
+ - **Keyboard shortcuts** - Ctrl+C, Ctrl+L, Tab (planned)
11
+ - **Readonly mode** - Display-only terminal output
12
+ - **Line management** - Auto-scroll and line limit
13
+ - **Timestamps** - Optional timestamp display
14
+ - **Customizable styling** - CSS custom properties for theming
15
+
16
+ ## Basic Usage
17
+
18
+ ```html
19
+ <snice-terminal id="terminal" prompt="$ " cwd="~"></snice-terminal>
20
+
21
+ <script type="module">
22
+ import 'snice';
23
+
24
+ const terminal = document.getElementById('terminal');
25
+
26
+ // Write to terminal
27
+ terminal.writeln('Welcome to the terminal!', 'info');
28
+ terminal.writeln('Type "help" for commands', 'output');
29
+ </script>
30
+ ```
31
+
32
+ ## Properties
33
+
34
+ | Property | Attribute | Type | Default | Description |
35
+ | ----------------- | ------------------ | --------- | ---------- | ------------------------------------- |
36
+ | `prompt` | `prompt` | `string` | `"$ "` | Terminal prompt string |
37
+ | `cwd` | `cwd` | `string` | `"~"` | Current working directory |
38
+ | `readonly` | `readonly` | `boolean` | `false` | Disable input (display only) |
39
+ | `maxLines` | `max-lines` | `number` | `1000` | Maximum lines to keep in history |
40
+ | `showTimestamps` | `show-timestamps` | `boolean` | `false` | Show timestamps on each line |
41
+
42
+ ## Methods
43
+
44
+ ### `write(content: string, type?: TerminalLineType): void`
45
+
46
+ Write content to terminal without adding a newline.
47
+
48
+ ```javascript
49
+ terminal.write('Loading', 'output');
50
+ terminal.write('...', 'output');
51
+ ```
52
+
53
+ ### `writeln(content: string, type?: TerminalLineType): void`
54
+
55
+ Write a line to the terminal with a newline.
56
+
57
+ ```javascript
58
+ terminal.writeln('Command completed successfully', 'success');
59
+ terminal.writeln('Warning: Low disk space', 'warning');
60
+ ```
61
+
62
+ ### `writeLines(lines: Array<{ content: string; type?: TerminalLineType }>): void`
63
+
64
+ Write multiple lines at once.
65
+
66
+ ```javascript
67
+ terminal.writeLines([
68
+ { content: 'File listing:', type: 'info' },
69
+ { content: 'file1.txt', type: 'output' },
70
+ { content: 'file2.txt', type: 'output' },
71
+ { content: 'file3.txt', type: 'output' },
72
+ ]);
73
+ ```
74
+
75
+ ### `writeError(content: string): void`
76
+
77
+ Write an error message to the terminal.
78
+
79
+ ```javascript
80
+ terminal.writeError('Error: File not found');
81
+ ```
82
+
83
+ ### `clear(): void`
84
+
85
+ Clear all terminal output.
86
+
87
+ ```javascript
88
+ terminal.clear();
89
+ ```
90
+
91
+ ### `focus(): void`
92
+
93
+ Focus the terminal input.
94
+
95
+ ```javascript
96
+ terminal.focus();
97
+ ```
98
+
99
+ ### `getHistory(): string[]`
100
+
101
+ Get the command history.
102
+
103
+ ```javascript
104
+ const history = terminal.getHistory();
105
+ console.log('Command history:', history);
106
+ ```
107
+
108
+ ### `clearHistory(): void`
109
+
110
+ Clear the command history.
111
+
112
+ ```javascript
113
+ terminal.clearHistory();
114
+ ```
115
+
116
+ ## Events
117
+
118
+ ### `@snice/terminal-command`
119
+
120
+ Emitted when a command is entered.
121
+
122
+ ```javascript
123
+ terminal.addEventListener('@snice/terminal-command', (e) => {
124
+ console.log('Command:', e.detail.command);
125
+ console.log('Args:', e.detail.args);
126
+ });
127
+ ```
128
+
129
+ **Detail:**
130
+ - `command: string` - The command name
131
+ - `args: string[]` - Command arguments
132
+
133
+ ### `@snice/terminal-clear`
134
+
135
+ Emitted when the terminal is cleared.
136
+
137
+ ```javascript
138
+ terminal.addEventListener('@snice/terminal-clear', () => {
139
+ console.log('Terminal was cleared');
140
+ });
141
+ ```
142
+
143
+ ### `@snice/terminal-ready`
144
+
145
+ Emitted when the terminal is ready.
146
+
147
+ ```javascript
148
+ terminal.addEventListener('@snice/terminal-ready', () => {
149
+ console.log('Terminal is ready');
150
+ });
151
+ ```
152
+
153
+ ## Command Execution Pattern
154
+
155
+ The terminal uses Snice's `@request`/`@respond` pattern for command execution:
156
+
157
+ ```javascript
158
+ import { element, respond } from 'snice';
159
+
160
+ @element('terminal-controller')
161
+ class TerminalController extends HTMLElement {
162
+ @respond('terminal-command')
163
+ async handleCommand(payload) {
164
+ const { command, args, cwd, history } = payload;
165
+
166
+ // Handle different commands
167
+ switch (command) {
168
+ case 'echo':
169
+ return { output: args.join(' '), exitCode: 0 };
170
+
171
+ case 'pwd':
172
+ return { output: cwd, exitCode: 0 };
173
+
174
+ case 'clear':
175
+ // Special marker to trigger clear
176
+ return { output: '\x1B[CLEAR]' };
177
+
178
+ case 'history':
179
+ return { output: history.join('\n'), exitCode: 0 };
180
+
181
+ default:
182
+ return {
183
+ error: `Command not found: ${command}`,
184
+ exitCode: 127,
185
+ };
186
+ }
187
+ }
188
+ }
189
+ ```
190
+
191
+ ## Line Types
192
+
193
+ The terminal supports different line types for styling:
194
+
195
+ - `input` - User input echoed back
196
+ - `output` - Standard command output
197
+ - `error` - Error messages (red)
198
+ - `info` - Information messages (blue)
199
+ - `success` - Success messages (green)
200
+ - `warning` - Warning messages (yellow)
201
+
202
+ ```javascript
203
+ terminal.writeln('This is output', 'output');
204
+ terminal.writeln('This is an error', 'error');
205
+ terminal.writeln('This is info', 'info');
206
+ terminal.writeln('This is success', 'success');
207
+ terminal.writeln('This is a warning', 'warning');
208
+ ```
209
+
210
+ ## Keyboard Shortcuts
211
+
212
+ | Key | Action |
213
+ | ----------- | -------------------------- |
214
+ | `Enter` | Execute command |
215
+ | `↑` | Previous command (history) |
216
+ | `↓` | Next command (history) |
217
+ | `Ctrl+C` | Cancel current input |
218
+ | `Ctrl+L` | Clear terminal |
219
+ | `Tab` | Auto-complete (TODO) |
220
+
221
+ ## ANSI Color Support
222
+
223
+ The terminal supports ANSI escape sequences for colored output:
224
+
225
+ ```javascript
226
+ // Standard colors (30-37)
227
+ terminal.writeln('\x1b[31mRed text\x1b[0m', 'output');
228
+ terminal.writeln('\x1b[32mGreen text\x1b[0m', 'output');
229
+ terminal.writeln('\x1b[33mYellow text\x1b[0m', 'output');
230
+ terminal.writeln('\x1b[34mBlue text\x1b[0m', 'output');
231
+ terminal.writeln('\x1b[35mMagenta text\x1b[0m', 'output');
232
+ terminal.writeln('\x1b[36mCyan text\x1b[0m', 'output');
233
+ terminal.writeln('\x1b[37mWhite text\x1b[0m', 'output');
234
+
235
+ // Bright colors (90-97)
236
+ terminal.writeln('\x1b[91mBright Red\x1b[0m', 'output');
237
+ terminal.writeln('\x1b[92mBright Green\x1b[0m', 'output');
238
+ terminal.writeln('\x1b[93mBright Yellow\x1b[0m', 'output');
239
+ terminal.writeln('\x1b[94mBright Blue\x1b[0m', 'output');
240
+
241
+ // Reset
242
+ terminal.writeln('\x1b[0mReset to default\x1b[0m', 'output');
243
+ ```
244
+
245
+ **ANSI Color Map:**
246
+ - `30` / `90` - Black / Bright Black
247
+ - `31` / `91` - Red / Bright Red
248
+ - `32` / `92` - Green / Bright Green
249
+ - `33` / `93` - Yellow / Bright Yellow
250
+ - `34` / `94` - Blue / Bright Blue
251
+ - `35` / `95` - Magenta / Bright Magenta
252
+ - `36` / `96` - Cyan / Bright Cyan
253
+ - `37` / `97` - White / Bright White
254
+ - `0` - Reset
255
+
256
+ ## Styling
257
+
258
+ The component can be styled using CSS custom properties:
259
+
260
+ ```css
261
+ snice-terminal {
262
+ /* Container */
263
+ --snice-terminal-background: #1e1e1e;
264
+ --snice-terminal-foreground: #d4d4d4;
265
+ --snice-terminal-border: #3c3c3c;
266
+
267
+ /* Scrollbar */
268
+ --snice-terminal-scrollbar: #424242;
269
+ --snice-terminal-scrollbar-thumb: #686868;
270
+
271
+ /* Line types */
272
+ --snice-terminal-input-color: #d4d4d4;
273
+ --snice-terminal-output-color: #cccccc;
274
+ --snice-terminal-error-color: #ff5555;
275
+ --snice-terminal-info-color: #569cd6;
276
+ --snice-terminal-success-color: #50fa7b;
277
+ --snice-terminal-warning-color: #f1fa8c;
278
+
279
+ /* Prompt */
280
+ --snice-terminal-prompt-color: #569cd6;
281
+
282
+ /* Selection */
283
+ --snice-terminal-selection: rgba(255, 255, 255, 0.2);
284
+ }
285
+ ```
286
+
287
+ ## Examples
288
+
289
+ ### Basic Terminal
290
+
291
+ ```html
292
+ <snice-terminal id="terminal"></snice-terminal>
293
+
294
+ <script type="module">
295
+ import 'snice';
296
+
297
+ const terminal = document.getElementById('terminal');
298
+
299
+ terminal.writeln('Welcome to the terminal!', 'info');
300
+ terminal.writeln('Type commands to get started', 'output');
301
+ </script>
302
+ ```
303
+
304
+ ### With Command Handler
305
+
306
+ ```html
307
+ <terminal-controller></terminal-controller>
308
+ <snice-terminal id="terminal" prompt="myapp $ "></snice-terminal>
309
+
310
+ <script type="module">
311
+ import { element, respond } from 'snice';
312
+
313
+ @element('terminal-controller')
314
+ class TerminalController extends HTMLElement {
315
+ @respond('terminal-command')
316
+ async handleCommand(payload) {
317
+ const { command, args } = payload;
318
+
319
+ switch (command) {
320
+ case 'hello':
321
+ return { output: `Hello, ${args[0] || 'World'}!`, exitCode: 0 };
322
+
323
+ case 'date':
324
+ return { output: new Date().toString(), exitCode: 0 };
325
+
326
+ case 'help':
327
+ return {
328
+ output: 'Available commands:\n hello [name]\n date\n help\n clear',
329
+ exitCode: 0,
330
+ };
331
+
332
+ case 'clear':
333
+ return { output: '\x1B[CLEAR]' };
334
+
335
+ default:
336
+ return {
337
+ error: `Unknown command: ${command}`,
338
+ exitCode: 1,
339
+ };
340
+ }
341
+ }
342
+ }
343
+
344
+ const terminal = document.getElementById('terminal');
345
+ terminal.writeln('Type "help" for available commands', 'info');
346
+ </script>
347
+ ```
348
+
349
+ ### Readonly Terminal
350
+
351
+ ```html
352
+ <snice-terminal id="log-viewer" readonly show-timestamps></snice-terminal>
353
+
354
+ <script type="module">
355
+ import 'snice';
356
+
357
+ const logViewer = document.getElementById('log-viewer');
358
+
359
+ // Simulate log streaming
360
+ setInterval(() => {
361
+ const logTypes = ['info', 'warning', 'error', 'success'];
362
+ const type = logTypes[Math.floor(Math.random() * logTypes.length)];
363
+ const message = `Log entry at ${new Date().toISOString()}`;
364
+ logViewer.writeln(message, type);
365
+ }, 2000);
366
+ </script>
367
+ ```
368
+
369
+ ### With ANSI Colors
370
+
371
+ ```html
372
+ <snice-terminal id="terminal"></snice-terminal>
373
+
374
+ <script type="module">
375
+ import 'snice';
376
+
377
+ const terminal = document.getElementById('terminal');
378
+
379
+ terminal.writeln('\x1b[1m\x1b[32mSuccess!\x1b[0m Operation completed', 'output');
380
+ terminal.writeln('\x1b[31mError:\x1b[0m Something went wrong', 'output');
381
+ terminal.writeln('\x1b[33mWarning:\x1b[0m Disk space low', 'output');
382
+ terminal.writeln('\x1b[36mInfo:\x1b[0m Processing...', 'output');
383
+ </script>
384
+ ```
385
+
386
+ ### Async Command Execution
387
+
388
+ ```html
389
+ <terminal-controller></terminal-controller>
390
+ <snice-terminal id="terminal"></snice-terminal>
391
+
392
+ <script type="module">
393
+ import { element, respond } from 'snice';
394
+
395
+ @element('terminal-controller')
396
+ class TerminalController extends HTMLElement {
397
+ @respond('terminal-command')
398
+ async handleCommand(payload) {
399
+ const { command, args } = payload;
400
+
401
+ if (command === 'fetch') {
402
+ const url = args[0];
403
+ if (!url) {
404
+ return { error: 'Usage: fetch <url>', exitCode: 1 };
405
+ }
406
+
407
+ try {
408
+ const response = await fetch(url);
409
+ const data = await response.json();
410
+ return { output: JSON.stringify(data, null, 2), exitCode: 0 };
411
+ } catch (error) {
412
+ return { error: `Fetch failed: ${error.message}`, exitCode: 1 };
413
+ }
414
+ }
415
+
416
+ if (command === 'sleep') {
417
+ const seconds = parseInt(args[0]) || 1;
418
+ await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
419
+ return { output: `Slept for ${seconds} seconds`, exitCode: 0 };
420
+ }
421
+
422
+ return { error: `Unknown command: ${command}`, exitCode: 127 };
423
+ }
424
+ }
425
+ </script>
426
+ ```
427
+
428
+ ## Browser Support
429
+
430
+ Works in all modern browsers that support:
431
+ - Custom Elements v1
432
+ - Shadow DOM
433
+ - ES2020+
434
+
435
+ ## TypeScript
436
+
437
+ Full TypeScript support with exported types:
438
+
439
+ ```typescript
440
+ import type {
441
+ SniceTerminalElement,
442
+ TerminalLine,
443
+ TerminalLineType,
444
+ TerminalCommandRequest,
445
+ TerminalCommandResponse,
446
+ } from 'snice/terminal';
447
+ ```
448
+
449
+ ## Security Note
450
+
451
+ The terminal uses `unsafeHTML` for rendering ANSI-colored output. Only use trusted content or sanitize user input before displaying.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "snice",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "type": "module",
5
5
  "description": "Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.",
6
6
  "main": "dist/index.cjs",