ng-primitives 0.120.5 → 0.121.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/fesm2022/ng-primitives-a11y.mjs +5 -5
- package/fesm2022/ng-primitives-a11y.mjs.map +1 -1
- package/fesm2022/ng-primitives-accordion.mjs +30 -47
- package/fesm2022/ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/ng-primitives-ai.mjs +39 -52
- package/fesm2022/ng-primitives-ai.mjs.map +1 -1
- package/fesm2022/ng-primitives-autofill.mjs +4 -4
- package/fesm2022/ng-primitives-autofill.mjs.map +1 -1
- package/fesm2022/ng-primitives-avatar.mjs +14 -17
- package/fesm2022/ng-primitives-avatar.mjs.map +1 -1
- package/fesm2022/ng-primitives-breadcrumbs.mjs +21 -21
- package/fesm2022/ng-primitives-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ng-primitives-button.mjs +7 -9
- package/fesm2022/ng-primitives-button.mjs.map +1 -1
- package/fesm2022/ng-primitives-checkbox.mjs +15 -30
- package/fesm2022/ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/ng-primitives-combobox.mjs +60 -92
- package/fesm2022/ng-primitives-combobox.mjs.map +1 -1
- package/fesm2022/ng-primitives-common.mjs +4 -4
- package/fesm2022/ng-primitives-common.mjs.map +1 -1
- package/fesm2022/ng-primitives-context-menu.mjs +66 -119
- package/fesm2022/ng-primitives-context-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-date-picker.mjs +70 -108
- package/fesm2022/ng-primitives-date-picker.mjs.map +1 -1
- package/fesm2022/ng-primitives-dialog.mjs +33 -49
- package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/ng-primitives-file-upload.mjs +26 -53
- package/fesm2022/ng-primitives-file-upload.mjs.map +1 -1
- package/fesm2022/ng-primitives-focus-trap.mjs +5 -8
- package/fesm2022/ng-primitives-focus-trap.mjs.map +1 -1
- package/fesm2022/ng-primitives-form-field.mjs +39 -44
- package/fesm2022/ng-primitives-form-field.mjs.map +1 -1
- package/fesm2022/ng-primitives-input-otp.mjs +30 -43
- package/fesm2022/ng-primitives-input-otp.mjs.map +1 -1
- package/fesm2022/ng-primitives-input.mjs +6 -8
- package/fesm2022/ng-primitives-input.mjs.map +1 -1
- package/fesm2022/ng-primitives-interactions.mjs +31 -48
- package/fesm2022/ng-primitives-interactions.mjs.map +1 -1
- package/fesm2022/ng-primitives-internal.mjs +12 -12
- package/fesm2022/ng-primitives-internal.mjs.map +1 -1
- package/fesm2022/ng-primitives-listbox.mjs +34 -48
- package/fesm2022/ng-primitives-listbox.mjs.map +1 -1
- package/fesm2022/ng-primitives-menu.mjs +83 -149
- package/fesm2022/ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-meter.mjs +25 -36
- package/fesm2022/ng-primitives-meter.mjs.map +1 -1
- package/fesm2022/ng-primitives-navigation-menu.mjs +60 -108
- package/fesm2022/ng-primitives-navigation-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-number-field.mjs +35 -59
- package/fesm2022/ng-primitives-number-field.mjs.map +1 -1
- package/fesm2022/ng-primitives-pagination.mjs +270 -297
- package/fesm2022/ng-primitives-pagination.mjs.map +1 -1
- package/fesm2022/ng-primitives-popover.mjs +42 -87
- package/fesm2022/ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/ng-primitives-portal.mjs +81 -57
- package/fesm2022/ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/ng-primitives-progress.mjs +30 -41
- package/fesm2022/ng-primitives-progress.mjs.map +1 -1
- package/fesm2022/ng-primitives-radio.mjs +20 -30
- package/fesm2022/ng-primitives-radio.mjs.map +1 -1
- package/fesm2022/ng-primitives-resize.mjs +3 -3
- package/fesm2022/ng-primitives-resize.mjs.map +1 -1
- package/fesm2022/ng-primitives-roving-focus.mjs +20 -34
- package/fesm2022/ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/ng-primitives-search.mjs +9 -9
- package/fesm2022/ng-primitives-search.mjs.map +1 -1
- package/fesm2022/ng-primitives-select.mjs +50 -81
- package/fesm2022/ng-primitives-select.mjs.map +1 -1
- package/fesm2022/ng-primitives-separator.mjs +4 -6
- package/fesm2022/ng-primitives-separator.mjs.map +1 -1
- package/fesm2022/ng-primitives-slider.mjs +63 -100
- package/fesm2022/ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/ng-primitives-state.mjs +3 -3
- package/fesm2022/ng-primitives-state.mjs.map +1 -1
- package/fesm2022/ng-primitives-switch.mjs +15 -21
- package/fesm2022/ng-primitives-switch.mjs.map +1 -1
- package/fesm2022/ng-primitives-tabs.mjs +31 -41
- package/fesm2022/ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/ng-primitives-textarea.mjs +5 -7
- package/fesm2022/ng-primitives-textarea.mjs.map +1 -1
- package/fesm2022/ng-primitives-toast.mjs +19 -19
- package/fesm2022/ng-primitives-toast.mjs.map +1 -1
- package/fesm2022/ng-primitives-toggle-group.mjs +20 -36
- package/fesm2022/ng-primitives-toggle-group.mjs.map +1 -1
- package/fesm2022/ng-primitives-toggle.mjs +10 -19
- package/fesm2022/ng-primitives-toggle.mjs.map +1 -1
- package/fesm2022/ng-primitives-toolbar.mjs +4 -6
- package/fesm2022/ng-primitives-toolbar.mjs.map +1 -1
- package/fesm2022/ng-primitives-tooltip.mjs +401 -402
- package/fesm2022/ng-primitives-tooltip.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +5 -4
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/package.json +56 -55
- package/{a11y/index.d.ts → types/ng-primitives-a11y.d.ts} +15 -14
- package/{accordion/index.d.ts → types/ng-primitives-accordion.d.ts} +78 -77
- package/{button/index.d.ts → types/ng-primitives-button.d.ts} +21 -20
- package/{checkbox/index.d.ts → types/ng-primitives-checkbox.d.ts} +67 -66
- package/{combobox/index.d.ts → types/ng-primitives-combobox.d.ts} +35 -35
- package/{date-picker/index.d.ts → types/ng-primitives-date-picker.d.ts} +2 -2
- package/{number-field/index.d.ts → types/ng-primitives-number-field.d.ts} +72 -71
- package/types/ng-primitives-pagination.d.ts +502 -0
- package/{popover/index.d.ts → types/ng-primitives-popover.d.ts} +3 -2
- package/{portal/index.d.ts → types/ng-primitives-portal.d.ts} +19 -3
- package/{roving-focus/index.d.ts → types/ng-primitives-roving-focus.d.ts} +61 -60
- package/{select/index.d.ts → types/ng-primitives-select.d.ts} +39 -38
- package/{slider/index.d.ts → types/ng-primitives-slider.d.ts} +59 -58
- package/{switch/index.d.ts → types/ng-primitives-switch.d.ts} +45 -44
- package/{toast/index.d.ts → types/ng-primitives-toast.d.ts} +2 -1
- package/{toggle-group/index.d.ts → types/ng-primitives-toggle-group.d.ts} +69 -68
- package/{toggle/index.d.ts → types/ng-primitives-toggle.d.ts} +48 -47
- package/types/ng-primitives-tooltip.d.ts +691 -0
- package/pagination/index.d.ts +0 -211
- package/tooltip/index.d.ts +0 -376
- /package/{ai/index.d.ts → types/ng-primitives-ai.d.ts} +0 -0
- /package/{autofill/index.d.ts → types/ng-primitives-autofill.d.ts} +0 -0
- /package/{avatar/index.d.ts → types/ng-primitives-avatar.d.ts} +0 -0
- /package/{breadcrumbs/index.d.ts → types/ng-primitives-breadcrumbs.d.ts} +0 -0
- /package/{common/index.d.ts → types/ng-primitives-common.d.ts} +0 -0
- /package/{context-menu/index.d.ts → types/ng-primitives-context-menu.d.ts} +0 -0
- /package/{date-time-luxon/index.d.ts → types/ng-primitives-date-time-luxon.d.ts} +0 -0
- /package/{date-time/index.d.ts → types/ng-primitives-date-time.d.ts} +0 -0
- /package/{dialog/index.d.ts → types/ng-primitives-dialog.d.ts} +0 -0
- /package/{file-upload/index.d.ts → types/ng-primitives-file-upload.d.ts} +0 -0
- /package/{focus-trap/index.d.ts → types/ng-primitives-focus-trap.d.ts} +0 -0
- /package/{form-field/index.d.ts → types/ng-primitives-form-field.d.ts} +0 -0
- /package/{input-otp/index.d.ts → types/ng-primitives-input-otp.d.ts} +0 -0
- /package/{input/index.d.ts → types/ng-primitives-input.d.ts} +0 -0
- /package/{interactions/index.d.ts → types/ng-primitives-interactions.d.ts} +0 -0
- /package/{internal/index.d.ts → types/ng-primitives-internal.d.ts} +0 -0
- /package/{listbox/index.d.ts → types/ng-primitives-listbox.d.ts} +0 -0
- /package/{menu/index.d.ts → types/ng-primitives-menu.d.ts} +0 -0
- /package/{meter/index.d.ts → types/ng-primitives-meter.d.ts} +0 -0
- /package/{navigation-menu/index.d.ts → types/ng-primitives-navigation-menu.d.ts} +0 -0
- /package/{progress/index.d.ts → types/ng-primitives-progress.d.ts} +0 -0
- /package/{radio/index.d.ts → types/ng-primitives-radio.d.ts} +0 -0
- /package/{resize/index.d.ts → types/ng-primitives-resize.d.ts} +0 -0
- /package/{search/index.d.ts → types/ng-primitives-search.d.ts} +0 -0
- /package/{separator/index.d.ts → types/ng-primitives-separator.d.ts} +0 -0
- /package/{state/index.d.ts → types/ng-primitives-state.d.ts} +0 -0
- /package/{tabs/index.d.ts → types/ng-primitives-tabs.d.ts} +0 -0
- /package/{textarea/index.d.ts → types/ng-primitives-textarea.d.ts} +0 -0
- /package/{toolbar/index.d.ts → types/ng-primitives-toolbar.d.ts} +0 -0
- /package/{utils/index.d.ts → types/ng-primitives-utils.d.ts} +0 -0
- /package/{index.d.ts → types/ng-primitives.d.ts} +0 -0
|
@@ -97,10 +97,10 @@ class NgpPromptComposerInput {
|
|
|
97
97
|
}
|
|
98
98
|
this.composer().submitPrompt();
|
|
99
99
|
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
101
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
100
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposerInput, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
101
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpPromptComposerInput, isStandalone: true, selector: "input[ngpPromptComposerInput], textarea[ngpPromptComposerInput]", host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, providers: [providePromptComposerInputState()], exportAs: ["ngpPromptComposerInput"], ngImport: i0 }); }
|
|
102
102
|
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposerInput, decorators: [{
|
|
104
104
|
type: Directive,
|
|
105
105
|
args: [{
|
|
106
106
|
selector: 'input[ngpPromptComposerInput], textarea[ngpPromptComposerInput]',
|
|
@@ -133,11 +133,9 @@ class NgpPromptComposerSubmit {
|
|
|
133
133
|
constructor() {
|
|
134
134
|
this.composer = injectPromptComposerState();
|
|
135
135
|
/** Whether the submit button should be disabled */
|
|
136
|
-
this.disabled = input(false, ...(ngDevMode ?
|
|
137
|
-
transform: booleanAttribute,
|
|
138
|
-
}]));
|
|
136
|
+
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
139
137
|
/** Whether dictation is currently active */
|
|
140
|
-
this.isDictating = computed(() => this.composer().isDictating(), ...(ngDevMode ? [{ debugName: "isDictating" }] : []));
|
|
138
|
+
this.isDictating = computed(() => this.composer().isDictating(), ...(ngDevMode ? [{ debugName: "isDictating" }] : /* istanbul ignore next */ []));
|
|
141
139
|
/** The state of the prompt composer submit. */
|
|
142
140
|
this.state = promptComposerSubmitState(this);
|
|
143
141
|
ngpButton({
|
|
@@ -147,10 +145,10 @@ class NgpPromptComposerSubmit {
|
|
|
147
145
|
onClick() {
|
|
148
146
|
this.composer().submitPrompt();
|
|
149
147
|
}
|
|
150
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
151
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
148
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposerSubmit, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
149
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpPromptComposerSubmit, isStandalone: true, selector: "button[ngpPromptComposerSubmit]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "onClick()" }, properties: { "attr.data-prompt": "composer().hasPrompt() ? \"\" : null", "attr.data-dictating": "isDictating() ? \"\" : null", "attr.data-dictation-supported": "composer().dictationSupported ? \"\" : null" } }, providers: [providePromptComposerSubmitState()], exportAs: ["ngpPromptComposerSubmit"], ngImport: i0 }); }
|
|
152
150
|
}
|
|
153
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposerSubmit, decorators: [{
|
|
154
152
|
type: Directive,
|
|
155
153
|
args: [{
|
|
156
154
|
selector: 'button[ngpPromptComposerSubmit]',
|
|
@@ -174,11 +172,11 @@ class NgpPromptComposer {
|
|
|
174
172
|
/** Emits whenever the user submits the prompt. */
|
|
175
173
|
this.submit = output({ alias: 'ngpPromptComposerSubmit' });
|
|
176
174
|
/** @internal Store the current prompt text. */
|
|
177
|
-
this.prompt = signal('', ...(ngDevMode ? [{ debugName: "prompt" }] : []));
|
|
175
|
+
this.prompt = signal('', ...(ngDevMode ? [{ debugName: "prompt" }] : /* istanbul ignore next */ []));
|
|
178
176
|
/** @internal Track whether the prompt is currently being dictated */
|
|
179
|
-
this.isDictating = signal(false, ...(ngDevMode ? [{ debugName: "isDictating" }] : []));
|
|
177
|
+
this.isDictating = signal(false, ...(ngDevMode ? [{ debugName: "isDictating" }] : /* istanbul ignore next */ []));
|
|
180
178
|
/** @internal Determine whether the prompt input has content */
|
|
181
|
-
this.hasPrompt = computed(() => this.prompt().trim().length > 0, ...(ngDevMode ? [{ debugName: "hasPrompt" }] : []));
|
|
179
|
+
this.hasPrompt = computed(() => this.prompt().trim().length > 0, ...(ngDevMode ? [{ debugName: "hasPrompt" }] : /* istanbul ignore next */ []));
|
|
182
180
|
/** Whether dictation is supported by the browser */
|
|
183
181
|
this.dictationSupported = !!(globalThis.SpeechRecognition || globalThis.webkitSpeechRecognition);
|
|
184
182
|
/** The state of the prompt composer. */
|
|
@@ -195,10 +193,10 @@ class NgpPromptComposer {
|
|
|
195
193
|
this.thread().scrollToBottom('smooth');
|
|
196
194
|
}
|
|
197
195
|
}
|
|
198
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
199
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
196
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
197
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpPromptComposer, isStandalone: true, selector: "[ngpPromptComposer]", outputs: { submit: "ngpPromptComposerSubmit" }, host: { properties: { "attr.data-prompt": "hasPrompt() ? \"\" : null", "attr.data-dictating": "isDictating() ? \"\" : null", "attr.data-dictation-supported": "dictationSupported ? \"\" : null" } }, providers: [providePromptComposerState()], exportAs: ["ngpPromptComposer"], ngImport: i0 }); }
|
|
200
198
|
}
|
|
201
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
199
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposer, decorators: [{
|
|
202
200
|
type: Directive,
|
|
203
201
|
args: [{
|
|
204
202
|
selector: '[ngpPromptComposer]',
|
|
@@ -253,10 +251,10 @@ class NgpThreadMessage {
|
|
|
253
251
|
this.thread().registerMessage(this);
|
|
254
252
|
this.destroyRef.onDestroy(() => this.thread().unregisterMessage(this));
|
|
255
253
|
}
|
|
256
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
257
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
254
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThreadMessage, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
255
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpThreadMessage, isStandalone: true, selector: "[ngpThreadMessage]", providers: [provideThreadMessageState()], exportAs: ["ngpThreadMessage"], ngImport: i0 }); }
|
|
258
256
|
}
|
|
259
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThreadMessage, decorators: [{
|
|
260
258
|
type: Directive,
|
|
261
259
|
args: [{
|
|
262
260
|
selector: '[ngpThreadMessage]',
|
|
@@ -294,10 +292,10 @@ class NgpThread {
|
|
|
294
292
|
setPrompt(value) {
|
|
295
293
|
this.requestPrompt.next(value);
|
|
296
294
|
}
|
|
297
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
298
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
295
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThread, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
296
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpThread, isStandalone: true, selector: "[ngpThread]", providers: [provideThreadState()], exportAs: ["ngpThread"], ngImport: i0 }); }
|
|
299
297
|
}
|
|
300
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThread, decorators: [{
|
|
301
299
|
type: Directive,
|
|
302
300
|
args: [{
|
|
303
301
|
selector: '[ngpThread]',
|
|
@@ -327,13 +325,11 @@ class NgpPromptComposerDictation {
|
|
|
327
325
|
constructor() {
|
|
328
326
|
this.composer = injectPromptComposerState();
|
|
329
327
|
this.recognition = null;
|
|
330
|
-
this.basePrompt = signal('', ...(ngDevMode ? [{ debugName: "basePrompt" }] : [])); // Store the prompt before dictation started
|
|
328
|
+
this.basePrompt = signal('', ...(ngDevMode ? [{ debugName: "basePrompt" }] : /* istanbul ignore next */ [])); // Store the prompt before dictation started
|
|
331
329
|
/** Whether the submit button should be disabled. */
|
|
332
|
-
this.disabled = input(false, ...(ngDevMode ?
|
|
333
|
-
transform: booleanAttribute,
|
|
334
|
-
}]));
|
|
330
|
+
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
335
331
|
/** Whether dictation is currently active */
|
|
336
|
-
this.isDictating = computed(() => this.composer().isDictating(), ...(ngDevMode ? [{ debugName: "isDictating" }] : []));
|
|
332
|
+
this.isDictating = computed(() => this.composer().isDictating(), ...(ngDevMode ? [{ debugName: "isDictating" }] : /* istanbul ignore next */ []));
|
|
337
333
|
/** The state of the prompt composer. */
|
|
338
334
|
this.state = promptComposerDictationState(this);
|
|
339
335
|
ngpButton({
|
|
@@ -416,10 +412,10 @@ class NgpPromptComposerDictation {
|
|
|
416
412
|
this.recognition.stop();
|
|
417
413
|
}
|
|
418
414
|
}
|
|
419
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
420
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
415
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposerDictation, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
416
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpPromptComposerDictation, isStandalone: true, selector: "button[ngpPromptComposerDictation]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "onClick()", "document:keydown": "onKeydown($event)" }, properties: { "attr.data-dictating": "isDictating() ? \"\" : null", "attr.data-dictation-supported": "composer().dictationSupported ? \"\" : null", "attr.data-prompt": "composer().hasPrompt() ? \"\" : null" } }, providers: [providePromptComposerDictationState()], exportAs: ["ngpPromptComposerDictation"], ngImport: i0 }); }
|
|
421
417
|
}
|
|
422
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
418
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpPromptComposerDictation, decorators: [{
|
|
423
419
|
type: Directive,
|
|
424
420
|
args: [{
|
|
425
421
|
selector: 'button[ngpPromptComposerDictation]',
|
|
@@ -469,19 +465,13 @@ class NgpThreadViewport {
|
|
|
469
465
|
*
|
|
470
466
|
* @default 70
|
|
471
467
|
*/
|
|
472
|
-
this.threshold = input(70, ...(ngDevMode ?
|
|
473
|
-
|
|
474
|
-
alias: 'ngpThreadViewportThreshold',
|
|
475
|
-
transform: numberAttribute,
|
|
476
|
-
}]));
|
|
468
|
+
this.threshold = input(70, { ...(ngDevMode ? { debugName: "threshold" } : /* istanbul ignore next */ {}), alias: 'ngpThreadViewportThreshold',
|
|
469
|
+
transform: numberAttribute });
|
|
477
470
|
/**
|
|
478
471
|
* Whether the thread should automatically scroll to the bottom when new content is added.
|
|
479
472
|
*/
|
|
480
|
-
this.autoScroll = input(true, ...(ngDevMode ?
|
|
481
|
-
|
|
482
|
-
alias: 'ngpThreadViewportAutoScroll',
|
|
483
|
-
transform: booleanAttribute,
|
|
484
|
-
}]));
|
|
473
|
+
this.autoScroll = input(true, { ...(ngDevMode ? { debugName: "autoScroll" } : /* istanbul ignore next */ {}), alias: 'ngpThreadViewportAutoScroll',
|
|
474
|
+
transform: booleanAttribute });
|
|
485
475
|
/** Store the last known scroll position */
|
|
486
476
|
this.lastScrollTop = 0;
|
|
487
477
|
/** Determine if we are at the bottom of the scrollable container (within the threshold) */
|
|
@@ -522,10 +512,10 @@ class NgpThreadViewport {
|
|
|
522
512
|
}
|
|
523
513
|
this.lastScrollTop = element.scrollTop;
|
|
524
514
|
}
|
|
525
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
526
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
515
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThreadViewport, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
516
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpThreadViewport, isStandalone: true, selector: "[ngpThreadViewport]", inputs: { threshold: { classPropertyName: "threshold", publicName: "ngpThreadViewportThreshold", isSignal: true, isRequired: false, transformFunction: null }, autoScroll: { classPropertyName: "autoScroll", publicName: "ngpThreadViewportAutoScroll", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "scroll": "onScroll()" } }, providers: [provideThreadViewportState()], exportAs: ["ngpThreadViewport"], ngImport: i0 }); }
|
|
527
517
|
}
|
|
528
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
518
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThreadViewport, decorators: [{
|
|
529
519
|
type: Directive,
|
|
530
520
|
args: [{
|
|
531
521
|
selector: '[ngpThreadViewport]',
|
|
@@ -558,13 +548,10 @@ class NgpThreadSuggestion {
|
|
|
558
548
|
constructor() {
|
|
559
549
|
this.thread = injectThreadState();
|
|
560
550
|
/** The suggested text to display in the input field. */
|
|
561
|
-
this.suggestion = input('', ...(ngDevMode ?
|
|
551
|
+
this.suggestion = input('', { ...(ngDevMode ? { debugName: "suggestion" } : /* istanbul ignore next */ {}), alias: 'ngpThreadSuggestion' });
|
|
562
552
|
/** Whether the suggestion should populate the prompt when clicked. */
|
|
563
|
-
this.setPromptOnClick = input(true, ...(ngDevMode ?
|
|
564
|
-
|
|
565
|
-
alias: 'ngpThreadSuggestionSetPromptOnClick',
|
|
566
|
-
transform: booleanAttribute,
|
|
567
|
-
}]));
|
|
553
|
+
this.setPromptOnClick = input(true, { ...(ngDevMode ? { debugName: "setPromptOnClick" } : /* istanbul ignore next */ {}), alias: 'ngpThreadSuggestionSetPromptOnClick',
|
|
554
|
+
transform: booleanAttribute });
|
|
568
555
|
/** The state of the thread suggestion. */
|
|
569
556
|
this.state = threadSuggestionState(this);
|
|
570
557
|
}
|
|
@@ -573,10 +560,10 @@ class NgpThreadSuggestion {
|
|
|
573
560
|
this.thread().setPrompt(this.state.suggestion());
|
|
574
561
|
}
|
|
575
562
|
}
|
|
576
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
577
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
563
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThreadSuggestion, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
564
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpThreadSuggestion, isStandalone: true, selector: "button[ngpThreadSuggestion]", inputs: { suggestion: { classPropertyName: "suggestion", publicName: "ngpThreadSuggestion", isSignal: true, isRequired: false, transformFunction: null }, setPromptOnClick: { classPropertyName: "setPromptOnClick", publicName: "ngpThreadSuggestionSetPromptOnClick", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "submitSuggestion()" } }, providers: [provideThreadSuggestionState()], exportAs: ["ngpThreadSuggestion"], ngImport: i0 }); }
|
|
578
565
|
}
|
|
579
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
566
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpThreadSuggestion, decorators: [{
|
|
580
567
|
type: Directive,
|
|
581
568
|
args: [{
|
|
582
569
|
selector: 'button[ngpThreadSuggestion]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-ai.mjs","sources":["../../../../packages/ng-primitives/ai/src/prompt-composer/prompt-composer-state.ts","../../../../packages/ng-primitives/ai/src/thread/thread-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-input/prompt-composer-input-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-input/prompt-composer-input.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-submit/prompt-composer-submit-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-submit/prompt-composer-submit.ts","../../../../packages/ng-primitives/ai/src/prompt-composer/prompt-composer.ts","../../../../packages/ng-primitives/ai/src/thread-message/thread-message-state.ts","../../../../packages/ng-primitives/ai/src/thread-message/thread-message.ts","../../../../packages/ng-primitives/ai/src/thread/thread.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-dictation/prompt-composer-dictation-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-dictation/prompt-composer-dictation.ts","../../../../packages/ng-primitives/ai/src/thread-viewport/thread-viewport-state.ts","../../../../packages/ng-primitives/ai/src/thread-viewport/thread-viewport.ts","../../../../packages/ng-primitives/ai/src/thread-suggestion/thread-suggestion-state.ts","../../../../packages/ng-primitives/ai/src/thread-suggestion/thread-suggestion.ts","../../../../packages/ng-primitives/ai/src/ng-primitives-ai.ts"],"sourcesContent":["import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposer } from './prompt-composer';\n\n/**\n * The state token for the PromptComposer primitive.\n */\nexport const NgpPromptComposerStateToken = createStateToken<NgpPromptComposer>('PromptComposer');\n\n/**\n * Provides the PromptComposer state.\n */\nexport const providePromptComposerState = createStateProvider(NgpPromptComposerStateToken);\n\n/**\n * Injects the PromptComposer state.\n */\nexport const injectPromptComposerState = createStateInjector<NgpPromptComposer>(\n NgpPromptComposerStateToken,\n);\n\n/**\n * The PromptComposer state registration function.\n */\nexport const promptComposerState = createState(NgpPromptComposerStateToken);\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThread } from './thread';\n\n/**\n * The state token for the Thread primitive.\n */\nexport const NgpThreadStateToken = createStateToken<NgpThread>('Thread');\n\n/**\n * Provides the Thread state.\n */\nexport const provideThreadState = createStateProvider(NgpThreadStateToken);\n\n/**\n * Injects the Thread state.\n */\nexport const injectThreadState = createStateInjector<NgpThread>(NgpThreadStateToken);\n\n/**\n * The Thread state registration function.\n */\nexport const threadState = createState(NgpThreadStateToken);\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposerInput } from './prompt-composer-input';\n\n/**\n * The state token for the PromptComposerInput primitive.\n */\nexport const NgpPromptComposerInputStateToken =\n createStateToken<NgpPromptComposerInput>('PromptComposerInput');\n\n/**\n * Provides the PromptComposerInput state.\n */\nexport const providePromptComposerInputState = createStateProvider(\n NgpPromptComposerInputStateToken,\n);\n\n/**\n * Injects the PromptComposerInput state.\n */\nexport const injectPromptComposerInputState = createStateInjector<NgpPromptComposerInput>(\n NgpPromptComposerInputStateToken,\n);\n\n/**\n * The PromptComposerInput state registration function.\n */\nexport const promptComposerInputState = createState(NgpPromptComposerInputStateToken);\n","import { Directive, HostListener } from '@angular/core';\nimport { explicitEffect, injectElementRef } from 'ng-primitives/internal';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { fromEvent } from 'rxjs';\nimport { injectPromptComposerState } from '../prompt-composer/prompt-composer-state';\nimport { injectThreadState } from '../thread/thread-state';\nimport {\n promptComposerInputState,\n providePromptComposerInputState,\n} from './prompt-composer-input-state';\n\n@Directive({\n selector: 'input[ngpPromptComposerInput], textarea[ngpPromptComposerInput]',\n exportAs: 'ngpPromptComposerInput',\n providers: [providePromptComposerInputState()],\n})\nexport class NgpPromptComposerInput {\n protected readonly thread = injectThreadState();\n private readonly composer = injectPromptComposerState();\n private readonly element = injectElementRef<HTMLInputElement | HTMLTextAreaElement>();\n\n /** The state of the prompt composer input. */\n protected readonly state = promptComposerInputState<NgpPromptComposerInput>(this);\n\n constructor() {\n // set the initial state\n this.composer().prompt.set(this.element.nativeElement.value);\n\n // listen for requests to set the prompt\n this.thread()\n .requestPrompt.pipe(safeTakeUntilDestroyed())\n .subscribe(value => {\n // set the cursor to the end\n this.composer().prompt.set(value);\n this.element.nativeElement.setSelectionRange(value.length, value.length);\n this.element.nativeElement.focus();\n });\n\n // listen for changes to the text content\n fromEvent(this.element.nativeElement, 'input')\n .pipe(safeTakeUntilDestroyed())\n .subscribe(() => this.composer().prompt.set(this.element.nativeElement.value));\n\n // any time the prompt changes, update the input value if needed\n explicitEffect(\n [this.composer().prompt],\n ([prompt]) => (this.element.nativeElement.value = prompt),\n );\n }\n\n /**\n * If the user presses Enter, the form will be submitted, unless they are holding Shift.\n * This directive automatically handles that behavior.\n */\n @HostListener('keydown.enter', ['$event'])\n protected onEnterKey(event: Event): void {\n if (event instanceof KeyboardEvent === false || event.shiftKey) {\n return;\n }\n\n event.preventDefault();\n\n // if there is no text content, do nothing\n if (this.element.nativeElement.value.trim().length === 0) {\n return;\n }\n\n this.composer().submitPrompt();\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposerSubmit } from './prompt-composer-submit';\n\n/**\n * The state token for the PromptComposerSubmit primitive.\n */\nexport const NgpPromptComposerSubmitStateToken =\n createStateToken<NgpPromptComposerSubmit>('PromptComposerSubmit');\n\n/**\n * Provides the PromptComposerSubmit state.\n */\nexport const providePromptComposerSubmitState = createStateProvider(\n NgpPromptComposerSubmitStateToken,\n);\n\n/**\n * Injects the PromptComposerSubmit state.\n */\nexport const injectPromptComposerSubmitState = createStateInjector<NgpPromptComposerSubmit>(\n NgpPromptComposerSubmitStateToken,\n);\n\n/**\n * The PromptComposerSubmit state registration function.\n */\nexport const promptComposerSubmitState = createState(NgpPromptComposerSubmitStateToken);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, computed, Directive, HostListener, input } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectPromptComposerState } from '../prompt-composer/prompt-composer-state';\nimport {\n promptComposerSubmitState,\n providePromptComposerSubmitState,\n} from './prompt-composer-submit-state';\n\n@Directive({\n selector: 'button[ngpPromptComposerSubmit]',\n exportAs: 'ngpPromptComposerSubmit',\n providers: [providePromptComposerSubmitState()],\n host: {\n type: 'button',\n '[attr.data-prompt]': 'composer().hasPrompt() ? \"\" : null',\n '[attr.data-dictating]': 'isDictating() ? \"\" : null',\n '[attr.data-dictation-supported]': 'composer().dictationSupported ? \"\" : null',\n },\n})\nexport class NgpPromptComposerSubmit {\n protected readonly composer = injectPromptComposerState();\n\n /** Whether the submit button should be disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Whether dictation is currently active */\n readonly isDictating = computed(() => this.composer().isDictating());\n\n /** The state of the prompt composer submit. */\n protected readonly state = promptComposerSubmitState<NgpPromptComposerSubmit>(this);\n\n constructor() {\n ngpButton({\n disabled: computed(() => this.state.disabled() || this.composer().hasPrompt() === false),\n });\n }\n\n @HostListener('click')\n protected onClick(): void {\n this.composer().submitPrompt();\n }\n}\n","import { computed, Directive, output, signal } from '@angular/core';\nimport { injectThreadState } from '../thread/thread-state';\nimport { promptComposerState, providePromptComposerState } from './prompt-composer-state';\n\n@Directive({\n selector: '[ngpPromptComposer]',\n exportAs: 'ngpPromptComposer',\n providers: [providePromptComposerState()],\n host: {\n '[attr.data-prompt]': 'hasPrompt() ? \"\" : null',\n '[attr.data-dictating]': 'isDictating() ? \"\" : null',\n '[attr.data-dictation-supported]': 'dictationSupported ? \"\" : null',\n },\n})\nexport class NgpPromptComposer {\n private readonly thread = injectThreadState();\n\n /** Emits whenever the user submits the prompt. */\n readonly submit = output<string>({ alias: 'ngpPromptComposerSubmit' });\n\n /** @internal Store the current prompt text. */\n readonly prompt = signal<string>('');\n\n /** @internal Track whether the prompt is currently being dictated */\n readonly isDictating = signal<boolean>(false);\n\n /** @internal Determine whether the prompt input has content */\n readonly hasPrompt = computed(() => this.prompt().trim().length > 0);\n\n /** Whether dictation is supported by the browser */\n readonly dictationSupported = !!(\n (globalThis as any).SpeechRecognition || (globalThis as any).webkitSpeechRecognition\n );\n\n /** The state of the prompt composer. */\n protected readonly state = promptComposerState<NgpPromptComposer>(this);\n\n /**\n * @internal\n * Submits the current prompt if there is content, and clears the input.\n */\n submitPrompt(): void {\n if (this.hasPrompt()) {\n this.submit.emit(this.prompt());\n this.prompt.set('');\n this.thread().scrollToBottom('smooth');\n }\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThreadMessage } from './thread-message';\n\n/**\n * The state token for the ThreadMessage primitive.\n */\nexport const NgpThreadMessageStateToken = createStateToken<NgpThreadMessage>('ThreadMessage');\n\n/**\n * Provides the ThreadMessage state.\n */\nexport const provideThreadMessageState = createStateProvider(NgpThreadMessageStateToken);\n\n/**\n * Injects the ThreadMessage state.\n */\nexport const injectThreadMessageState = createStateInjector<NgpThreadMessage>(\n NgpThreadMessageStateToken,\n);\n\n/**\n * The ThreadMessage state registration function.\n */\nexport const threadMessageState = createState(NgpThreadMessageStateToken);\n","import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { fromMutationObserver } from 'ng-primitives/internal';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { injectThreadState } from '../thread/thread-state';\nimport { provideThreadMessageState, threadMessageState } from './thread-message-state';\n\n@Directive({\n selector: '[ngpThreadMessage]',\n exportAs: 'ngpThreadMessage',\n providers: [provideThreadMessageState()],\n})\nexport class NgpThreadMessage {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly thread = injectThreadState();\n\n /** The state of the thread message. */\n protected readonly state = threadMessageState<NgpThreadMessage>(this);\n\n constructor() {\n // Watch for content changes (like streaming text) and maintain scroll position\n fromMutationObserver(this.elementRef.nativeElement, {\n childList: true, // Watch for new/removed child nodes\n subtree: true, // Watch changes in all descendants\n characterData: true, // Watch for text content changes in text nodes\n attributes: false, // We don't care about attribute changes for content streaming\n })\n .pipe(safeTakeUntilDestroyed())\n .subscribe(() => {\n // if this is the last message, scroll to bottom\n if (this.thread().isLastMessage(this)) {\n this.thread().scrollToBottom('smooth');\n }\n });\n\n this.thread().registerMessage(this);\n this.destroyRef.onDestroy(() => this.thread().unregisterMessage(this));\n }\n}\n","import { Directive } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { NgpThreadMessage } from '../thread-message/thread-message';\nimport { provideThreadState, threadState } from './thread-state';\n\n@Directive({\n selector: '[ngpThread]',\n exportAs: 'ngpThread',\n providers: [provideThreadState()],\n})\nexport class NgpThread {\n private messages: NgpThreadMessage[] = [];\n\n /** @internal emit event to trigger scrolling to bottom */\n readonly scrollRequest = new Subject<ScrollBehavior>();\n\n /** @internal emit event to trigger setting the prompt */\n readonly requestPrompt = new Subject<string>();\n\n /** The state of the thread. */\n protected readonly state = threadState<NgpThread>(this);\n\n scrollToBottom(behavior: ScrollBehavior): void {\n this.scrollRequest.next(behavior);\n }\n\n /** @internal Register a message with the thread */\n registerMessage(message: NgpThreadMessage): void {\n this.messages.push(message);\n }\n\n /** @internal Unregister a message from the thread */\n unregisterMessage(message: NgpThreadMessage): void {\n this.messages = this.messages.filter(m => m !== message);\n }\n\n /** @internal Determine if the given message is the last message in the thread */\n isLastMessage(message: NgpThreadMessage): boolean {\n return this.messages.length > 0 && this.messages[this.messages.length - 1] === message;\n }\n\n /** @internal Set the prompt text in the associated prompt composer */\n setPrompt(value: string): void {\n this.requestPrompt.next(value);\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposerDictation } from './prompt-composer-dictation';\n\n/**\n * The state token for the PromptComposerDictation primitive.\n */\nexport const NgpPromptComposerDictationStateToken =\n createStateToken<NgpPromptComposerDictation>('PromptComposerDictation');\n\n/**\n * Provides the PromptComposerDictation state.\n */\nexport const providePromptComposerDictationState = createStateProvider(\n NgpPromptComposerDictationStateToken,\n);\n\n/**\n * Injects the PromptComposerDictation state.\n */\nexport const injectPromptComposerDictationState = createStateInjector<NgpPromptComposerDictation>(\n NgpPromptComposerDictationStateToken,\n);\n\n/**\n * The PromptComposerDictation state registration function.\n */\nexport const promptComposerDictationState = createState(NgpPromptComposerDictationStateToken);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n HostListener,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectPromptComposerState } from '../prompt-composer/prompt-composer-state';\nimport {\n promptComposerDictationState,\n providePromptComposerDictationState,\n} from './prompt-composer-dictation-state';\n\ndeclare global {\n interface Window {\n SpeechRecognition: any;\n webkitSpeechRecognition: any;\n }\n}\n\n@Directive({\n selector: 'button[ngpPromptComposerDictation]',\n exportAs: 'ngpPromptComposerDictation',\n providers: [providePromptComposerDictationState()],\n host: {\n type: 'button',\n '[attr.data-dictating]': 'isDictating() ? \"\" : null',\n '[attr.data-dictation-supported]': 'composer().dictationSupported ? \"\" : null',\n '[attr.data-prompt]': 'composer().hasPrompt() ? \"\" : null',\n },\n})\nexport class NgpPromptComposerDictation implements OnDestroy {\n protected readonly composer = injectPromptComposerState();\n private recognition: any = null;\n private basePrompt = signal<string>(''); // Store the prompt before dictation started\n\n /** Whether the submit button should be disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Whether dictation is currently active */\n readonly isDictating = computed(() => this.composer().isDictating());\n\n /** The state of the prompt composer. */\n protected readonly state = promptComposerDictationState<NgpPromptComposerDictation>(this);\n\n constructor() {\n ngpButton({\n disabled: computed(\n () => this.state.disabled() || this.composer().dictationSupported === false,\n ),\n });\n this.initializeSpeechRecognition();\n }\n\n ngOnDestroy(): void {\n if (this.recognition) {\n this.recognition.stop();\n this.recognition = null;\n }\n }\n\n @HostListener('click')\n protected onClick(): void {\n if (!this.recognition) {\n console.warn('Speech recognition is not supported in this browser');\n return;\n }\n\n if (this.composer().isDictating()) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.composer().isDictating()) {\n event.preventDefault();\n this.stopDictation();\n }\n }\n\n private initializeSpeechRecognition(): void {\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n return;\n }\n\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true; // Enable continuous listening\n this.recognition.interimResults = true; // Enable interim results for live updates\n this.recognition.lang = 'en-US';\n\n this.recognition.onstart = () => {\n this.composer().isDictating.set(true);\n // Store the current prompt as the base\n this.basePrompt.set(this.composer().prompt());\n };\n\n this.recognition.onresult = (event: any) => {\n let interimTranscript = '';\n let finalTranscript = '';\n\n // Process all results\n for (let i = 0; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n finalTranscript += transcript;\n } else {\n interimTranscript += transcript;\n }\n }\n\n // Combine base prompt with final transcript and interim transcript\n const baseText = this.basePrompt();\n const separator = baseText ? ' ' : '';\n const newPrompt = baseText + separator + finalTranscript + interimTranscript;\n\n this.composer().prompt.set(newPrompt.trim());\n };\n\n this.recognition.onend = () => {\n this.composer().isDictating.set(false);\n };\n\n this.recognition.onerror = (event: any) => {\n console.error('Speech recognition error:', event.error);\n this.composer().isDictating.set(false);\n };\n }\n\n private startDictation(): void {\n if (this.recognition && !this.composer().isDictating()) {\n this.recognition.start();\n }\n }\n\n private stopDictation(): void {\n if (this.recognition && this.composer().isDictating()) {\n this.recognition.stop();\n }\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThreadViewport } from './thread-viewport';\n\n/**\n * The state token for the ThreadViewport primitive.\n */\nexport const NgpThreadViewportStateToken = createStateToken<NgpThreadViewport>('ThreadViewport');\n\n/**\n * Provides the ThreadViewport state.\n */\nexport const provideThreadViewportState = createStateProvider(NgpThreadViewportStateToken);\n\n/**\n * Injects the ThreadViewport state.\n */\nexport const injectThreadViewportState = createStateInjector<NgpThreadViewport>(\n NgpThreadViewportStateToken,\n);\n\n/**\n * The ThreadViewport state registration function.\n */\nexport const threadViewportState = createState(NgpThreadViewportStateToken);\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { fromResizeEvent } from 'ng-primitives/internal';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { injectThreadState } from '../thread/thread-state';\nimport { provideThreadViewportState, threadViewportState } from './thread-viewport-state';\n\n@Directive({\n selector: '[ngpThreadViewport]',\n exportAs: 'ngpThreadViewport',\n providers: [provideThreadViewportState()],\n})\nexport class NgpThreadViewport {\n private readonly thread = injectThreadState();\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * The distance in pixels from the bottom of the scrollable container that is considered \"at the bottom\".\n * When the user scrolls within this threshold, the thread is treated as being at the bottom.\n * This value is used to determine whether automatic scrolling to the bottom should occur,\n * for example when new content is added or the container is resized.\n *\n * @default 70\n */\n readonly threshold = input<number, NumberInput>(70, {\n alias: 'ngpThreadViewportThreshold',\n transform: numberAttribute,\n });\n\n /**\n * Whether the thread should automatically scroll to the bottom when new content is added.\n */\n readonly autoScroll = input<boolean, BooleanInput>(true, {\n alias: 'ngpThreadViewportAutoScroll',\n transform: booleanAttribute,\n });\n\n /** Store the last known scroll position */\n private lastScrollTop = 0;\n\n /** Determine if we are at the bottom of the scrollable container (within the threshold) */\n protected isAtBottom = false;\n\n /** The state of the thread viewport. */\n protected readonly state = threadViewportState<NgpThreadViewport>(this);\n\n constructor() {\n // listen for scroll requests from the thread\n this.thread()\n .scrollRequest.pipe(safeTakeUntilDestroyed())\n .subscribe(behavior => this.scrollToBottom(behavior));\n\n fromResizeEvent(this.elementRef.nativeElement)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(() => {\n if (this.isAtBottom) {\n this.scrollToBottom('instant');\n }\n this.onScroll();\n });\n }\n\n /**\n * Scroll the container to the bottom.\n * @internal\n */\n scrollToBottom(behavior: ScrollBehavior): void {\n if (!this.state.autoScroll()) {\n return;\n }\n\n this.elementRef.nativeElement.scrollTo({\n top: this.elementRef.nativeElement.scrollHeight,\n behavior,\n });\n }\n\n @HostListener('scroll')\n protected onScroll(): void {\n const element = this.elementRef.nativeElement;\n const isAtBottom = element.scrollHeight - element.scrollTop <= element.clientHeight;\n\n if (isAtBottom || this.lastScrollTop >= element.scrollTop) {\n this.isAtBottom = isAtBottom;\n }\n\n this.lastScrollTop = element.scrollTop;\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThreadSuggestion } from './thread-suggestion';\n\n/**\n * The state token for the ThreadSuggestion primitive.\n */\nexport const NgpThreadSuggestionStateToken =\n createStateToken<NgpThreadSuggestion>('ThreadSuggestion');\n\n/**\n * Provides the ThreadSuggestion state.\n */\nexport const provideThreadSuggestionState = createStateProvider(NgpThreadSuggestionStateToken);\n\n/**\n * Injects the ThreadSuggestion state.\n */\nexport const injectThreadSuggestionState = createStateInjector<NgpThreadSuggestion>(\n NgpThreadSuggestionStateToken,\n);\n\n/**\n * The ThreadSuggestion state registration function.\n */\nexport const threadSuggestionState = createState(NgpThreadSuggestionStateToken);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input } from '@angular/core';\nimport { injectThreadState } from '../thread/thread-state';\nimport { provideThreadSuggestionState, threadSuggestionState } from './thread-suggestion-state';\n\n@Directive({\n selector: 'button[ngpThreadSuggestion]',\n exportAs: 'ngpThreadSuggestion',\n providers: [provideThreadSuggestionState()],\n})\nexport class NgpThreadSuggestion {\n private readonly thread = injectThreadState();\n\n /** The suggested text to display in the input field. */\n readonly suggestion = input<string>('', { alias: 'ngpThreadSuggestion' });\n\n /** Whether the suggestion should populate the prompt when clicked. */\n readonly setPromptOnClick = input<boolean, BooleanInput>(true, {\n alias: 'ngpThreadSuggestionSetPromptOnClick',\n transform: booleanAttribute,\n });\n\n /** The state of the thread suggestion. */\n protected readonly state = threadSuggestionState<NgpThreadSuggestion>(this);\n\n @HostListener('click')\n submitSuggestion(): void {\n if (this.state.setPromptOnClick() && this.state.suggestion().length > 0) {\n this.thread().setPrompt(this.state.suggestion());\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-ai.mjs","sources":["../../../../packages/ng-primitives/ai/src/prompt-composer/prompt-composer-state.ts","../../../../packages/ng-primitives/ai/src/thread/thread-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-input/prompt-composer-input-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-input/prompt-composer-input.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-submit/prompt-composer-submit-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-submit/prompt-composer-submit.ts","../../../../packages/ng-primitives/ai/src/prompt-composer/prompt-composer.ts","../../../../packages/ng-primitives/ai/src/thread-message/thread-message-state.ts","../../../../packages/ng-primitives/ai/src/thread-message/thread-message.ts","../../../../packages/ng-primitives/ai/src/thread/thread.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-dictation/prompt-composer-dictation-state.ts","../../../../packages/ng-primitives/ai/src/prompt-composer-dictation/prompt-composer-dictation.ts","../../../../packages/ng-primitives/ai/src/thread-viewport/thread-viewport-state.ts","../../../../packages/ng-primitives/ai/src/thread-viewport/thread-viewport.ts","../../../../packages/ng-primitives/ai/src/thread-suggestion/thread-suggestion-state.ts","../../../../packages/ng-primitives/ai/src/thread-suggestion/thread-suggestion.ts","../../../../packages/ng-primitives/ai/src/ng-primitives-ai.ts"],"sourcesContent":["import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposer } from './prompt-composer';\n\n/**\n * The state token for the PromptComposer primitive.\n */\nexport const NgpPromptComposerStateToken = createStateToken<NgpPromptComposer>('PromptComposer');\n\n/**\n * Provides the PromptComposer state.\n */\nexport const providePromptComposerState = createStateProvider(NgpPromptComposerStateToken);\n\n/**\n * Injects the PromptComposer state.\n */\nexport const injectPromptComposerState = createStateInjector<NgpPromptComposer>(\n NgpPromptComposerStateToken,\n);\n\n/**\n * The PromptComposer state registration function.\n */\nexport const promptComposerState = createState(NgpPromptComposerStateToken);\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThread } from './thread';\n\n/**\n * The state token for the Thread primitive.\n */\nexport const NgpThreadStateToken = createStateToken<NgpThread>('Thread');\n\n/**\n * Provides the Thread state.\n */\nexport const provideThreadState = createStateProvider(NgpThreadStateToken);\n\n/**\n * Injects the Thread state.\n */\nexport const injectThreadState = createStateInjector<NgpThread>(NgpThreadStateToken);\n\n/**\n * The Thread state registration function.\n */\nexport const threadState = createState(NgpThreadStateToken);\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposerInput } from './prompt-composer-input';\n\n/**\n * The state token for the PromptComposerInput primitive.\n */\nexport const NgpPromptComposerInputStateToken =\n createStateToken<NgpPromptComposerInput>('PromptComposerInput');\n\n/**\n * Provides the PromptComposerInput state.\n */\nexport const providePromptComposerInputState = createStateProvider(\n NgpPromptComposerInputStateToken,\n);\n\n/**\n * Injects the PromptComposerInput state.\n */\nexport const injectPromptComposerInputState = createStateInjector<NgpPromptComposerInput>(\n NgpPromptComposerInputStateToken,\n);\n\n/**\n * The PromptComposerInput state registration function.\n */\nexport const promptComposerInputState = createState(NgpPromptComposerInputStateToken);\n","import { Directive, HostListener } from '@angular/core';\nimport { explicitEffect, injectElementRef } from 'ng-primitives/internal';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { fromEvent } from 'rxjs';\nimport { injectPromptComposerState } from '../prompt-composer/prompt-composer-state';\nimport { injectThreadState } from '../thread/thread-state';\nimport {\n promptComposerInputState,\n providePromptComposerInputState,\n} from './prompt-composer-input-state';\n\n@Directive({\n selector: 'input[ngpPromptComposerInput], textarea[ngpPromptComposerInput]',\n exportAs: 'ngpPromptComposerInput',\n providers: [providePromptComposerInputState()],\n})\nexport class NgpPromptComposerInput {\n protected readonly thread = injectThreadState();\n private readonly composer = injectPromptComposerState();\n private readonly element = injectElementRef<HTMLInputElement | HTMLTextAreaElement>();\n\n /** The state of the prompt composer input. */\n protected readonly state = promptComposerInputState<NgpPromptComposerInput>(this);\n\n constructor() {\n // set the initial state\n this.composer().prompt.set(this.element.nativeElement.value);\n\n // listen for requests to set the prompt\n this.thread()\n .requestPrompt.pipe(safeTakeUntilDestroyed())\n .subscribe(value => {\n // set the cursor to the end\n this.composer().prompt.set(value);\n this.element.nativeElement.setSelectionRange(value.length, value.length);\n this.element.nativeElement.focus();\n });\n\n // listen for changes to the text content\n fromEvent(this.element.nativeElement, 'input')\n .pipe(safeTakeUntilDestroyed())\n .subscribe(() => this.composer().prompt.set(this.element.nativeElement.value));\n\n // any time the prompt changes, update the input value if needed\n explicitEffect(\n [this.composer().prompt],\n ([prompt]) => (this.element.nativeElement.value = prompt),\n );\n }\n\n /**\n * If the user presses Enter, the form will be submitted, unless they are holding Shift.\n * This directive automatically handles that behavior.\n */\n @HostListener('keydown.enter', ['$event'])\n protected onEnterKey(event: Event): void {\n if (event instanceof KeyboardEvent === false || event.shiftKey) {\n return;\n }\n\n event.preventDefault();\n\n // if there is no text content, do nothing\n if (this.element.nativeElement.value.trim().length === 0) {\n return;\n }\n\n this.composer().submitPrompt();\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposerSubmit } from './prompt-composer-submit';\n\n/**\n * The state token for the PromptComposerSubmit primitive.\n */\nexport const NgpPromptComposerSubmitStateToken =\n createStateToken<NgpPromptComposerSubmit>('PromptComposerSubmit');\n\n/**\n * Provides the PromptComposerSubmit state.\n */\nexport const providePromptComposerSubmitState = createStateProvider(\n NgpPromptComposerSubmitStateToken,\n);\n\n/**\n * Injects the PromptComposerSubmit state.\n */\nexport const injectPromptComposerSubmitState = createStateInjector<NgpPromptComposerSubmit>(\n NgpPromptComposerSubmitStateToken,\n);\n\n/**\n * The PromptComposerSubmit state registration function.\n */\nexport const promptComposerSubmitState = createState(NgpPromptComposerSubmitStateToken);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, computed, Directive, HostListener, input } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectPromptComposerState } from '../prompt-composer/prompt-composer-state';\nimport {\n promptComposerSubmitState,\n providePromptComposerSubmitState,\n} from './prompt-composer-submit-state';\n\n@Directive({\n selector: 'button[ngpPromptComposerSubmit]',\n exportAs: 'ngpPromptComposerSubmit',\n providers: [providePromptComposerSubmitState()],\n host: {\n type: 'button',\n '[attr.data-prompt]': 'composer().hasPrompt() ? \"\" : null',\n '[attr.data-dictating]': 'isDictating() ? \"\" : null',\n '[attr.data-dictation-supported]': 'composer().dictationSupported ? \"\" : null',\n },\n})\nexport class NgpPromptComposerSubmit {\n protected readonly composer = injectPromptComposerState();\n\n /** Whether the submit button should be disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Whether dictation is currently active */\n readonly isDictating = computed(() => this.composer().isDictating());\n\n /** The state of the prompt composer submit. */\n protected readonly state = promptComposerSubmitState<NgpPromptComposerSubmit>(this);\n\n constructor() {\n ngpButton({\n disabled: computed(() => this.state.disabled() || this.composer().hasPrompt() === false),\n });\n }\n\n @HostListener('click')\n protected onClick(): void {\n this.composer().submitPrompt();\n }\n}\n","import { computed, Directive, output, signal } from '@angular/core';\nimport { injectThreadState } from '../thread/thread-state';\nimport { promptComposerState, providePromptComposerState } from './prompt-composer-state';\n\n@Directive({\n selector: '[ngpPromptComposer]',\n exportAs: 'ngpPromptComposer',\n providers: [providePromptComposerState()],\n host: {\n '[attr.data-prompt]': 'hasPrompt() ? \"\" : null',\n '[attr.data-dictating]': 'isDictating() ? \"\" : null',\n '[attr.data-dictation-supported]': 'dictationSupported ? \"\" : null',\n },\n})\nexport class NgpPromptComposer {\n private readonly thread = injectThreadState();\n\n /** Emits whenever the user submits the prompt. */\n readonly submit = output<string>({ alias: 'ngpPromptComposerSubmit' });\n\n /** @internal Store the current prompt text. */\n readonly prompt = signal<string>('');\n\n /** @internal Track whether the prompt is currently being dictated */\n readonly isDictating = signal<boolean>(false);\n\n /** @internal Determine whether the prompt input has content */\n readonly hasPrompt = computed(() => this.prompt().trim().length > 0);\n\n /** Whether dictation is supported by the browser */\n readonly dictationSupported = !!(\n (globalThis as any).SpeechRecognition || (globalThis as any).webkitSpeechRecognition\n );\n\n /** The state of the prompt composer. */\n protected readonly state = promptComposerState<NgpPromptComposer>(this);\n\n /**\n * @internal\n * Submits the current prompt if there is content, and clears the input.\n */\n submitPrompt(): void {\n if (this.hasPrompt()) {\n this.submit.emit(this.prompt());\n this.prompt.set('');\n this.thread().scrollToBottom('smooth');\n }\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThreadMessage } from './thread-message';\n\n/**\n * The state token for the ThreadMessage primitive.\n */\nexport const NgpThreadMessageStateToken = createStateToken<NgpThreadMessage>('ThreadMessage');\n\n/**\n * Provides the ThreadMessage state.\n */\nexport const provideThreadMessageState = createStateProvider(NgpThreadMessageStateToken);\n\n/**\n * Injects the ThreadMessage state.\n */\nexport const injectThreadMessageState = createStateInjector<NgpThreadMessage>(\n NgpThreadMessageStateToken,\n);\n\n/**\n * The ThreadMessage state registration function.\n */\nexport const threadMessageState = createState(NgpThreadMessageStateToken);\n","import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { fromMutationObserver } from 'ng-primitives/internal';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { injectThreadState } from '../thread/thread-state';\nimport { provideThreadMessageState, threadMessageState } from './thread-message-state';\n\n@Directive({\n selector: '[ngpThreadMessage]',\n exportAs: 'ngpThreadMessage',\n providers: [provideThreadMessageState()],\n})\nexport class NgpThreadMessage {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly thread = injectThreadState();\n\n /** The state of the thread message. */\n protected readonly state = threadMessageState<NgpThreadMessage>(this);\n\n constructor() {\n // Watch for content changes (like streaming text) and maintain scroll position\n fromMutationObserver(this.elementRef.nativeElement, {\n childList: true, // Watch for new/removed child nodes\n subtree: true, // Watch changes in all descendants\n characterData: true, // Watch for text content changes in text nodes\n attributes: false, // We don't care about attribute changes for content streaming\n })\n .pipe(safeTakeUntilDestroyed())\n .subscribe(() => {\n // if this is the last message, scroll to bottom\n if (this.thread().isLastMessage(this)) {\n this.thread().scrollToBottom('smooth');\n }\n });\n\n this.thread().registerMessage(this);\n this.destroyRef.onDestroy(() => this.thread().unregisterMessage(this));\n }\n}\n","import { Directive } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { NgpThreadMessage } from '../thread-message/thread-message';\nimport { provideThreadState, threadState } from './thread-state';\n\n@Directive({\n selector: '[ngpThread]',\n exportAs: 'ngpThread',\n providers: [provideThreadState()],\n})\nexport class NgpThread {\n private messages: NgpThreadMessage[] = [];\n\n /** @internal emit event to trigger scrolling to bottom */\n readonly scrollRequest = new Subject<ScrollBehavior>();\n\n /** @internal emit event to trigger setting the prompt */\n readonly requestPrompt = new Subject<string>();\n\n /** The state of the thread. */\n protected readonly state = threadState<NgpThread>(this);\n\n scrollToBottom(behavior: ScrollBehavior): void {\n this.scrollRequest.next(behavior);\n }\n\n /** @internal Register a message with the thread */\n registerMessage(message: NgpThreadMessage): void {\n this.messages.push(message);\n }\n\n /** @internal Unregister a message from the thread */\n unregisterMessage(message: NgpThreadMessage): void {\n this.messages = this.messages.filter(m => m !== message);\n }\n\n /** @internal Determine if the given message is the last message in the thread */\n isLastMessage(message: NgpThreadMessage): boolean {\n return this.messages.length > 0 && this.messages[this.messages.length - 1] === message;\n }\n\n /** @internal Set the prompt text in the associated prompt composer */\n setPrompt(value: string): void {\n this.requestPrompt.next(value);\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpPromptComposerDictation } from './prompt-composer-dictation';\n\n/**\n * The state token for the PromptComposerDictation primitive.\n */\nexport const NgpPromptComposerDictationStateToken =\n createStateToken<NgpPromptComposerDictation>('PromptComposerDictation');\n\n/**\n * Provides the PromptComposerDictation state.\n */\nexport const providePromptComposerDictationState = createStateProvider(\n NgpPromptComposerDictationStateToken,\n);\n\n/**\n * Injects the PromptComposerDictation state.\n */\nexport const injectPromptComposerDictationState = createStateInjector<NgpPromptComposerDictation>(\n NgpPromptComposerDictationStateToken,\n);\n\n/**\n * The PromptComposerDictation state registration function.\n */\nexport const promptComposerDictationState = createState(NgpPromptComposerDictationStateToken);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n HostListener,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectPromptComposerState } from '../prompt-composer/prompt-composer-state';\nimport {\n promptComposerDictationState,\n providePromptComposerDictationState,\n} from './prompt-composer-dictation-state';\n\ndeclare global {\n interface Window {\n SpeechRecognition: any;\n webkitSpeechRecognition: any;\n }\n}\n\n@Directive({\n selector: 'button[ngpPromptComposerDictation]',\n exportAs: 'ngpPromptComposerDictation',\n providers: [providePromptComposerDictationState()],\n host: {\n type: 'button',\n '[attr.data-dictating]': 'isDictating() ? \"\" : null',\n '[attr.data-dictation-supported]': 'composer().dictationSupported ? \"\" : null',\n '[attr.data-prompt]': 'composer().hasPrompt() ? \"\" : null',\n },\n})\nexport class NgpPromptComposerDictation implements OnDestroy {\n protected readonly composer = injectPromptComposerState();\n private recognition: any = null;\n private basePrompt = signal<string>(''); // Store the prompt before dictation started\n\n /** Whether the submit button should be disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Whether dictation is currently active */\n readonly isDictating = computed(() => this.composer().isDictating());\n\n /** The state of the prompt composer. */\n protected readonly state = promptComposerDictationState<NgpPromptComposerDictation>(this);\n\n constructor() {\n ngpButton({\n disabled: computed(\n () => this.state.disabled() || this.composer().dictationSupported === false,\n ),\n });\n this.initializeSpeechRecognition();\n }\n\n ngOnDestroy(): void {\n if (this.recognition) {\n this.recognition.stop();\n this.recognition = null;\n }\n }\n\n @HostListener('click')\n protected onClick(): void {\n if (!this.recognition) {\n console.warn('Speech recognition is not supported in this browser');\n return;\n }\n\n if (this.composer().isDictating()) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.composer().isDictating()) {\n event.preventDefault();\n this.stopDictation();\n }\n }\n\n private initializeSpeechRecognition(): void {\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n return;\n }\n\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true; // Enable continuous listening\n this.recognition.interimResults = true; // Enable interim results for live updates\n this.recognition.lang = 'en-US';\n\n this.recognition.onstart = () => {\n this.composer().isDictating.set(true);\n // Store the current prompt as the base\n this.basePrompt.set(this.composer().prompt());\n };\n\n this.recognition.onresult = (event: any) => {\n let interimTranscript = '';\n let finalTranscript = '';\n\n // Process all results\n for (let i = 0; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n finalTranscript += transcript;\n } else {\n interimTranscript += transcript;\n }\n }\n\n // Combine base prompt with final transcript and interim transcript\n const baseText = this.basePrompt();\n const separator = baseText ? ' ' : '';\n const newPrompt = baseText + separator + finalTranscript + interimTranscript;\n\n this.composer().prompt.set(newPrompt.trim());\n };\n\n this.recognition.onend = () => {\n this.composer().isDictating.set(false);\n };\n\n this.recognition.onerror = (event: any) => {\n console.error('Speech recognition error:', event.error);\n this.composer().isDictating.set(false);\n };\n }\n\n private startDictation(): void {\n if (this.recognition && !this.composer().isDictating()) {\n this.recognition.start();\n }\n }\n\n private stopDictation(): void {\n if (this.recognition && this.composer().isDictating()) {\n this.recognition.stop();\n }\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThreadViewport } from './thread-viewport';\n\n/**\n * The state token for the ThreadViewport primitive.\n */\nexport const NgpThreadViewportStateToken = createStateToken<NgpThreadViewport>('ThreadViewport');\n\n/**\n * Provides the ThreadViewport state.\n */\nexport const provideThreadViewportState = createStateProvider(NgpThreadViewportStateToken);\n\n/**\n * Injects the ThreadViewport state.\n */\nexport const injectThreadViewportState = createStateInjector<NgpThreadViewport>(\n NgpThreadViewportStateToken,\n);\n\n/**\n * The ThreadViewport state registration function.\n */\nexport const threadViewportState = createState(NgpThreadViewportStateToken);\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { fromResizeEvent } from 'ng-primitives/internal';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { injectThreadState } from '../thread/thread-state';\nimport { provideThreadViewportState, threadViewportState } from './thread-viewport-state';\n\n@Directive({\n selector: '[ngpThreadViewport]',\n exportAs: 'ngpThreadViewport',\n providers: [provideThreadViewportState()],\n})\nexport class NgpThreadViewport {\n private readonly thread = injectThreadState();\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * The distance in pixels from the bottom of the scrollable container that is considered \"at the bottom\".\n * When the user scrolls within this threshold, the thread is treated as being at the bottom.\n * This value is used to determine whether automatic scrolling to the bottom should occur,\n * for example when new content is added or the container is resized.\n *\n * @default 70\n */\n readonly threshold = input<number, NumberInput>(70, {\n alias: 'ngpThreadViewportThreshold',\n transform: numberAttribute,\n });\n\n /**\n * Whether the thread should automatically scroll to the bottom when new content is added.\n */\n readonly autoScroll = input<boolean, BooleanInput>(true, {\n alias: 'ngpThreadViewportAutoScroll',\n transform: booleanAttribute,\n });\n\n /** Store the last known scroll position */\n private lastScrollTop = 0;\n\n /** Determine if we are at the bottom of the scrollable container (within the threshold) */\n protected isAtBottom = false;\n\n /** The state of the thread viewport. */\n protected readonly state = threadViewportState<NgpThreadViewport>(this);\n\n constructor() {\n // listen for scroll requests from the thread\n this.thread()\n .scrollRequest.pipe(safeTakeUntilDestroyed())\n .subscribe(behavior => this.scrollToBottom(behavior));\n\n fromResizeEvent(this.elementRef.nativeElement)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(() => {\n if (this.isAtBottom) {\n this.scrollToBottom('instant');\n }\n this.onScroll();\n });\n }\n\n /**\n * Scroll the container to the bottom.\n * @internal\n */\n scrollToBottom(behavior: ScrollBehavior): void {\n if (!this.state.autoScroll()) {\n return;\n }\n\n this.elementRef.nativeElement.scrollTo({\n top: this.elementRef.nativeElement.scrollHeight,\n behavior,\n });\n }\n\n @HostListener('scroll')\n protected onScroll(): void {\n const element = this.elementRef.nativeElement;\n const isAtBottom = element.scrollHeight - element.scrollTop <= element.clientHeight;\n\n if (isAtBottom || this.lastScrollTop >= element.scrollTop) {\n this.isAtBottom = isAtBottom;\n }\n\n this.lastScrollTop = element.scrollTop;\n }\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpThreadSuggestion } from './thread-suggestion';\n\n/**\n * The state token for the ThreadSuggestion primitive.\n */\nexport const NgpThreadSuggestionStateToken =\n createStateToken<NgpThreadSuggestion>('ThreadSuggestion');\n\n/**\n * Provides the ThreadSuggestion state.\n */\nexport const provideThreadSuggestionState = createStateProvider(NgpThreadSuggestionStateToken);\n\n/**\n * Injects the ThreadSuggestion state.\n */\nexport const injectThreadSuggestionState = createStateInjector<NgpThreadSuggestion>(\n NgpThreadSuggestionStateToken,\n);\n\n/**\n * The ThreadSuggestion state registration function.\n */\nexport const threadSuggestionState = createState(NgpThreadSuggestionStateToken);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input } from '@angular/core';\nimport { injectThreadState } from '../thread/thread-state';\nimport { provideThreadSuggestionState, threadSuggestionState } from './thread-suggestion-state';\n\n@Directive({\n selector: 'button[ngpThreadSuggestion]',\n exportAs: 'ngpThreadSuggestion',\n providers: [provideThreadSuggestionState()],\n})\nexport class NgpThreadSuggestion {\n private readonly thread = injectThreadState();\n\n /** The suggested text to display in the input field. */\n readonly suggestion = input<string>('', { alias: 'ngpThreadSuggestion' });\n\n /** Whether the suggestion should populate the prompt when clicked. */\n readonly setPromptOnClick = input<boolean, BooleanInput>(true, {\n alias: 'ngpThreadSuggestionSetPromptOnClick',\n transform: booleanAttribute,\n });\n\n /** The state of the thread suggestion. */\n protected readonly state = threadSuggestionState<NgpThreadSuggestion>(this);\n\n @HostListener('click')\n submitSuggestion(): void {\n if (this.state.setPromptOnClick() && this.state.suggestion().length > 0) {\n this.thread().setPrompt(this.state.suggestion());\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { createPrimitive, dataBinding, listener } from 'ng-primitives/state';
|
|
|
6
6
|
const [NgpAutofillStateToken, ngpAutofill, injectAutofillState, provideAutofillState] = createPrimitive('NgpAutofill', ({ onAutofillChange }) => {
|
|
7
7
|
const element = injectElementRef();
|
|
8
8
|
const styleInjector = injectStyleInjector();
|
|
9
|
-
const autofilled = signal(false, ...(ngDevMode ? [{ debugName: "autofilled" }] : []));
|
|
9
|
+
const autofilled = signal(false, ...(ngDevMode ? [{ debugName: "autofilled" }] : /* istanbul ignore next */ []));
|
|
10
10
|
// Host bindings
|
|
11
11
|
dataBinding(element, 'data-autofill', autofilled);
|
|
12
12
|
// Inject the autofill detection styles
|
|
@@ -65,10 +65,10 @@ class NgpAutofill {
|
|
|
65
65
|
*/
|
|
66
66
|
this.autofilled = this.state.autofilled;
|
|
67
67
|
}
|
|
68
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
69
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
68
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAutofill, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
69
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpAutofill, isStandalone: true, selector: "[ngpAutofill]", outputs: { autofillChange: "ngpAutofill" }, providers: [provideAutofillState()], exportAs: ["ngpAutofill"], ngImport: i0 }); }
|
|
70
70
|
}
|
|
71
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAutofill, decorators: [{
|
|
72
72
|
type: Directive,
|
|
73
73
|
args: [{
|
|
74
74
|
selector: '[ngpAutofill]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-autofill.mjs","sources":["../../../../packages/ng-primitives/autofill/src/autofill/autofill-state.ts","../../../../packages/ng-primitives/autofill/src/autofill/autofill.ts","../../../../packages/ng-primitives/autofill/src/ng-primitives-autofill.ts"],"sourcesContent":["import { Signal, signal } from '@angular/core';\nimport { injectElementRef, injectStyleInjector } from 'ng-primitives/internal';\nimport { createPrimitive, dataBinding, listener } from 'ng-primitives/state';\n\nexport interface NgpAutofillState {\n /**\n * Whether the element is autofilled.\n */\n readonly autofilled: Signal<boolean>;\n}\n\nexport interface NgpAutofillProps {\n /**\n * Callback fired when the autofill state changes.\n */\n onAutofillChange?: (value: boolean) => void;\n}\n\nexport const [NgpAutofillStateToken, ngpAutofill, injectAutofillState, provideAutofillState] =\n createPrimitive('NgpAutofill', ({ onAutofillChange }: NgpAutofillProps) => {\n const element = injectElementRef();\n const styleInjector = injectStyleInjector();\n const autofilled = signal(false);\n\n // Host bindings\n dataBinding(element, 'data-autofill', autofilled);\n\n // Inject the autofill detection styles\n // This technique is based on that used by the Angular CDK\n // https://github.com/angular/components/blob/main/src/cdk/text-field/_index.scss\n styleInjector.add(\n 'ngp-autofill',\n `\n @keyframes ngp-autofill-start { }\n @keyframes ngp-autofill-end {}\n\n [data-autofill]:-webkit-autofill {\n animation: ngp-autofill-start 0s 1ms;\n }\n\n [data-autofill]:not(:-webkit-autofill) {\n animation: ngp-autofill-end 0s 1ms;\n }\n `,\n );\n\n // Listen for animation start events\n listener(element, 'animationstart', (event: AnimationEvent) => {\n if (event.animationName === 'ngp-autofill-start') {\n setAutofilled(true);\n onAutofillChange?.(true);\n }\n\n if (event.animationName === 'ngp-autofill-end') {\n setAutofilled(false);\n onAutofillChange?.(false);\n }\n });\n\n function setAutofilled(value: boolean): void {\n autofilled.set(value);\n }\n\n return {\n autofilled,\n } satisfies NgpAutofillState;\n });\n","import { Directive, output } from '@angular/core';\nimport { ngpAutofill, provideAutofillState } from './autofill-state';\n\n/**\n * Apply the `ngpAutofill` directive to an element to detect browser autofill.\n */\n@Directive({\n selector: '[ngpAutofill]',\n exportAs: 'ngpAutofill',\n providers: [provideAutofillState()],\n})\nexport class NgpAutofill {\n /**\n * Event emitted when the autofill state changes.\n */\n readonly autofillChange = output<boolean>({\n alias: 'ngpAutofill',\n });\n\n /**\n * The autofill state.\n */\n private readonly state = ngpAutofill({\n onAutofillChange: value => this.autofillChange.emit(value),\n });\n\n /**\n * Whether the element is autofilled.\n */\n readonly autofilled = this.state.autofilled;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAkBa,CAAC,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,GAC1F,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,gBAAgB,EAAoB,KAAI;AACxE,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,aAAa,GAAG,mBAAmB,EAAE;AAC3C,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"ng-primitives-autofill.mjs","sources":["../../../../packages/ng-primitives/autofill/src/autofill/autofill-state.ts","../../../../packages/ng-primitives/autofill/src/autofill/autofill.ts","../../../../packages/ng-primitives/autofill/src/ng-primitives-autofill.ts"],"sourcesContent":["import { Signal, signal } from '@angular/core';\nimport { injectElementRef, injectStyleInjector } from 'ng-primitives/internal';\nimport { createPrimitive, dataBinding, listener } from 'ng-primitives/state';\n\nexport interface NgpAutofillState {\n /**\n * Whether the element is autofilled.\n */\n readonly autofilled: Signal<boolean>;\n}\n\nexport interface NgpAutofillProps {\n /**\n * Callback fired when the autofill state changes.\n */\n onAutofillChange?: (value: boolean) => void;\n}\n\nexport const [NgpAutofillStateToken, ngpAutofill, injectAutofillState, provideAutofillState] =\n createPrimitive('NgpAutofill', ({ onAutofillChange }: NgpAutofillProps) => {\n const element = injectElementRef();\n const styleInjector = injectStyleInjector();\n const autofilled = signal(false);\n\n // Host bindings\n dataBinding(element, 'data-autofill', autofilled);\n\n // Inject the autofill detection styles\n // This technique is based on that used by the Angular CDK\n // https://github.com/angular/components/blob/main/src/cdk/text-field/_index.scss\n styleInjector.add(\n 'ngp-autofill',\n `\n @keyframes ngp-autofill-start { }\n @keyframes ngp-autofill-end {}\n\n [data-autofill]:-webkit-autofill {\n animation: ngp-autofill-start 0s 1ms;\n }\n\n [data-autofill]:not(:-webkit-autofill) {\n animation: ngp-autofill-end 0s 1ms;\n }\n `,\n );\n\n // Listen for animation start events\n listener(element, 'animationstart', (event: AnimationEvent) => {\n if (event.animationName === 'ngp-autofill-start') {\n setAutofilled(true);\n onAutofillChange?.(true);\n }\n\n if (event.animationName === 'ngp-autofill-end') {\n setAutofilled(false);\n onAutofillChange?.(false);\n }\n });\n\n function setAutofilled(value: boolean): void {\n autofilled.set(value);\n }\n\n return {\n autofilled,\n } satisfies NgpAutofillState;\n });\n","import { Directive, output } from '@angular/core';\nimport { ngpAutofill, provideAutofillState } from './autofill-state';\n\n/**\n * Apply the `ngpAutofill` directive to an element to detect browser autofill.\n */\n@Directive({\n selector: '[ngpAutofill]',\n exportAs: 'ngpAutofill',\n providers: [provideAutofillState()],\n})\nexport class NgpAutofill {\n /**\n * Event emitted when the autofill state changes.\n */\n readonly autofillChange = output<boolean>({\n alias: 'ngpAutofill',\n });\n\n /**\n * The autofill state.\n */\n private readonly state = ngpAutofill({\n onAutofillChange: value => this.autofillChange.emit(value),\n });\n\n /**\n * Whether the element is autofilled.\n */\n readonly autofilled = this.state.autofilled;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAkBa,CAAC,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,GAC1F,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,gBAAgB,EAAoB,KAAI;AACxE,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,aAAa,GAAG,mBAAmB,EAAE;AAC3C,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;;AAGhC,IAAA,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;;;;AAKjD,IAAA,aAAa,CAAC,GAAG,CACf,cAAc,EACd;;;;;;;;;;;AAWC,MAAA,CAAA,CACF;;IAGD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,KAAqB,KAAI;AAC5D,QAAA,IAAI,KAAK,CAAC,aAAa,KAAK,oBAAoB,EAAE;YAChD,aAAa,CAAC,IAAI,CAAC;AACnB,YAAA,gBAAgB,GAAG,IAAI,CAAC;QAC1B;AAEA,QAAA,IAAI,KAAK,CAAC,aAAa,KAAK,kBAAkB,EAAE;YAC9C,aAAa,CAAC,KAAK,CAAC;AACpB,YAAA,gBAAgB,GAAG,KAAK,CAAC;QAC3B;AACF,IAAA,CAAC,CAAC;IAEF,SAAS,aAAa,CAAC,KAAc,EAAA;AACnC,QAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;IAEA,OAAO;QACL,UAAU;KACgB;AAC9B,CAAC;;AC/DH;;AAEG;MAMU,WAAW,CAAA;AALxB,IAAA,WAAA,GAAA;AAME;;AAEG;QACM,IAAA,CAAA,cAAc,GAAG,MAAM,CAAU;AACxC,YAAA,KAAK,EAAE,aAAa;AACrB,SAAA,CAAC;AAEF;;AAEG;QACc,IAAA,CAAA,KAAK,GAAG,WAAW,CAAC;AACnC,YAAA,gBAAgB,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3D,SAAA,CAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;AAC5C,IAAA;+GAnBY,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAFX,CAAC,oBAAoB,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAExB,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,SAAS,EAAE,CAAC,oBAAoB,EAAE,CAAC;AACpC,iBAAA;;;ACVD;;AAEG;;;;"}
|
|
@@ -32,7 +32,7 @@ function injectAvatarConfig() {
|
|
|
32
32
|
|
|
33
33
|
const [NgpAvatarStateToken, ngpAvatar, injectAvatarState, provideAvatarState] = createPrimitive('NgpAvatar', ({}) => {
|
|
34
34
|
const element = injectElementRef();
|
|
35
|
-
const status = signal(NgpAvatarStatus.Idle, ...(ngDevMode ? [{ debugName: "status" }] : []));
|
|
35
|
+
const status = signal(NgpAvatarStatus.Idle, ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
|
|
36
36
|
// Host bindings
|
|
37
37
|
dataBinding(element, 'data-status', status);
|
|
38
38
|
function setStatus(newStatus) {
|
|
@@ -55,8 +55,8 @@ const [NgpAvatarFallbackStateToken, ngpAvatarFallback, injectAvatarFallbackState
|
|
|
55
55
|
const avatar = injectAvatarState();
|
|
56
56
|
const element = injectElementRef();
|
|
57
57
|
const disposables = injectDisposables();
|
|
58
|
-
const delayElapsed = signal(false, ...(ngDevMode ? [{ debugName: "delayElapsed" }] : []));
|
|
59
|
-
const visible = computed(() => delayElapsed() && avatar().status() !== NgpAvatarStatus.Loaded, ...(ngDevMode ? [{ debugName: "visible" }] : []));
|
|
58
|
+
const delayElapsed = signal(false, ...(ngDevMode ? [{ debugName: "delayElapsed" }] : /* istanbul ignore next */ []));
|
|
59
|
+
const visible = computed(() => delayElapsed() && avatar().status() !== NgpAvatarStatus.Loaded, ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
|
|
60
60
|
disposables.setTimeout(() => delayElapsed.set(true), delay());
|
|
61
61
|
styleBinding(element, 'display', () => (visible() ? null : 'none'));
|
|
62
62
|
return {};
|
|
@@ -75,17 +75,14 @@ class NgpAvatarFallback {
|
|
|
75
75
|
* Define a delay before the fallback is shown. This is useful to only show the fallback for those with slower connections.
|
|
76
76
|
* @default 0
|
|
77
77
|
*/
|
|
78
|
-
this.delay = input(this.config.delay, ...(ngDevMode ?
|
|
79
|
-
|
|
80
|
-
alias: 'ngpAvatarFallbackDelay',
|
|
81
|
-
transform: numberAttribute,
|
|
82
|
-
}]));
|
|
78
|
+
this.delay = input(this.config.delay, { ...(ngDevMode ? { debugName: "delay" } : /* istanbul ignore next */ {}), alias: 'ngpAvatarFallbackDelay',
|
|
79
|
+
transform: numberAttribute });
|
|
83
80
|
ngpAvatarFallback({ delay: this.delay });
|
|
84
81
|
}
|
|
85
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
86
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
82
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAvatarFallback, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
83
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpAvatarFallback, isStandalone: true, selector: "[ngpAvatarFallback]", inputs: { delay: { classPropertyName: "delay", publicName: "ngpAvatarFallbackDelay", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["ngpAvatarFallback"], ngImport: i0 }); }
|
|
87
84
|
}
|
|
88
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
85
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAvatarFallback, decorators: [{
|
|
89
86
|
type: Directive,
|
|
90
87
|
args: [{
|
|
91
88
|
selector: '[ngpAvatarFallback]',
|
|
@@ -124,10 +121,10 @@ class NgpAvatarImage {
|
|
|
124
121
|
constructor() {
|
|
125
122
|
ngpAvatarImage({});
|
|
126
123
|
}
|
|
127
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
128
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
124
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAvatarImage, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
125
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpAvatarImage, isStandalone: true, selector: "img[ngpAvatarImage]", exportAs: ["ngpAvatarImage"], ngImport: i0 }); }
|
|
129
126
|
}
|
|
130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
127
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAvatarImage, decorators: [{
|
|
131
128
|
type: Directive,
|
|
132
129
|
args: [{
|
|
133
130
|
selector: 'img[ngpAvatarImage]',
|
|
@@ -153,10 +150,10 @@ class NgpAvatar {
|
|
|
153
150
|
setStatus(status) {
|
|
154
151
|
this.state.setStatus(status);
|
|
155
152
|
}
|
|
156
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
157
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
153
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAvatar, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
154
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpAvatar, isStandalone: true, selector: "[ngpAvatar]", providers: [provideAvatarState()], exportAs: ["ngpAvatar"], ngImport: i0 }); }
|
|
158
155
|
}
|
|
159
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpAvatar, decorators: [{
|
|
160
157
|
type: Directive,
|
|
161
158
|
args: [{
|
|
162
159
|
selector: '[ngpAvatar]',
|