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.
- package/dist/components/audio-recorder/snice-audio-recorder.d.ts +14 -4
- package/dist/components/audio-recorder/snice-audio-recorder.js +248 -71
- package/dist/components/audio-recorder/snice-audio-recorder.js.map +1 -1
- package/dist/components/audio-recorder/snice-audio-recorder.types.d.ts +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/components/terminal.md +147 -0
- package/docs/components/terminal.md +451 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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
|
|
56
|
+
private cleanupMedia;
|
|
47
57
|
private emitRecorderStart;
|
|
48
58
|
private emitRecorderError;
|
|
49
59
|
private emitRecorderPause;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
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;
|
|
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
|
-
|
|
125
|
+
init() {
|
|
109
126
|
if (this.autoStart) {
|
|
110
127
|
this.start();
|
|
111
128
|
}
|
|
112
129
|
}
|
|
113
|
-
|
|
114
|
-
this.
|
|
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
|
-
<
|
|
120
|
-
<div class="recorder-
|
|
121
|
-
<div class="recorder-state
|
|
122
|
-
|
|
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
|
-
|
|
158
|
+
<div class="recorder-timer">${this.formatTime(this.playbackTime)}</div>
|
|
131
159
|
|
|
132
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
${
|
|
139
|
-
<div class="recorder-
|
|
140
|
-
<
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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":";;;AAAA,qBAAe,6jFAA6jF;;ICK/jF,kBAAkB,GAAA,CAAA,MAAA;4BAD9B,OAAO,CAAC,sBAAsB,CAAC,CAAA;;;;sBACQ,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAnB,KAAA,cAAQ,WAAW,CAAA;;;;AAEjD,YAAA,IAAA,CAAA,SAAS,IAFE,iBAAA,CAAA,IAAA,EAAA,0BAAA,CAAkB,EAAA,iBAAA,CAAA,IAAA,EAAA,uBAAA,EAER,KAAK,CAAA,CAAA;YAG1B,IAAA,CAAA,MAAM,IAAA,iBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA,EAAA,iBAAA,CAAA,IAAA,EAAA,oBAAA,EAAgB,YAAY,CAAA,CAAA;YAGlC,IAAA,CAAA,OAAO,IAAA,iBAAA,CAAA,IAAA,EAAA,yBAAA,CAAA,EAAA,iBAAA,CAAA,IAAA,EAAA,qBAAA,EAAW,MAAM,CAAA,CAAA;YAGxB,IAAA,CAAA,YAAY,IAAA,iBAAA,CAAA,IAAA,EAAA,0BAAA,CAAA,EAAA,iBAAA,CAAA,IAAA,EAAA,0BAAA,EAAY,IAAI,CAAA,CAAA;YAG5B,IAAA,CAAA,cAAc,IAAA,iBAAA,CAAA,IAAA,EAAA,+BAAA,CAAA,EAAA,iBAAA,CAAA,IAAA,EAAA,4BAAA,EAAY,IAAI,CAAA,CAAA;AAG9B,YAAA,IAAA,CAAA,WAAW,IAAA,iBAAA,CAAA,IAAA,EAAA,iCAAA,CAAA,EAAA,iBAAA,CAAA,IAAA,EAAA,yBAAA,EAAW,CAAC,CAAA,CAAA,CAAC;YAGxB,IAAA,CAAA,SAAS,IAAA,iBAAA,CAAA,IAAA,EAAA,8BAAA,CAAA,EAAA,iBAAA,CAAA,IAAA,EAAA,uBAAA,EAAY,IAAI,CAAA,CAAA;YAEjB,IAAA,CAAA,aAAa,IAAA,iBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA,EAAyB,IAAI,CAAA;YAC1C,IAAA,CAAA,MAAM,GAAuB,IAAI;YACjC,IAAA,CAAA,WAAW,GAAW,EAAE;YACxB,IAAA,CAAA,KAAK,GAAkB,UAAU;YACjC,IAAA,CAAA,SAAS,GAAW,CAAC;YACrB,IAAA,CAAA,UAAU,GAAW,CAAC;YACtB,IAAA,CAAA,QAAQ,GAAW,CAAC;YACpB,IAAA,CAAA,aAAa,GAAkB,IAAI;YACnC,IAAA,CAAA,YAAY,GAAW,EAAE;YACzB,IAAA,CAAA,YAAY,GAAwB,IAAI;YACxC,IAAA,CAAA,QAAQ,GAAwB,IAAI;YACpC,IAAA,CAAA,cAAc,GAAsB,IAAI;YACxC,IAAA,CAAA,cAAc,GAAkB,IAAI;YACpC,IAAA,CAAA,WAAW,GAAW,EAAE;QAkXlC;;;qCApZG,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;AAGpD,YAAA,kBAAA,GAAA,CAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAG1B,YAAA,mBAAA,GAAA,CAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;wCAG1B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAA;0CAGvD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAA;uCAGzD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAA;qCAGrD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;AAkBpD,YAAA,kBAAA,GAAA,CAAA,MAAM,EAAE,CAAA;AAiBR,YAAA,kBAAA,GAAA,CAAA,MAAM,EAAE,CAAA;AAkUR,YAAA,6BAAA,GAAA,CAAA,QAAQ,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAKpE,YAAA,6BAAA,GAAA,CAAA,QAAQ,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAKpE,YAAA,6BAAA,GAAA,CAAA,QAAQ,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAKpE,YAAA,8BAAA,GAAA,CAAA,QAAQ,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAKrE,YAAA,8BAAA,GAAA,CAAA,QAAQ,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAKrE,YAAA,4BAAA,GAAA,CAAA,QAAQ,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AA3WpE,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,QAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,MAAM,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAiBN,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,QAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,MAAM,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAkUN,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,6BAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,mBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAQ,iBAAiB,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAKzB,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,6BAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,mBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAQ,iBAAiB,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAKzB,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,6BAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,mBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAQ,iBAAiB,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAKzB,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,8BAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,oBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAQ,kBAAkB,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAK1B,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,8BAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,oBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAQ,kBAAkB,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;AAK1B,YAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,4BAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,kBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAQ,gBAAgB,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,0BAAA,CAAA;YAhZxB,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,WAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,WAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,SAAS,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAT,SAAS,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,uBAAA,EAAA,4BAAA,CAAA;YAGT,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,QAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,QAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,MAAM,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAN,MAAM,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,oBAAA,EAAA,yBAAA,CAAA;YAGN,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,SAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,SAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,OAAO,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAP,OAAO,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,qBAAA,EAAA,0BAAA,CAAA;YAGP,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,wBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,cAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,cAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,YAAY,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAZ,YAAY,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,0BAAA,EAAA,+BAAA,CAAA;YAGZ,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,0BAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,gBAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,cAAc,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAd,cAAc,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,4BAAA,EAAA,iCAAA,CAAA;YAGd,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,uBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,aAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,WAAW,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAX,WAAW,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,8BAAA,CAAA;YAGX,YAAA,CAAA,IAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,WAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,GAAA,IAAA,WAAA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,CAAA,SAAS,EAAA,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,CAAT,SAAS,GAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,uBAAA,EAAA,4BAAA,CAAA;YApBX,YAAA,CAAA,IAAA,EAAA,gBAAA,GAAA,EAAA,KAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,uBAAA,CAAA;;;YAAa,iBAAA,CAAA,UAAA,EAAA,uBAAA,CAAA;;QAsCX,MAAM,GAAA;AACJ,YAAA,OAAO,GAAG,SAAO,CAAA,EAAG,cAAc,EAAE;QACtC;QAEA,iBAAiB,GAAA;AAEf,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,KAAK,EAAE;YACd;QACF;QAEA,oBAAoB,GAAA;YAElB,IAAI,CAAC,OAAO,EAAE;QAChB;QAGA,MAAM,GAAA;YACJ,OAAO,IAAI,UAAQ;;;AAGgB,qCAAA,EAAA,IAAI,CAAC,KAAK,CAAA;;oBAE7B,IAAI,CAAC,aAAa,EAAE,CAAA;;;;AAI9B,QAAA,EAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACS,sCAAA,EAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SAC7D,GAAG,EAAE;;AAEJ,QAAA,EAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;;AAElD,QAAA,EAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;;AAE9C,QAAA,EAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;AACM,sCAAA,EAAA,IAAI,CAAC,YAAY,CAAA;SAChD,GAAG,EAAE;;AAEJ,QAAA,EAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;;AAEP,wBAAA,EAAA,IAAI,CAAC,WAAW,CAAA;;SAEjC,GAAG,EAAE;;;AAGY,wBAAA,EAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;2BACtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;;;KAGzC;QACH;QAEQ,gBAAgB,GAAA;AACtB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC1C,gBAAA,OAAO,IAAI,UAAQ,CAAA,2CAAA,EAA8C,MAAM,aAAa;AACtF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,IAAI,UAAQ,CAAA,iCAAA,EAAoC,IAAI,QAAQ;QACrE;QAEQ,cAAc,GAAA;AACpB,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE;gBAC7B,OAAO,IAAI,UAAQ;;AAE8B,qDAAA,EAAA,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;;;;;;OAMlE;YACH;AAEA,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE;gBAC9B,OAAO,IAAI,UAAQ;;AAE8B,qDAAA,EAAA,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;;;;;;AAMpB,oDAAA,EAAA,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;;;;;;AAMnB,mDAAA,EAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;;;;;;OAM/D;YACH;AAEA,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;gBAC3B,OAAO,IAAI,UAAQ;;AAE8B,qDAAA,EAAA,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;;;;;;AAMnB,qDAAA,EAAA,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;;;;;AAKrB,mDAAA,EAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;;;;;;OAM/D;YACH;AAEA,YAAA,OAAO,EAAE;QACX;QAEQ,aAAa,GAAA;AACnB,YAAA,QAAQ,IAAI,CAAC,KAAK;AAChB,gBAAA,KAAK,WAAW,EAAE,OAAO,WAAW;AACpC,gBAAA,KAAK,QAAQ,EAAE,OAAO,QAAQ;AAC9B,gBAAA,SAAS,OAAO,OAAO;;QAE3B;AAEQ,QAAA,UAAU,CAAC,OAAe,EAAA;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;YACrC,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;QAClF;AAEQ,QAAA,mBAAmB,CAAC,KAAa,EAAA;YACvC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE;AACtD,gBAAA,OAAO,CAAC;YACV;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,IAAI,EAAE;QAC/B;AAEA,QAAA,MAAM,KAAK,GAAA;AACT,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,gBAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AAErB,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;AAGxE,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE;oBACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE;AAClD,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;AACrE,oBAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,oBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG;AAC3B,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;oBACrE,IAAI,CAAC,gBAAgB,EAAE;gBACzB;AAEA,gBAAA,MAAM,OAAO,GAAyB;oBACpC,QAAQ,EAAE,IAAI,CAAC,MAAM;oBACrB,kBAAkB,EAAE,IAAI,CAAC;iBAC1B;AAED,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;gBAE5D,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,CAAC,KAAK,KAAI;oBAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;wBACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;oBACnC;AACF,gBAAA,CAAC;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,MAAK;oBAC/B,IAAI,CAAC,uBAAuB,EAAE;AAChC,gBAAA,CAAC;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,gBAAA,IAAI,CAAC,KAAK,GAAG,WAAW;AACxB,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;gBAC3B,IAAI,CAAC,UAAU,EAAE;gBAEjB,IAAI,CAAC,iBAAiB,EAAE;YAC1B;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,2BAA2B;AACxF,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC/B;QACF;AAEA,QAAA,MAAM,IAAI,GAAA;YACR,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE;AACpD,gBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;YACxC;AAEA,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;gBAC7B,MAAM,oBAAoB,GAAG,MAAK;AAChC,oBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAErC,oBAAA,MAAM,SAAS,GAAmB;wBAChC,IAAI;wBACJ,GAAG;wBACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,wBAAA,SAAS,EAAE,IAAI,CAAC,GAAG;qBACpB;AAED,oBAAA,IAAI,CAAC,WAAW,GAAG,GAAG;oBACtB,OAAO,CAAC,SAAS,CAAC;AACpB,gBAAA,CAAC;AAED,gBAAA,IAAI,CAAC,aAAc,CAAC,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClF,gBAAA,IAAI,CAAC,aAAc,CAAC,IAAI,EAAE;gBAC1B,IAAI,CAAC,SAAS,EAAE;gBAChB,IAAI,CAAC,OAAO,EAAE;AACd,gBAAA,IAAI,CAAC,KAAK,GAAG,UAAU;AACzB,YAAA,CAAC,CAAC;QACJ;QAEA,KAAK,GAAA;YACH,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE;AACpD,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;AAC5B,gBAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;gBACrB,IAAI,CAAC,SAAS,EAAE;gBAEhB,IAAI,CAAC,iBAAiB,EAAE;YAC1B;QACF;QAEA,MAAM,GAAA;YACJ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;AACjD,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAC3B,gBAAA,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI;AAC3D,gBAAA,IAAI,CAAC,SAAS,IAAI,aAAa,GAAG,IAAI;AACtC,gBAAA,IAAI,CAAC,KAAK,GAAG,WAAW;gBACxB,IAAI,CAAC,UAAU,EAAE;gBAEjB,IAAI,CAAC,kBAAkB,EAAE;YAC3B;QACF;QAEA,MAAM,GAAA;AACJ,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAC3B;AAEA,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE;YACrB,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,UAAU;AACvB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;YAEjB,IAAI,CAAC,kBAAkB,EAAE;QAC3B;QAEA,QAAQ,GAAA;YACN,OAAO,IAAI,CAAC,KAAK;QACnB;QAEA,WAAW,GAAA;YACT,OAAO,IAAI,CAAC,QAAQ;QACtB;QAEA,WAAW,GAAA;AACT,YAAA,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW;QACnC;AAEA,QAAA,QAAQ,CAAC,QAAA,GAAmB,CAAA,UAAA,EAAa,IAAI,CAAC,GAAG,EAAE,CAAA,KAAA,CAAO,EAAA;AACxD,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,gBAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;YAC3C;YAEA,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,YAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW;AACzB,YAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ;YACrB,CAAC,CAAC,KAAK,EAAE;QACX;QAEQ,uBAAuB,GAAA;YAC7B,IAAI,CAAC,gBAAgB,EAAE;QACzB;QAEQ,UAAU,GAAA;YAChB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;AAC3C,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI;AAEpD,gBAAA,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;oBAC7D,IAAI,CAAC,IAAI,EAAE;gBACb;YACF,CAAC,EAAE,GAAG,CAAC;QACT;QAEQ,SAAS,GAAA;AACf,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC/B,gBAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AACjC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YAC3B;QACF;QAEQ,gBAAgB,GAAA;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE;gBACxE;YACF;YAEA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAyC,CAAC;AAElF,YAAA,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5E;QAEQ,OAAO,GAAA;AACb,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AACtD,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;YACpB;AAEA,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YAC1B;AAEA,YAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,gBAAA,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC;AACzC,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;YAC5B;AAEA,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;QAGQ,iBAAiB,GAAA;AACvB,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3B;AAGQ,QAAA,iBAAiB,CAAC,KAAU,EAAA;AAClC,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;QAClC;QAGQ,iBAAiB,GAAA;AACvB,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3B;QAGQ,kBAAkB,GAAA;AACxB,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3B;QAGQ,kBAAkB,GAAA;AACxB,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3B;QAGQ,gBAAgB,GAAA;AACtB,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3B;;;;;;;"}
|
|
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
package/dist/index.esm.js
CHANGED
package/dist/index.iife.js
CHANGED
package/dist/symbols.cjs
CHANGED
package/dist/symbols.esm.js
CHANGED
package/dist/transitions.cjs
CHANGED
package/dist/transitions.esm.js
CHANGED
|
@@ -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.
|
|
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",
|