@theseam/ui-common 1.0.2-beta.60 → 1.0.2-beta.67

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.
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, DestroyRef, computed, signal, ChangeDetectionStrategy, Component, input, output, viewChild, afterNextRender, effect, isDevMode, ElementRef, EventEmitter, HostListener, Output, Input, Directive } from '@angular/core';
3
- import * as i1$2 from '@angular/cdk/a11y';
2
+ import { InjectionToken, inject, DestroyRef, computed, signal, viewChild, ChangeDetectionStrategy, Component, input, output, afterNextRender, effect, isDevMode, ElementRef, EventEmitter, HostListener, Output, Input, Directive } from '@angular/core';
3
+ import * as i1$1 from '@angular/cdk/a11y';
4
4
  import { A11yModule } from '@angular/cdk/a11y';
5
5
  import { toSignal, takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
6
6
  import * as i2 from '@angular/forms';
@@ -16,9 +16,8 @@ import { ModalRef, Modal } from '@theseam/ui-common/modal';
16
16
  import { TheSeamAutoFocusDirective, TheSeamDisableControlDirective } from '@theseam/ui-common/shared';
17
17
  import { readFileAsDataUrlAsync, observeControlValue, observeControlValid } from '@theseam/ui-common/utils';
18
18
  import { switchMap, debounceTime, take } from 'rxjs/operators';
19
- import * as i1 from 'ngx-file-drop';
20
- import { NgxFileDropModule } from 'ngx-file-drop';
21
- import * as i1$1 from '@almothafar/angular-signature-pad';
19
+ import { TheSeamFileDropZoneDirective } from '@theseam/ui-common/file-input';
20
+ import * as i1 from '@almothafar/angular-signature-pad';
22
21
  import { AngularSignaturePadModule } from '@almothafar/angular-signature-pad';
23
22
  import { TheSeamFontLoaderService } from '@theseam/ui-common/services';
24
23
  import * as i2$1 from '@theseam/ui-common/form-field';
@@ -41,12 +40,6 @@ class TheSeamSignatureInputImgComponent {
41
40
  optional: true,
42
41
  });
43
42
  _destroyRef = inject(DestroyRef);
44
- /**
45
- * The File is only needed for validation at selection time. Once it's been
46
- * converted to a data URL and stored in the form value, we don't need the
47
- * File again — so there's no point trying to round-trip it through
48
- * writeValue / form state. The preview renders off the current form value.
49
- */
50
43
  _fileControl = new FormControl(null, {
51
44
  validators: [maxFileSizeValidator],
52
45
  });
@@ -54,24 +47,18 @@ class TheSeamSignatureInputImgComponent {
54
47
  initialValue: this._fileControl.status,
55
48
  });
56
49
  _sizeError = computed(() => {
57
- // Touch the status signal so this re-runs on validity changes.
58
50
  this._fileStatus();
59
51
  return this._fileControl.getError('maxFileSize')
60
52
  ? 'File size has exceeded 2MB.'
61
53
  : null;
62
54
  }, ...(ngDevMode ? [{ debugName: "_sizeError" }] : []));
63
- /**
64
- * Single source of truth for both the form value and the preview image.
65
- * External writes (writeValue) and successful uploads both funnel through
66
- * here, so switching tabs and coming back always shows the last committed
67
- * signature.
68
- */
69
55
  _value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : []));
70
56
  _previewDataUrl = computed(() => this._value(), ...(ngDevMode ? [{ debugName: "_previewDataUrl" }] : []));
71
57
  _previewBackgroundImage = computed(() => {
72
58
  const url = this._value();
73
59
  return url ? `url("${url}")` : null;
74
60
  }, ...(ngDevMode ? [{ debugName: "_previewBackgroundImage" }] : []));
61
+ _nativeInput = viewChild.required('filesInput');
75
62
  _onChange = () => undefined;
76
63
  _onTouched = () => undefined;
77
64
  constructor() {
@@ -79,8 +66,6 @@ class TheSeamSignatureInputImgComponent {
79
66
  this._container.registerInputItem('img', this);
80
67
  this._destroyRef.onDestroy(() => this._container?.unregisterInputItem('img', this));
81
68
  }
82
- // Valid file uploads convert to a data URL and become both the preview
83
- // and the form value. Invalid (too large) files clear both.
84
69
  this._fileControl.valueChanges
85
70
  .pipe(switchMap(() => {
86
71
  const file = this._fileControl.value;
@@ -109,44 +94,21 @@ class TheSeamSignatureInputImgComponent {
109
94
  this._fileControl.enable();
110
95
  }
111
96
  clear() {
112
- // valueChanges subscription propagates this to `_value` (null) and to the
113
- // form value.
114
97
  this._fileControl.setValue(null);
115
98
  }
116
99
  openFileBrowse() {
117
- const fileInput = document.createElement('input');
118
- fileInput.setAttribute('type', 'file');
119
- const cleanup = () => {
120
- // Give the 'change' event a moment to fire before assuming the user
121
- // canceled the dialog.
122
- setTimeout(() => {
123
- fileInput.removeEventListener('change', onFileChange);
124
- document.body.removeEventListener('focus', onFocusReturned);
125
- window.removeEventListener('focus', onFocusReturned);
126
- }, 1000);
127
- };
128
- const onFileChange = (event) => {
129
- const input = event.target;
130
- if (input.files && input.files.length > 0) {
131
- this._fileControl.setValue(input.files[0]);
132
- }
133
- cleanup();
134
- };
135
- fileInput.addEventListener('change', onFileChange);
136
- // Detect file browser canceled without making a selection.
137
- const onFocusReturned = () => cleanup();
138
- document.body.addEventListener('focus', onFocusReturned);
139
- window.addEventListener('focus', onFocusReturned);
140
- fileInput.click();
141
- }
142
- _onFileDropped(files) {
143
- for (const droppedFile of files) {
144
- if (droppedFile.fileEntry.isFile) {
145
- const fileEntry = droppedFile.fileEntry;
146
- fileEntry.file((file) => this._fileControl.setValue(file));
147
- break;
148
- }
100
+ this._nativeInput().nativeElement.click();
101
+ }
102
+ _onFilesDropped(files) {
103
+ if (files.length > 0)
104
+ this._fileControl.setValue(files[0]);
105
+ }
106
+ _onNativeChange(event) {
107
+ const input = event.target;
108
+ if (input.files && input.files.length > 0) {
109
+ this._fileControl.setValue(input.files[0]);
149
110
  }
111
+ input.value = '';
150
112
  }
151
113
  _setValue(value) {
152
114
  this._value.set(value);
@@ -160,18 +122,18 @@ class TheSeamSignatureInputImgComponent {
160
122
  useExisting: TheSeamSignatureInputImgComponent,
161
123
  multi: true,
162
124
  },
163
- ], ngImport: i0, template: "<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n <ngx-file-drop\n contentClassName=\"border-0\"\n dropZoneClassName=\"border-0\"\n (onFileDrop)=\"_onFileDropped($event)\"\n >\n <ng-template ngx-file-drop-content-tmp>\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </ng-template>\n </ngx-file-drop>\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.seam-signature-input-img{border-bottom:1px solid black}.seam-signature-input-img__header{font-weight:500}.seam-signature-input-img__upload-container{height:174px;position:relative}.seam-signature-input-img__upload-box{position:relative;text-align:center;cursor:pointer;background-repeat:no-repeat;background-position:center;background-size:contain}.seam-signature-input-img__upload-box.has-preview{background-color:#fff}.seam-signature-input-img__size-error{color:var(--bs-danger, #dc3545)}ngx-file-drop ::ng-deep>div{height:100%}ngx-file-drop ::ng-deep .content{height:100%}ngx-file-drop ::ng-deep #dropZone{min-height:125px}\n"], dependencies: [{ kind: "ngmodule", type: NgxFileDropModule }, { kind: "component", type: i1.NgxFileDropComponent, selector: "ngx-file-drop", inputs: ["accept", "directory", "multiple", "dropZoneLabel", "dropZoneClassName", "useDragEnter", "contentClassName", "showBrowseBtn", "browseBtnClassName", "browseBtnLabel", "disabled"], outputs: ["onFileDrop", "onFileOver", "onFileLeave"] }, { kind: "directive", type: i1.NgxFileDropContentTemplateDirective, selector: "[ngx-file-drop-content-tmp]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
125
+ ], viewQueries: [{ propertyName: "_nativeInput", first: true, predicate: ["filesInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n seamFileDropZone\n accept=\"image/*\"\n (seamFileDrop)=\"_onFilesDropped($event)\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n\n <input\n #filesInput\n type=\"file\"\n hidden\n accept=\"image/*\"\n (change)=\"_onNativeChange($event)\"\n />\n</div>\n", styles: [":host{display:block}.seam-signature-input-img{border-bottom:1px solid black}.seam-signature-input-img__header{font-weight:500}.seam-signature-input-img__upload-container{height:174px;position:relative}.seam-signature-input-img__upload-box{position:relative;text-align:center;cursor:pointer;background-repeat:no-repeat;background-position:center;background-size:contain}.seam-signature-input-img__upload-box.has-preview{background-color:#fff}.seam-signature-input-img__size-error{color:var(--bs-danger, #dc3545)}\n"], dependencies: [{ kind: "directive", type: TheSeamFileDropZoneDirective, selector: "[seamFileDropZone]", inputs: ["accept", "maxSize", "maxFiles", "disabled"], outputs: ["seamFileDrop", "seamFileDropRejected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
164
126
  }
165
127
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TheSeamSignatureInputImgComponent, decorators: [{
166
128
  type: Component,
167
- args: [{ selector: 'seam-signature-input-img', imports: [NgxFileDropModule], providers: [
129
+ args: [{ selector: 'seam-signature-input-img', imports: [TheSeamFileDropZoneDirective], providers: [
168
130
  {
169
131
  provide: NG_VALUE_ACCESSOR,
170
132
  useExisting: TheSeamSignatureInputImgComponent,
171
133
  multi: true,
172
134
  },
173
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n <ngx-file-drop\n contentClassName=\"border-0\"\n dropZoneClassName=\"border-0\"\n (onFileDrop)=\"_onFileDropped($event)\"\n >\n <ng-template ngx-file-drop-content-tmp>\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </ng-template>\n </ngx-file-drop>\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.seam-signature-input-img{border-bottom:1px solid black}.seam-signature-input-img__header{font-weight:500}.seam-signature-input-img__upload-container{height:174px;position:relative}.seam-signature-input-img__upload-box{position:relative;text-align:center;cursor:pointer;background-repeat:no-repeat;background-position:center;background-size:contain}.seam-signature-input-img__upload-box.has-preview{background-color:#fff}.seam-signature-input-img__size-error{color:var(--bs-danger, #dc3545)}ngx-file-drop ::ng-deep>div{height:100%}ngx-file-drop ::ng-deep .content{height:100%}ngx-file-drop ::ng-deep #dropZone{min-height:125px}\n"] }]
174
- }], ctorParameters: () => [] });
135
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n seamFileDropZone\n accept=\"image/*\"\n (seamFileDrop)=\"_onFilesDropped($event)\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n\n <input\n #filesInput\n type=\"file\"\n hidden\n accept=\"image/*\"\n (change)=\"_onNativeChange($event)\"\n />\n</div>\n", styles: [":host{display:block}.seam-signature-input-img{border-bottom:1px solid black}.seam-signature-input-img__header{font-weight:500}.seam-signature-input-img__upload-container{height:174px;position:relative}.seam-signature-input-img__upload-box{position:relative;text-align:center;cursor:pointer;background-repeat:no-repeat;background-position:center;background-size:contain}.seam-signature-input-img__upload-box.has-preview{background-color:#fff}.seam-signature-input-img__size-error{color:var(--bs-danger, #dc3545)}\n"] }]
136
+ }], ctorParameters: () => [], propDecorators: { _nativeInput: [{ type: i0.ViewChild, args: ['filesInput', { isSignal: true }] }] } });
175
137
 
176
138
  const DEFAULT_OPTIONS = {
177
139
  canvasWidth: 500,
@@ -271,7 +233,7 @@ class TheSeamSignatureInputPenComponent {
271
233
  useExisting: TheSeamSignatureInputPenComponent,
272
234
  multi: true,
273
235
  },
274
- ], viewQueries: [{ propertyName: "_signaturePad", first: true, predicate: ["sigPad"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"seam-signature-input-pen__canvas-wrap\"\n [style.width.px]=\"_canvasWidth()\"\n [style.height.px]=\"_canvasHeight()\"\n>\n <signature-pad\n #sigPad\n [options]=\"options()\"\n (drawStart)=\"_drawStart($event)\"\n (drawEnd)=\"_drawComplete($event)\"\n ></signature-pad>\n</div>\n", styles: [":host{display:block;overflow:hidden;position:relative}.seam-signature-input-pen__canvas-wrap{border-bottom:1px solid black}signature-pad{background:none!important}signature-pad ::ng-deep .signature-pad-canvas{border:none!important}\n"], dependencies: [{ kind: "ngmodule", type: AngularSignaturePadModule }, { kind: "component", type: i1$1.SignaturePadComponent, selector: "signature-pad", inputs: ["options"], outputs: ["drawStart", "drawBeforeUpdate", "drawAfterUpdate", "drawEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
236
+ ], viewQueries: [{ propertyName: "_signaturePad", first: true, predicate: ["sigPad"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"seam-signature-input-pen__canvas-wrap\"\n [style.width.px]=\"_canvasWidth()\"\n [style.height.px]=\"_canvasHeight()\"\n>\n <signature-pad\n #sigPad\n [options]=\"options()\"\n (drawStart)=\"_drawStart($event)\"\n (drawEnd)=\"_drawComplete($event)\"\n ></signature-pad>\n</div>\n", styles: [":host{display:block;overflow:hidden;position:relative}.seam-signature-input-pen__canvas-wrap{border-bottom:1px solid black}signature-pad{background:none!important}signature-pad ::ng-deep .signature-pad-canvas{border:none!important}\n"], dependencies: [{ kind: "ngmodule", type: AngularSignaturePadModule }, { kind: "component", type: i1.SignaturePadComponent, selector: "signature-pad", inputs: ["options"], outputs: ["drawStart", "drawBeforeUpdate", "drawAfterUpdate", "drawEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
275
237
  }
276
238
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TheSeamSignatureInputPenComponent, decorators: [{
277
239
  type: Component,
@@ -583,7 +545,7 @@ class TheSeamSignatureInputPanelComponent {
583
545
  provide: THESEAM_SIGNATURE_INPUT_CONTAINER,
584
546
  useExisting: TheSeamSignatureInputPanelComponent,
585
547
  },
586
- ], ngImport: i0, template: "<div class=\"seam-signature-input-panel\">\n <div class=\"seam-signature-input-panel__content\" cdkTrapFocus>\n <div class=\"seam-signature-input-panel__options pb-2 mb-1\">\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mr-1\"\n [class.active]=\"_activeType() === 'pen'\"\n (click)=\"showType('pen')\"\n >\n <seam-icon [icon]=\"_faSignature\" size=\"sm\"></seam-icon> Draw\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mx-1\"\n [class.active]=\"_activeType() === 'text'\"\n (click)=\"showType('text')\"\n >\n <seam-icon [icon]=\"_faKeyboard\" size=\"sm\"></seam-icon> Type\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap ml-1\"\n [class.active]=\"_activeType() === 'img'\"\n (click)=\"showType('img')\"\n >\n <seam-icon [icon]=\"_faUpload\" size=\"sm\"></seam-icon> Upload\n </button>\n </div>\n\n <form [formGroup]=\"_form\">\n @switch (_activeType()) {\n @case ('pen') {\n <seam-signature-input-pen\n formControlName=\"pen\"\n ></seam-signature-input-pen>\n }\n @case ('text') {\n <seam-signature-input-text\n formControlName=\"text\"\n ></seam-signature-input-text>\n }\n @case ('img') {\n <seam-signature-input-img\n formControlName=\"img\"\n ></seam-signature-input-img>\n }\n }\n </form>\n\n <div class=\"seam-signature-input-panel__footer mt-1\">\n <div>\n @if (_resetType() === 'delete') {\n <button\n seamButton\n theme=\"danger\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Delete\n </button>\n } @else {\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Clear\n </button>\n }\n </div>\n <div>\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n seamAutoFocus\n (click)=\"_onCancelBtnClick($event)\"\n >\n Cancel\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"!_canSubmit()\"\n (click)=\"_onSubmitBtnClick($event)\"\n >\n Apply Signature\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.seam-signature-input-panel{background-color:#fff;border-radius:4px}.seam-signature-input-panel__options{padding:8px 8px 0;border-bottom:1px solid black;display:flex;flex-direction:row;justify-content:flex-end}.seam-signature-input-panel__footer{padding:0 8px 8px;display:flex;flex-direction:row;justify-content:space-between;margin-top:2px}.seam-signature-input-panel__footer>div>*:not(:last-child){margin-right:6px}.seam-signature-input-panel__footer button{height:36px;margin-top:6px}\n"], dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TheSeamButtonsModule }, { kind: "component", type: i3.TheSeamButtonComponent, selector: "button[seamButton]", inputs: ["disabled", "theme", "size", "type"], exportAs: ["seamButton"] }, { kind: "ngmodule", type: TheSeamIconModule }, { kind: "component", type: i4.IconComponent, selector: "seam-icon", inputs: ["grayscaleOnDisable", "disabled", "iconClass", "icon", "size", "showDefaultOnError", "defaultIcon", "iconType"] }, { kind: "directive", type: TheSeamAutoFocusDirective, selector: "[seamAutoFocus]", inputs: ["seamAutoFocus"], exportAs: ["seamAutoFocus"] }, { kind: "component", type: TheSeamSignatureInputPenComponent, selector: "seam-signature-input-pen", inputs: ["options"], outputs: ["beginDrawing", "endDrawing"] }, { kind: "component", type: TheSeamSignatureInputTextComponent, selector: "seam-signature-input-text" }, { kind: "component", type: TheSeamSignatureInputImgComponent, selector: "seam-signature-input-img" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
548
+ ], ngImport: i0, template: "<div class=\"seam-signature-input-panel\">\n <div class=\"seam-signature-input-panel__content\" cdkTrapFocus>\n <div class=\"seam-signature-input-panel__options pb-2 mb-1\">\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mr-1\"\n [class.active]=\"_activeType() === 'pen'\"\n (click)=\"showType('pen')\"\n >\n <seam-icon [icon]=\"_faSignature\" size=\"sm\"></seam-icon> Draw\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mx-1\"\n [class.active]=\"_activeType() === 'text'\"\n (click)=\"showType('text')\"\n >\n <seam-icon [icon]=\"_faKeyboard\" size=\"sm\"></seam-icon> Type\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap ml-1\"\n [class.active]=\"_activeType() === 'img'\"\n (click)=\"showType('img')\"\n >\n <seam-icon [icon]=\"_faUpload\" size=\"sm\"></seam-icon> Upload\n </button>\n </div>\n\n <form [formGroup]=\"_form\">\n @switch (_activeType()) {\n @case ('pen') {\n <seam-signature-input-pen\n formControlName=\"pen\"\n ></seam-signature-input-pen>\n }\n @case ('text') {\n <seam-signature-input-text\n formControlName=\"text\"\n ></seam-signature-input-text>\n }\n @case ('img') {\n <seam-signature-input-img\n formControlName=\"img\"\n ></seam-signature-input-img>\n }\n }\n </form>\n\n <div class=\"seam-signature-input-panel__footer mt-1\">\n <div>\n @if (_resetType() === 'delete') {\n <button\n seamButton\n theme=\"danger\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Delete\n </button>\n } @else {\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Clear\n </button>\n }\n </div>\n <div>\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n seamAutoFocus\n (click)=\"_onCancelBtnClick($event)\"\n >\n Cancel\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"!_canSubmit()\"\n (click)=\"_onSubmitBtnClick($event)\"\n >\n Apply Signature\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}.seam-signature-input-panel{background-color:#fff;border-radius:4px}.seam-signature-input-panel__options{padding:8px 8px 0;border-bottom:1px solid black;display:flex;flex-direction:row;justify-content:flex-end}.seam-signature-input-panel__footer{padding:0 8px 8px;display:flex;flex-direction:row;justify-content:space-between;margin-top:2px}.seam-signature-input-panel__footer>div>*:not(:last-child){margin-right:6px}.seam-signature-input-panel__footer button{height:36px;margin-top:6px}\n"], dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TheSeamButtonsModule }, { kind: "component", type: i3.TheSeamButtonComponent, selector: "button[seamButton]", inputs: ["disabled", "theme", "size", "type"], exportAs: ["seamButton"] }, { kind: "ngmodule", type: TheSeamIconModule }, { kind: "component", type: i4.IconComponent, selector: "seam-icon", inputs: ["grayscaleOnDisable", "disabled", "iconClass", "icon", "size", "showDefaultOnError", "defaultIcon", "iconType"] }, { kind: "directive", type: TheSeamAutoFocusDirective, selector: "[seamAutoFocus]", inputs: ["seamAutoFocus"], exportAs: ["seamAutoFocus"] }, { kind: "component", type: TheSeamSignatureInputPenComponent, selector: "seam-signature-input-pen", inputs: ["options"], outputs: ["beginDrawing", "endDrawing"] }, { kind: "component", type: TheSeamSignatureInputTextComponent, selector: "seam-signature-input-text" }, { kind: "component", type: TheSeamSignatureInputImgComponent, selector: "seam-signature-input-img" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
587
549
  }
588
550
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: TheSeamSignatureInputPanelComponent, decorators: [{
589
551
  type: Component,
@@ -747,7 +709,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
747
709
 
748
710
  class TheSeamSignatureInputImgHarness extends ComponentHarness {
749
711
  static hostSelector = 'seam-signature-input-img';
750
- _fileDrop = this.locatorFor('ngx-file-drop');
712
+ _fileDrop = this.locatorFor('.seam-signature-input-img__upload-box');
751
713
  _sizeError = this.locatorForOptional('.seam-signature-input-img__size-error');
752
714
  _preview = this.locatorForOptional('.seam-signature-input-img__preview');
753
715
  async getSizeError() {
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-signature-input.mjs","sources":["../../../projects/ui-common/signature-input/signature-input-container.token.ts","../../../projects/ui-common/signature-input/signature-input-img/signature-input-img.component.ts","../../../projects/ui-common/signature-input/signature-input-img/signature-input-img.component.html","../../../projects/ui-common/signature-input/signature-input-pen/signature-input-pen.component.ts","../../../projects/ui-common/signature-input/signature-input-pen/signature-input-pen.component.html","../../../projects/ui-common/signature-input/signature-input-text/signature-input-text.component.ts","../../../projects/ui-common/signature-input/signature-input-text/signature-input-text.component.html","../../../projects/ui-common/signature-input/signature-input-panel/signature-input-panel.component.ts","../../../projects/ui-common/signature-input/signature-input-panel/signature-input-panel.component.html","../../../projects/ui-common/signature-input/signature-input-button.directive.ts","../../../projects/ui-common/signature-input/testing/signature-input-img.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-pen.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-text.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-panel.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-button.harness.ts","../../../projects/ui-common/signature-input/theseam-ui-common-signature-input.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\n\nimport { SignatureInputContainer } from './signature-input-panel.models'\n\nexport const THESEAM_SIGNATURE_INPUT_CONTAINER =\n new InjectionToken<SignatureInputContainer>(\n 'THESEAM_SIGNATURE_INPUT_CONTAINER',\n )\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core'\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n ValidatorFn,\n} from '@angular/forms'\nimport { from, of } from 'rxjs'\nimport { switchMap } from 'rxjs/operators'\n\nimport {\n FileSystemFileEntry,\n NgxFileDropEntry,\n NgxFileDropModule,\n} from 'ngx-file-drop'\nimport { readFileAsDataUrlAsync } from '@theseam/ui-common/utils'\n\nimport { SignatureInputItem } from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nconst MAX_FILE_SIZE_BYTES = 2 * 1024 * 1024\n\nconst maxFileSizeValidator: ValidatorFn = (\n control: AbstractControl,\n): ValidationErrors | null => {\n const value = control.value\n if (!(value instanceof File)) {\n return null\n }\n return value.size > MAX_FILE_SIZE_BYTES ? { maxFileSize: {} } : null\n}\n\n@Component({\n selector: 'seam-signature-input-img',\n templateUrl: './signature-input-img.component.html',\n styleUrls: ['./signature-input-img.component.scss'],\n imports: [NgxFileDropModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputImgComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputImgComponent\n implements ControlValueAccessor, SignatureInputItem\n{\n static readonly MAX_FILE_SIZE = MAX_FILE_SIZE_BYTES\n\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n /**\n * The File is only needed for validation at selection time. Once it's been\n * converted to a data URL and stored in the form value, we don't need the\n * File again — so there's no point trying to round-trip it through\n * writeValue / form state. The preview renders off the current form value.\n */\n protected readonly _fileControl = new FormControl<File | null>(null, {\n validators: [maxFileSizeValidator],\n })\n\n private readonly _fileStatus = toSignal(this._fileControl.statusChanges, {\n initialValue: this._fileControl.status,\n })\n\n protected readonly _sizeError = computed<string | null>(() => {\n // Touch the status signal so this re-runs on validity changes.\n this._fileStatus()\n return this._fileControl.getError('maxFileSize')\n ? 'File size has exceeded 2MB.'\n : null\n })\n\n /**\n * Single source of truth for both the form value and the preview image.\n * External writes (writeValue) and successful uploads both funnel through\n * here, so switching tabs and coming back always shows the last committed\n * signature.\n */\n private readonly _value = signal<string | null>(null)\n protected readonly _previewDataUrl = computed(() => this._value())\n protected readonly _previewBackgroundImage = computed(() => {\n const url = this._value()\n return url ? `url(\"${url}\")` : null\n })\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('img', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('img', this),\n )\n }\n\n // Valid file uploads convert to a data URL and become both the preview\n // and the form value. Invalid (too large) files clear both.\n this._fileControl.valueChanges\n .pipe(\n switchMap(() => {\n const file = this._fileControl.value\n if (!file || this._fileControl.invalid) {\n return of<string | null>(null)\n }\n return from(readFileAsDataUrlAsync(file))\n }),\n takeUntilDestroyed(),\n )\n .subscribe((dataUrl) => this._setValue(dataUrl))\n }\n\n writeValue(value: string | null): void {\n this._value.set(value)\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n if (this._fileControl.disabled === isDisabled) return\n if (isDisabled) this._fileControl.disable()\n else this._fileControl.enable()\n }\n\n clear(): void {\n // valueChanges subscription propagates this to `_value` (null) and to the\n // form value.\n this._fileControl.setValue(null)\n }\n\n openFileBrowse(): void {\n const fileInput = document.createElement('input')\n fileInput.setAttribute('type', 'file')\n\n const cleanup = () => {\n // Give the 'change' event a moment to fire before assuming the user\n // canceled the dialog.\n setTimeout(() => {\n fileInput.removeEventListener('change', onFileChange)\n document.body.removeEventListener('focus', onFocusReturned)\n window.removeEventListener('focus', onFocusReturned)\n }, 1000)\n }\n\n const onFileChange = (event: Event) => {\n const input = event.target as HTMLInputElement\n if (input.files && input.files.length > 0) {\n this._fileControl.setValue(input.files[0])\n }\n cleanup()\n }\n fileInput.addEventListener('change', onFileChange)\n\n // Detect file browser canceled without making a selection.\n const onFocusReturned = () => cleanup()\n document.body.addEventListener('focus', onFocusReturned)\n window.addEventListener('focus', onFocusReturned)\n\n fileInput.click()\n }\n\n protected _onFileDropped(files: NgxFileDropEntry[]) {\n for (const droppedFile of files) {\n if (droppedFile.fileEntry.isFile) {\n const fileEntry = droppedFile.fileEntry as FileSystemFileEntry\n fileEntry.file((file) => this._fileControl.setValue(file))\n break\n }\n }\n }\n\n private _setValue(value: string | null): void {\n this._value.set(value)\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n <ngx-file-drop\n contentClassName=\"border-0\"\n dropZoneClassName=\"border-0\"\n (onFileDrop)=\"_onFileDropped($event)\"\n >\n <ng-template ngx-file-drop-content-tmp>\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </ng-template>\n </ngx-file-drop>\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n</div>\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport {\n AngularSignaturePadModule,\n SignaturePadComponent,\n} from '@almothafar/angular-signature-pad'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport {\n SignatureInputItem,\n SignatureInputOptions,\n} from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nconst DEFAULT_OPTIONS: SignatureInputOptions = {\n canvasWidth: 500,\n canvasHeight: 150,\n}\n\n@Component({\n selector: 'seam-signature-input-pen',\n templateUrl: './signature-input-pen.component.html',\n styleUrls: ['./signature-input-pen.component.scss'],\n imports: [AngularSignaturePadModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputPenComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputPenComponent\n implements ControlValueAccessor, SignatureInputItem\n{\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n readonly options = input<SignatureInputOptions, SignatureInputOptions>(\n DEFAULT_OPTIONS,\n { transform: (value) => ({ ...DEFAULT_OPTIONS, ...value }) },\n )\n\n readonly beginDrawing = output<MouseEvent | Touch>()\n readonly endDrawing = output<MouseEvent | Touch>()\n\n // Optional (not required) because writeValue may be called before the view\n // is rendered — callers must null-check when reading.\n private readonly _signaturePad = viewChild<SignaturePadComponent>('sigPad')\n\n private readonly _value = signal<string | null>(null)\n private readonly _disabled = signal<boolean>(false)\n\n protected readonly _canvasWidth = computed(\n () => this.options().canvasWidth ?? DEFAULT_OPTIONS.canvasWidth,\n )\n protected readonly _canvasHeight = computed(\n () => this.options().canvasHeight ?? DEFAULT_OPTIONS.canvasHeight,\n )\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('pen', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('pen', this),\n )\n }\n\n // Restore any value written before the canvas was ready (the common case\n // when this component mounts via @switch with an existing form value).\n afterNextRender(() => this._applyValueToPad())\n }\n\n writeValue(value: string | null): void {\n this._value.set(value)\n this._applyValueToPad()\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled)\n }\n\n clear(): void {\n this._signaturePad()?.clear()\n this._setValue(null)\n }\n\n protected _drawStart(event: MouseEvent | Touch) {\n this.beginDrawing.emit(event)\n }\n\n protected _drawComplete(event: MouseEvent | Touch) {\n this._setValue(this._getDataURL())\n this.endDrawing.emit(event)\n }\n\n private _getDataURL(): string | null {\n const pad = this._signaturePad()\n if (!pad || pad.isEmpty()) {\n return null\n }\n return pad.toDataURL()\n }\n\n private _applyValueToPad(): void {\n const pad = this._signaturePad()\n if (!pad) {\n return\n }\n try {\n const value = this._value()\n if (value) {\n // fromDataURL is async and rejects on malformed input. Swallow errors\n // so a corrupted stored value can't crash the component — the form\n // control still retains the raw string.\n pad.fromDataURL(value).catch(() => undefined)\n } else {\n pad.clear()\n }\n } catch {\n // The SignaturePadComponent instance is available as soon as the view\n // query resolves, but its internal signature_pad isn't constructed\n // until ngAfterContentInit. writeValue can be called before that\n // (during form-control wire-up). afterNextRender re-invokes this once\n // the canvas is fully initialized.\n }\n }\n\n private _setValue(value: string | null): void {\n this._value.set(value)\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div\n class=\"seam-signature-input-pen__canvas-wrap\"\n [style.width.px]=\"_canvasWidth()\"\n [style.height.px]=\"_canvasHeight()\"\n>\n <signature-pad\n #sigPad\n [options]=\"options()\"\n (drawStart)=\"_drawStart($event)\"\n (drawEnd)=\"_drawComplete($event)\"\n ></signature-pad>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms'\nimport { debounceTime } from 'rxjs/operators'\n\nimport { TheSeamFontLoaderService } from '@theseam/ui-common/services'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport {\n TheSeamAutoFocusDirective,\n TheSeamDisableControlDirective,\n} from '@theseam/ui-common/shared'\n\nimport { SignatureInputItem } from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nexport type SignatureFontState = 'loading' | 'inactive' | 'active'\n\nconst SIGNATURE_FONT_FAMILY = 'Homemade Apple'\nconst CANVAS_WIDTH = 500\nconst CANVAS_HEIGHT = 127\n\n@Component({\n selector: 'seam-signature-input-text',\n templateUrl: './signature-input-text.component.html',\n styleUrls: ['./signature-input-text.component.scss'],\n imports: [\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n TheSeamAutoFocusDirective,\n TheSeamDisableControlDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputTextComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputTextComponent\n implements ControlValueAccessor, SignatureInputItem, AfterViewInit\n{\n private readonly _fontLoader = inject(TheSeamFontLoaderService)\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n // Optional (not required) because writeValue may be called before the\n // canvas is in the DOM — callers must null-check when reading.\n private readonly _typeCanvas =\n viewChild<ElementRef<HTMLCanvasElement>>('typeCanvas')\n\n readonly _nameControl = new FormControl<string | null>(null)\n\n private readonly _fontState = signal<SignatureFontState>('loading')\n protected readonly _fontLoading = computed(\n () => this._fontState() === 'loading',\n )\n protected readonly _fontInactive = computed(\n () => this._fontState() === 'inactive',\n )\n protected readonly _fontNotActive = computed(\n () => this._fontState() !== 'active',\n )\n\n private readonly _disabled = signal<boolean>(false)\n protected readonly _disabledOrFontNotActive = computed(\n () => this._disabled() || this._fontNotActive(),\n )\n\n protected readonly _canvasWidth = CANVAS_WIDTH\n protected readonly _canvasHeight = CANVAS_HEIGHT\n\n /** Current form value (rendered bitmap data URL). */\n private _value: string | null = null\n /**\n * When the user last typed a name (if any) on this instance. `null` means\n * there is no user-typed signature on this instance — the canvas should\n * keep whatever image was restored from `_value`.\n */\n private _renderedText: string | null = null\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('text', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('text', this),\n )\n }\n\n this._fontLoader\n .load({ google: { families: [SIGNATURE_FONT_FAMILY] } })\n .pipe(takeUntilDestroyed())\n .subscribe((e) => {\n if (\n e.type === 'loading' ||\n e.type === 'inactive' ||\n e.type === 'active'\n ) {\n this._fontState.set(e.type)\n }\n })\n\n // Debounced redraw of the user-typed name.\n this._nameControl.valueChanges\n .pipe(debounceTime(100), takeUntilDestroyed())\n .subscribe(() => this._drawTextToCanvas())\n\n // When the font flips to active and a name has been typed on this\n // instance, redraw the text so the now-loaded font replaces the fallback.\n // We do NOT touch the canvas otherwise — if there's a restored image but\n // no typed name, this effect must leave the image alone.\n effect(() => {\n if (this._fontState() === 'active' && this._renderedText) {\n this._drawTextToCanvas()\n }\n })\n }\n\n ngAfterViewInit(): void {\n // Paint any previously-written form value onto the canvas now that the\n // view is in place. writeValue may have been invoked earlier as part of\n // form-control wire-up, before the canvas existed.\n if (this._value) {\n this._drawImageToCanvas(this._value)\n }\n }\n\n writeValue(value: string | null): void {\n this._value = value\n this._renderedText = null\n // emitEvent: false so the debounced valueChanges subscriber doesn't fire\n // and redraw as text (which would clobber the restored image).\n this._nameControl.setValue(null, { emitEvent: false })\n this._drawImageToCanvas(value)\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled)\n }\n\n clear(): void {\n this._clearCanvas()\n this._renderedText = null\n this._nameControl.setValue(null, { emitEvent: false })\n this._setValue(null)\n }\n\n protected _onKeyDownEnter(): void {\n this._drawTextToCanvas()\n }\n\n protected _onNameInputBlur(): void {\n this._drawTextToCanvas()\n }\n\n /**\n * Paint the given data URL onto the canvas as an image. Used when the\n * component mounts with a pre-existing form value — the user's typed name\n * isn't recoverable from the rendered bitmap, only the bitmap itself.\n */\n private _drawImageToCanvas(dataUrl: string | null): void {\n const canvas = this._typeCanvas()?.nativeElement\n if (!canvas) {\n return\n }\n const context = canvas.getContext('2d')\n if (!context) {\n return\n }\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n if (!dataUrl) {\n return\n }\n const img = new Image()\n img.onload = () => {\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n context.drawImage(img, 0, 0)\n }\n img.src = dataUrl\n }\n\n /**\n * Render `_nameControl.value` as text onto the canvas and publish the\n * result as the form value. A null/empty name clears both.\n */\n private _drawTextToCanvas(): void {\n const canvas = this._typeCanvas()?.nativeElement\n if (!canvas) {\n return\n }\n const context = canvas.getContext('2d')\n if (!context) {\n return\n }\n\n const text = this._nameControl.value\n if (!text || text.trim().length === 0) {\n // Only clear if the user had previously rendered text on this instance.\n // Otherwise we'd wipe a restored image that writeValue just painted.\n if (this._renderedText !== null) {\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n this._renderedText = null\n this._setValue(null)\n }\n return\n }\n\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n context.fillStyle = 'black'\n context.textBaseline = 'bottom'\n context.textAlign = 'center'\n let fontsize = 60\n do {\n fontsize--\n context.font = `${fontsize}px ${SIGNATURE_FONT_FAMILY}, cursive`\n } while (context.measureText(text).width > CANVAS_WIDTH)\n context.fillText(text, CANVAS_WIDTH / 2, 100)\n\n this._renderedText = text\n this._setValue(canvas.toDataURL())\n }\n\n private _clearCanvas(): void {\n const context = this._typeCanvas()?.nativeElement.getContext('2d')\n context?.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n }\n\n private _setValue(value: string | null): void {\n if (this._value === value) {\n return\n }\n this._value = value\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div class=\"seam-signature-input-text\">\n <div class=\"seam-signature-input-text__header d-flex flex-row\">\n <seam-form-field\n [inline]=\"true\"\n class=\"flex-grow-1 mr-2\"\n [numPaddingErrors]=\"0\"\n >\n <span *seamFormFieldLabelTpl class=\"text-nowrap mr-2\"\n >Enter Full Name:</span\n >\n <input\n seamInput\n [formControl]=\"_nameControl\"\n class=\"pl-1 flex-grow-1\"\n autocomplete=\"off\"\n (keydown.enter)=\"_onKeyDownEnter()\"\n (blur)=\"_onNameInputBlur()\"\n [seamDisableControl]=\"_disabledOrFontNotActive()\"\n seamAutoFocus\n />\n </seam-form-field>\n </div>\n\n <div\n class=\"seam-signature-input-text__canvas-wrap overflow-hidden position-relative\"\n [style.height.px]=\"_canvasHeight\"\n >\n @if (_fontLoading()) {\n <div class=\"seam-signature-input-text__status\">Font Loading</div>\n }\n\n @if (_fontInactive()) {\n <div class=\"seam-signature-input-text__status text-warning\">\n <div class=\"seam-signature-input-text__status-headline\">\n Font failed to load.\n </div>\n <div>\n To use the typed signature, try refreshing the page or using another\n web browser. If you still have issues please contact support and let\n us know.\n </div>\n </div>\n }\n\n <canvas\n #typeCanvas\n class=\"position-absolute\"\n [attr.width]=\"_canvasWidth\"\n [attr.height]=\"_canvasHeight\"\n [style.top.px]=\"0\"\n [style.left.px]=\"0\"\n ></canvas>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n isDevMode,\n output,\n signal,\n} from '@angular/core'\nimport { A11yModule } from '@angular/cdk/a11y'\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop'\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'\nimport { combineLatest, map, switchMap } from 'rxjs'\n\nimport {\n faKeyboard,\n faSignature,\n faUpload,\n} from '@fortawesome/free-solid-svg-icons'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamLayoutService } from '@theseam/ui-common/layout'\nimport { ModalRef } from '@theseam/ui-common/modal'\nimport { TheSeamAutoFocusDirective } from '@theseam/ui-common/shared'\nimport {\n observeControlValid,\n observeControlValue,\n} from '@theseam/ui-common/utils'\n\nimport {\n SignatureInputContainer,\n SignatureInputItem,\n SignatureInputPanelResult,\n SignatureInputResetType,\n SignatureInputType,\n} from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\nimport { TheSeamSignatureInputImgComponent } from '../signature-input-img/signature-input-img.component'\nimport { TheSeamSignatureInputPenComponent } from '../signature-input-pen/signature-input-pen.component'\nimport { TheSeamSignatureInputTextComponent } from '../signature-input-text/signature-input-text.component'\n\ninterface SignatureInputPanelForm {\n pen: FormControl<string | null>\n text: FormControl<string | null>\n img: FormControl<string | null>\n}\n\nconst isValueEmpty = (value: unknown): boolean =>\n typeof value !== 'string' || value.trim().length === 0\n\n@Component({\n selector: 'seam-signature-input-panel',\n templateUrl: './signature-input-panel.component.html',\n styleUrls: ['./signature-input-panel.component.scss'],\n imports: [\n A11yModule,\n ReactiveFormsModule,\n TheSeamButtonsModule,\n TheSeamIconModule,\n TheSeamAutoFocusDirective,\n TheSeamSignatureInputPenComponent,\n TheSeamSignatureInputTextComponent,\n TheSeamSignatureInputImgComponent,\n ],\n providers: [\n {\n provide: THESEAM_SIGNATURE_INPUT_CONTAINER,\n useExisting: TheSeamSignatureInputPanelComponent,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /**\n * Allow focusing the host element via `focus()` without it being part of the\n * tab order (the inner inputs handle keyboard navigation).\n */\n '[attr.tabIndex]': '-1',\n },\n})\nexport class TheSeamSignatureInputPanelComponent\n implements SignatureInputContainer\n{\n private readonly _layout = inject(TheSeamLayoutService)\n private readonly _modalRef = inject<ModalRef<SignatureInputPanelResult>>(\n ModalRef,\n { optional: true },\n )\n\n /** Emitted when the panel is submitted or canceled. */\n readonly result = output<SignatureInputPanelResult>()\n\n protected readonly _faSignature = faSignature\n protected readonly _faUpload = faUpload\n protected readonly _faKeyboard = faKeyboard\n\n protected readonly _activeType = signal<SignatureInputType>('pen')\n protected readonly _resetType = computed<SignatureInputResetType>(() =>\n this._activeType() === 'img' ? 'delete' : 'cancel',\n )\n\n readonly _form = new FormGroup<SignatureInputPanelForm>({\n pen: new FormControl<string | null>(null),\n text: new FormControl<string | null>(null),\n img: new FormControl<string | null>(null),\n })\n\n private readonly _registeredInputItems = new Map<string, SignatureInputItem>()\n\n // Observables are used here because the active control changes, which makes\n // a pure-signal approach awkward (signals don't naturally switch between\n // observable sources). We derive the active control, its value, and its\n // validity via rxjs, then expose the results as signals for the template.\n private readonly _activeControl$ = toObservable(this._activeType).pipe(\n map((type) => this._form.controls[type]),\n )\n\n private readonly _activeValue$ = this._activeControl$.pipe(\n switchMap((control) => observeControlValue<string | null>(control)),\n map((value) => (isValueEmpty(value) ? null : (value as string))),\n )\n\n private readonly _canSubmit$ = combineLatest([\n this._activeControl$.pipe(switchMap((c) => observeControlValid(c))),\n this._activeValue$,\n ]).pipe(map(([valid, value]) => valid && value !== null))\n\n protected readonly _value = toSignal(this._activeValue$, {\n initialValue: null,\n })\n protected readonly _valueEmpty = computed(() => this._value() === null)\n protected readonly _canSubmit = toSignal(this._canSubmit$, {\n initialValue: false,\n })\n\n protected readonly _isSm = toSignal(this._layout.observe('sm'), {\n initialValue: false,\n })\n\n showType(type: SignatureInputType) {\n this._activeType.set(type)\n }\n\n registerInputItem(type: string, item: SignatureInputItem): boolean {\n if (this._registeredInputItems.has(type)) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Input item '${type}' is already registered.`,\n )\n }\n return false\n }\n this._registeredInputItems.set(type, item)\n return true\n }\n\n unregisterInputItem(type: string, item: SignatureInputItem): boolean {\n const registered = this._registeredInputItems.get(type)\n if (!registered) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Input item '${type}' can't be unregistered.`,\n )\n }\n return false\n }\n if (isDevMode() && registered !== item) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Registered item for type '${type}' doesn't match the item being unregistered.`,\n )\n }\n this._registeredInputItems.delete(type)\n return true\n }\n\n reset() {\n this._form.reset({ pen: null, text: null, img: null })\n }\n\n protected _onClearBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n this._registeredInputItems.get(this._activeType())?.clear()\n }\n\n protected _onCancelBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n this.reset()\n this._emit({ type: 'cancel' })\n }\n\n protected _onSubmitBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n if (!this._canSubmit()) {\n return\n }\n const value = this._value()\n if (value === null) {\n return\n }\n this._emit({ type: 'submit', value })\n }\n\n private _emit(result: SignatureInputPanelResult) {\n this.result.emit(result)\n this._modalRef?.close(result)\n }\n}\n","<div class=\"seam-signature-input-panel\">\n <div class=\"seam-signature-input-panel__content\" cdkTrapFocus>\n <div class=\"seam-signature-input-panel__options pb-2 mb-1\">\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mr-1\"\n [class.active]=\"_activeType() === 'pen'\"\n (click)=\"showType('pen')\"\n >\n <seam-icon [icon]=\"_faSignature\" size=\"sm\"></seam-icon> Draw\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mx-1\"\n [class.active]=\"_activeType() === 'text'\"\n (click)=\"showType('text')\"\n >\n <seam-icon [icon]=\"_faKeyboard\" size=\"sm\"></seam-icon> Type\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap ml-1\"\n [class.active]=\"_activeType() === 'img'\"\n (click)=\"showType('img')\"\n >\n <seam-icon [icon]=\"_faUpload\" size=\"sm\"></seam-icon> Upload\n </button>\n </div>\n\n <form [formGroup]=\"_form\">\n @switch (_activeType()) {\n @case ('pen') {\n <seam-signature-input-pen\n formControlName=\"pen\"\n ></seam-signature-input-pen>\n }\n @case ('text') {\n <seam-signature-input-text\n formControlName=\"text\"\n ></seam-signature-input-text>\n }\n @case ('img') {\n <seam-signature-input-img\n formControlName=\"img\"\n ></seam-signature-input-img>\n }\n }\n </form>\n\n <div class=\"seam-signature-input-panel__footer mt-1\">\n <div>\n @if (_resetType() === 'delete') {\n <button\n seamButton\n theme=\"danger\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Delete\n </button>\n } @else {\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Clear\n </button>\n }\n </div>\n <div>\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n seamAutoFocus\n (click)=\"_onCancelBtnClick($event)\"\n >\n Cancel\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"!_canSubmit()\"\n (click)=\"_onSubmitBtnClick($event)\"\n >\n Apply Signature\n </button>\n </div>\n </div>\n </div>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n Output,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { take } from 'rxjs/operators'\n\nimport {\n TheSeamAnchorButtonComponent,\n TheSeamButtonComponent,\n} from '@theseam/ui-common/buttons'\nimport { Modal, ModalConfig } from '@theseam/ui-common/modal'\n\nimport { SignatureInputPanelResult } from './signature-input-panel.models'\nimport { TheSeamSignatureInputPanelComponent } from './signature-input-panel/signature-input-panel.component'\n\n/**\n * Opens the signature input panel in a modal when the host button/anchor is\n * clicked, and writes the submitted data URL back through its bound form\n * control. Implements `ControlValueAccessor` so it works with any of the form\n * binding styles (`formControl`, `formControlName`, `ngModel`).\n *\n * Usage:\n *\n * ```html\n * <button seamButton theme=\"primary\" seamSignatureInput formControlName=\"signature\">\n * Sign\n * </button>\n * ```\n *\n * The selector-name input accepts a partial `ModalConfig` for cases that need\n * to tweak the modal (e.g. `disableClose`):\n *\n * ```html\n * <button\n * seamButton\n * [seamSignatureInput]=\"{ disableClose: true }\"\n * formControlName=\"signature\"\n * >Sign</button>\n * ```\n */\n@Directive({\n selector: 'button[seamSignatureInput], a[seamSignatureInput]',\n exportAs: 'seamSignatureInput',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputButtonDirective,\n multi: true,\n },\n ],\n})\nexport class TheSeamSignatureInputButtonDirective\n implements ControlValueAccessor\n{\n private readonly _modal = inject(Modal)\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef)\n // When the same host element also carries `seamButton`/`a[seamButton]`,\n // delegate disabled state to its `disabled` input so its host binding remains\n // the single source of truth for the `disabled` attribute — avoids a\n // tug-of-war between this directive and the button directive's CD.\n private readonly _seamButton = inject(TheSeamButtonComponent, {\n optional: true,\n self: true,\n })\n private readonly _seamAnchor = inject(TheSeamAnchorButtonComponent, {\n optional: true,\n self: true,\n })\n\n /**\n * Partial `ModalConfig` passthrough. Most consumers leave this unset; the\n * signature panel's styles assume the default modal size.\n */\n\n @Input('seamSignatureInput') modalConfig: ModalConfig | null | undefined\n\n /** Emits the submitted data URL when the user applies a signature. */\n @Output() signed = new EventEmitter<string>()\n\n /** Emits when the user dismisses the panel without submitting. */\n @Output() canceled = new EventEmitter<void>()\n\n private _value: string | null = null\n private _disabled = false\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n writeValue(value: string | null): void {\n this._value = value\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled = isDisabled\n if (this._seamButton) {\n this._seamButton.disabled = isDisabled\n } else if (this._seamAnchor) {\n this._seamAnchor.disabled = isDisabled\n } else {\n const el = this._elementRef.nativeElement\n if (isDisabled) {\n el.setAttribute('disabled', '')\n } else {\n el.removeAttribute('disabled')\n }\n }\n }\n\n /** @ignore */\n @HostListener('click')\n _onClick(): void {\n if (this._disabled) {\n return\n }\n const ref = this._modal.openFromComponent<\n TheSeamSignatureInputPanelComponent,\n SignatureInputPanelResult\n >(TheSeamSignatureInputPanelComponent, this.modalConfig ?? undefined)\n\n ref\n .afterClosed()\n .pipe(take(1))\n .subscribe((result) => {\n this._onTouched()\n if (result?.type === 'submit') {\n this._value = result.value\n this._onChange(result.value)\n this.signed.emit(result.value)\n } else {\n this.canceled.emit()\n }\n })\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputImgHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-img'\n\n private readonly _fileDrop = this.locatorFor('ngx-file-drop')\n private readonly _sizeError = this.locatorForOptional(\n '.seam-signature-input-img__size-error',\n )\n private readonly _preview = this.locatorForOptional(\n '.seam-signature-input-img__preview',\n )\n\n async getSizeError(): Promise<string | null> {\n const el = await this._sizeError()\n return el ? (await el.text()).trim() : null\n }\n\n async hasPreview(): Promise<boolean> {\n return (await this._preview()) !== null\n }\n\n async getPreviewSrc(): Promise<string | null> {\n const el = await this._preview()\n return el ? el.getAttribute('src') : null\n }\n\n async getFileDrop() {\n return this._fileDrop()\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputPenHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-pen'\n\n private readonly _canvas = this.locatorFor('canvas')\n\n async getCanvas() {\n return this._canvas()\n }\n\n async getCanvasWidth(): Promise<number | null> {\n const canvas = await this._canvas()\n const attr = await canvas.getAttribute('width')\n return attr ? Number(attr) : null\n }\n\n async getCanvasHeight(): Promise<number | null> {\n const canvas = await this._canvas()\n const attr = await canvas.getAttribute('height')\n return attr ? Number(attr) : null\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputTextHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-text'\n\n private readonly _input = this.locatorFor('input')\n private readonly _canvas = this.locatorFor('canvas')\n\n async getInput() {\n return this._input()\n }\n\n async enterName(text: string): Promise<void> {\n const input = await this._input()\n await input.clear()\n await input.sendKeys(text)\n }\n\n async getInputValue(): Promise<string> {\n const input = await this._input()\n return input.getProperty<string>('value')\n }\n\n async isInputDisabled(): Promise<boolean> {\n const input = await this._input()\n return (await input.getAttribute('disabled')) !== null\n }\n\n async getCanvas() {\n return this._canvas()\n }\n}\n","import { ComponentHarness, TestElement } from '@angular/cdk/testing'\n\nimport { SignatureInputType } from '../signature-input-panel.models'\nimport { TheSeamSignatureInputImgHarness } from './signature-input-img.harness'\nimport { TheSeamSignatureInputPenHarness } from './signature-input-pen.harness'\nimport { TheSeamSignatureInputTextHarness } from './signature-input-text.harness'\n\nexport class TheSeamSignatureInputPanelHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-panel'\n\n private readonly _drawBtn = this.locatorFor('button:nth-of-type(1)')\n private readonly _typeBtn = this.locatorFor('button:nth-of-type(2)')\n private readonly _uploadBtn = this.locatorFor('button:nth-of-type(3)')\n\n private readonly _footerBtns = this.locatorForAll(\n '.seam-signature-input-panel__footer button',\n )\n\n private readonly _penHarness = this.locatorForOptional(\n TheSeamSignatureInputPenHarness,\n )\n private readonly _textHarness = this.locatorForOptional(\n TheSeamSignatureInputTextHarness,\n )\n private readonly _imgHarness = this.locatorForOptional(\n TheSeamSignatureInputImgHarness,\n )\n\n async showType(type: SignatureInputType): Promise<void> {\n const btn =\n type === 'pen'\n ? await this._drawBtn()\n : type === 'text'\n ? await this._typeBtn()\n : await this._uploadBtn()\n await btn.click()\n }\n\n async getActiveType(): Promise<SignatureInputType | null> {\n if (await this._penHarness()) return 'pen'\n if (await this._textHarness()) return 'text'\n if (await this._imgHarness()) return 'img'\n return null\n }\n\n async getPen(): Promise<TheSeamSignatureInputPenHarness | null> {\n return this._penHarness()\n }\n\n async getText(): Promise<TheSeamSignatureInputTextHarness | null> {\n return this._textHarness()\n }\n\n async getImg(): Promise<TheSeamSignatureInputImgHarness | null> {\n return this._imgHarness()\n }\n\n async getClearOrDeleteButton(): Promise<TestElement> {\n const [btn] = await this._footerBtns()\n return btn\n }\n\n async getCancelButton(): Promise<TestElement> {\n const buttons = await this._footerBtns()\n return buttons[buttons.length - 2]\n }\n\n async getSubmitButton(): Promise<TestElement> {\n const buttons = await this._footerBtns()\n return buttons[buttons.length - 1]\n }\n\n async isSubmitDisabled(): Promise<boolean> {\n const btn = await this.getSubmitButton()\n return (await btn.getAttribute('disabled')) !== null\n }\n\n async cancel(): Promise<void> {\n const btn = await this.getCancelButton()\n await btn.click()\n }\n\n async submit(): Promise<void> {\n const btn = await this.getSubmitButton()\n await btn.click()\n }\n}\n","import {\n BaseHarnessFilters,\n ComponentHarness,\n HarnessPredicate,\n} from '@angular/cdk/testing'\n\nexport interface SignatureInputButtonHarnessFilters extends BaseHarnessFilters {\n text?: string | RegExp\n}\n\nexport class TheSeamSignatureInputButtonHarness extends ComponentHarness {\n static hostSelector = 'button[seamSignatureInput], a[seamSignatureInput]'\n\n static with(\n options: SignatureInputButtonHarnessFilters = {},\n ): HarnessPredicate<TheSeamSignatureInputButtonHarness> {\n return new HarnessPredicate(\n TheSeamSignatureInputButtonHarness,\n options,\n ).addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n )\n }\n\n async getText(): Promise<string> {\n return (await this.host()).text()\n }\n\n async isDisabled(): Promise<boolean> {\n return (await this.host()).getAttribute('disabled').then((v) => v !== null)\n }\n\n async click(): Promise<void> {\n await (await this.host()).click()\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","switchMap"],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-signature-input.mjs","sources":["../../../projects/ui-common/signature-input/signature-input-container.token.ts","../../../projects/ui-common/signature-input/signature-input-img/signature-input-img.component.ts","../../../projects/ui-common/signature-input/signature-input-img/signature-input-img.component.html","../../../projects/ui-common/signature-input/signature-input-pen/signature-input-pen.component.ts","../../../projects/ui-common/signature-input/signature-input-pen/signature-input-pen.component.html","../../../projects/ui-common/signature-input/signature-input-text/signature-input-text.component.ts","../../../projects/ui-common/signature-input/signature-input-text/signature-input-text.component.html","../../../projects/ui-common/signature-input/signature-input-panel/signature-input-panel.component.ts","../../../projects/ui-common/signature-input/signature-input-panel/signature-input-panel.component.html","../../../projects/ui-common/signature-input/signature-input-button.directive.ts","../../../projects/ui-common/signature-input/testing/signature-input-img.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-pen.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-text.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-panel.harness.ts","../../../projects/ui-common/signature-input/testing/signature-input-button.harness.ts","../../../projects/ui-common/signature-input/theseam-ui-common-signature-input.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\n\nimport { SignatureInputContainer } from './signature-input-panel.models'\n\nexport const THESEAM_SIGNATURE_INPUT_CONTAINER =\n new InjectionToken<SignatureInputContainer>(\n 'THESEAM_SIGNATURE_INPUT_CONTAINER',\n )\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n ValidatorFn,\n} from '@angular/forms'\nimport { from, of } from 'rxjs'\nimport { switchMap } from 'rxjs/operators'\n\nimport { TheSeamFileDropZoneDirective } from '@theseam/ui-common/file-input'\nimport { readFileAsDataUrlAsync } from '@theseam/ui-common/utils'\n\nimport { SignatureInputItem } from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nconst MAX_FILE_SIZE_BYTES = 2 * 1024 * 1024\n\nconst maxFileSizeValidator: ValidatorFn = (\n control: AbstractControl,\n): ValidationErrors | null => {\n const value = control.value\n if (!(value instanceof File)) {\n return null\n }\n return value.size > MAX_FILE_SIZE_BYTES ? { maxFileSize: {} } : null\n}\n\n@Component({\n selector: 'seam-signature-input-img',\n templateUrl: './signature-input-img.component.html',\n styleUrls: ['./signature-input-img.component.scss'],\n imports: [TheSeamFileDropZoneDirective],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputImgComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputImgComponent\n implements ControlValueAccessor, SignatureInputItem\n{\n static readonly MAX_FILE_SIZE = MAX_FILE_SIZE_BYTES\n\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n protected readonly _fileControl = new FormControl<File | null>(null, {\n validators: [maxFileSizeValidator],\n })\n\n private readonly _fileStatus = toSignal(this._fileControl.statusChanges, {\n initialValue: this._fileControl.status,\n })\n\n protected readonly _sizeError = computed<string | null>(() => {\n this._fileStatus()\n return this._fileControl.getError('maxFileSize')\n ? 'File size has exceeded 2MB.'\n : null\n })\n\n private readonly _value = signal<string | null>(null)\n protected readonly _previewDataUrl = computed(() => this._value())\n protected readonly _previewBackgroundImage = computed(() => {\n const url = this._value()\n return url ? `url(\"${url}\")` : null\n })\n\n private readonly _nativeInput =\n viewChild.required<ElementRef<HTMLInputElement>>('filesInput')\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('img', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('img', this),\n )\n }\n\n this._fileControl.valueChanges\n .pipe(\n switchMap(() => {\n const file = this._fileControl.value\n if (!file || this._fileControl.invalid) {\n return of<string | null>(null)\n }\n return from(readFileAsDataUrlAsync(file))\n }),\n takeUntilDestroyed(),\n )\n .subscribe((dataUrl) => this._setValue(dataUrl))\n }\n\n writeValue(value: string | null): void {\n this._value.set(value)\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n if (this._fileControl.disabled === isDisabled) return\n if (isDisabled) this._fileControl.disable()\n else this._fileControl.enable()\n }\n\n clear(): void {\n this._fileControl.setValue(null)\n }\n\n openFileBrowse(): void {\n this._nativeInput().nativeElement.click()\n }\n\n protected _onFilesDropped(files: File[]): void {\n if (files.length > 0) this._fileControl.setValue(files[0])\n }\n\n protected _onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement\n if (input.files && input.files.length > 0) {\n this._fileControl.setValue(input.files[0])\n }\n input.value = ''\n }\n\n private _setValue(value: string | null): void {\n this._value.set(value)\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div class=\"seam-signature-input-img\">\n <div class=\"seam-signature-input-img__upload-container\">\n <div class=\"seam-signature-input-img__header h-100\">\n <div\n class=\"seam-signature-input-img__upload-box h-100\"\n [class.has-preview]=\"!!_previewDataUrl()\"\n [style.background-image]=\"_previewBackgroundImage()\"\n tabindex=\"0\"\n seamFileDropZone\n accept=\"image/*\"\n (seamFileDrop)=\"_onFilesDropped($event)\"\n (click)=\"openFileBrowse()\"\n (keydown.enter)=\"openFileBrowse()\"\n >\n @if (!_previewDataUrl()) {\n <div class=\"seam-signature-input-img__drop-prompt\">\n <strong>Choose a file</strong> or drag it here\n </div>\n }\n </div>\n\n @if (_sizeError(); as err) {\n <div class=\"seam-signature-input-img__size-error\">{{ err }}</div>\n }\n </div>\n </div>\n\n <input\n #filesInput\n type=\"file\"\n hidden\n accept=\"image/*\"\n (change)=\"_onNativeChange($event)\"\n />\n</div>\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport {\n AngularSignaturePadModule,\n SignaturePadComponent,\n} from '@almothafar/angular-signature-pad'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport {\n SignatureInputItem,\n SignatureInputOptions,\n} from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nconst DEFAULT_OPTIONS: SignatureInputOptions = {\n canvasWidth: 500,\n canvasHeight: 150,\n}\n\n@Component({\n selector: 'seam-signature-input-pen',\n templateUrl: './signature-input-pen.component.html',\n styleUrls: ['./signature-input-pen.component.scss'],\n imports: [AngularSignaturePadModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputPenComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputPenComponent\n implements ControlValueAccessor, SignatureInputItem\n{\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n readonly options = input<SignatureInputOptions, SignatureInputOptions>(\n DEFAULT_OPTIONS,\n { transform: (value) => ({ ...DEFAULT_OPTIONS, ...value }) },\n )\n\n readonly beginDrawing = output<MouseEvent | Touch>()\n readonly endDrawing = output<MouseEvent | Touch>()\n\n // Optional (not required) because writeValue may be called before the view\n // is rendered — callers must null-check when reading.\n private readonly _signaturePad = viewChild<SignaturePadComponent>('sigPad')\n\n private readonly _value = signal<string | null>(null)\n private readonly _disabled = signal<boolean>(false)\n\n protected readonly _canvasWidth = computed(\n () => this.options().canvasWidth ?? DEFAULT_OPTIONS.canvasWidth,\n )\n protected readonly _canvasHeight = computed(\n () => this.options().canvasHeight ?? DEFAULT_OPTIONS.canvasHeight,\n )\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('pen', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('pen', this),\n )\n }\n\n // Restore any value written before the canvas was ready (the common case\n // when this component mounts via @switch with an existing form value).\n afterNextRender(() => this._applyValueToPad())\n }\n\n writeValue(value: string | null): void {\n this._value.set(value)\n this._applyValueToPad()\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled)\n }\n\n clear(): void {\n this._signaturePad()?.clear()\n this._setValue(null)\n }\n\n protected _drawStart(event: MouseEvent | Touch) {\n this.beginDrawing.emit(event)\n }\n\n protected _drawComplete(event: MouseEvent | Touch) {\n this._setValue(this._getDataURL())\n this.endDrawing.emit(event)\n }\n\n private _getDataURL(): string | null {\n const pad = this._signaturePad()\n if (!pad || pad.isEmpty()) {\n return null\n }\n return pad.toDataURL()\n }\n\n private _applyValueToPad(): void {\n const pad = this._signaturePad()\n if (!pad) {\n return\n }\n try {\n const value = this._value()\n if (value) {\n // fromDataURL is async and rejects on malformed input. Swallow errors\n // so a corrupted stored value can't crash the component — the form\n // control still retains the raw string.\n pad.fromDataURL(value).catch(() => undefined)\n } else {\n pad.clear()\n }\n } catch {\n // The SignaturePadComponent instance is available as soon as the view\n // query resolves, but its internal signature_pad isn't constructed\n // until ngAfterContentInit. writeValue can be called before that\n // (during form-control wire-up). afterNextRender re-invokes this once\n // the canvas is fully initialized.\n }\n }\n\n private _setValue(value: string | null): void {\n this._value.set(value)\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div\n class=\"seam-signature-input-pen__canvas-wrap\"\n [style.width.px]=\"_canvasWidth()\"\n [style.height.px]=\"_canvasHeight()\"\n>\n <signature-pad\n #sigPad\n [options]=\"options()\"\n (drawStart)=\"_drawStart($event)\"\n (drawEnd)=\"_drawComplete($event)\"\n ></signature-pad>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms'\nimport { debounceTime } from 'rxjs/operators'\n\nimport { TheSeamFontLoaderService } from '@theseam/ui-common/services'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport {\n TheSeamAutoFocusDirective,\n TheSeamDisableControlDirective,\n} from '@theseam/ui-common/shared'\n\nimport { SignatureInputItem } from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\n\nexport type SignatureFontState = 'loading' | 'inactive' | 'active'\n\nconst SIGNATURE_FONT_FAMILY = 'Homemade Apple'\nconst CANVAS_WIDTH = 500\nconst CANVAS_HEIGHT = 127\n\n@Component({\n selector: 'seam-signature-input-text',\n templateUrl: './signature-input-text.component.html',\n styleUrls: ['./signature-input-text.component.scss'],\n imports: [\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n TheSeamAutoFocusDirective,\n TheSeamDisableControlDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputTextComponent,\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamSignatureInputTextComponent\n implements ControlValueAccessor, SignatureInputItem, AfterViewInit\n{\n private readonly _fontLoader = inject(TheSeamFontLoaderService)\n private readonly _container = inject(THESEAM_SIGNATURE_INPUT_CONTAINER, {\n optional: true,\n })\n private readonly _destroyRef = inject(DestroyRef)\n\n // Optional (not required) because writeValue may be called before the\n // canvas is in the DOM — callers must null-check when reading.\n private readonly _typeCanvas =\n viewChild<ElementRef<HTMLCanvasElement>>('typeCanvas')\n\n readonly _nameControl = new FormControl<string | null>(null)\n\n private readonly _fontState = signal<SignatureFontState>('loading')\n protected readonly _fontLoading = computed(\n () => this._fontState() === 'loading',\n )\n protected readonly _fontInactive = computed(\n () => this._fontState() === 'inactive',\n )\n protected readonly _fontNotActive = computed(\n () => this._fontState() !== 'active',\n )\n\n private readonly _disabled = signal<boolean>(false)\n protected readonly _disabledOrFontNotActive = computed(\n () => this._disabled() || this._fontNotActive(),\n )\n\n protected readonly _canvasWidth = CANVAS_WIDTH\n protected readonly _canvasHeight = CANVAS_HEIGHT\n\n /** Current form value (rendered bitmap data URL). */\n private _value: string | null = null\n /**\n * When the user last typed a name (if any) on this instance. `null` means\n * there is no user-typed signature on this instance — the canvas should\n * keep whatever image was restored from `_value`.\n */\n private _renderedText: string | null = null\n\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n constructor() {\n if (this._container) {\n this._container.registerInputItem('text', this)\n this._destroyRef.onDestroy(() =>\n this._container?.unregisterInputItem('text', this),\n )\n }\n\n this._fontLoader\n .load({ google: { families: [SIGNATURE_FONT_FAMILY] } })\n .pipe(takeUntilDestroyed())\n .subscribe((e) => {\n if (\n e.type === 'loading' ||\n e.type === 'inactive' ||\n e.type === 'active'\n ) {\n this._fontState.set(e.type)\n }\n })\n\n // Debounced redraw of the user-typed name.\n this._nameControl.valueChanges\n .pipe(debounceTime(100), takeUntilDestroyed())\n .subscribe(() => this._drawTextToCanvas())\n\n // When the font flips to active and a name has been typed on this\n // instance, redraw the text so the now-loaded font replaces the fallback.\n // We do NOT touch the canvas otherwise — if there's a restored image but\n // no typed name, this effect must leave the image alone.\n effect(() => {\n if (this._fontState() === 'active' && this._renderedText) {\n this._drawTextToCanvas()\n }\n })\n }\n\n ngAfterViewInit(): void {\n // Paint any previously-written form value onto the canvas now that the\n // view is in place. writeValue may have been invoked earlier as part of\n // form-control wire-up, before the canvas existed.\n if (this._value) {\n this._drawImageToCanvas(this._value)\n }\n }\n\n writeValue(value: string | null): void {\n this._value = value\n this._renderedText = null\n // emitEvent: false so the debounced valueChanges subscriber doesn't fire\n // and redraw as text (which would clobber the restored image).\n this._nameControl.setValue(null, { emitEvent: false })\n this._drawImageToCanvas(value)\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled)\n }\n\n clear(): void {\n this._clearCanvas()\n this._renderedText = null\n this._nameControl.setValue(null, { emitEvent: false })\n this._setValue(null)\n }\n\n protected _onKeyDownEnter(): void {\n this._drawTextToCanvas()\n }\n\n protected _onNameInputBlur(): void {\n this._drawTextToCanvas()\n }\n\n /**\n * Paint the given data URL onto the canvas as an image. Used when the\n * component mounts with a pre-existing form value — the user's typed name\n * isn't recoverable from the rendered bitmap, only the bitmap itself.\n */\n private _drawImageToCanvas(dataUrl: string | null): void {\n const canvas = this._typeCanvas()?.nativeElement\n if (!canvas) {\n return\n }\n const context = canvas.getContext('2d')\n if (!context) {\n return\n }\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n if (!dataUrl) {\n return\n }\n const img = new Image()\n img.onload = () => {\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n context.drawImage(img, 0, 0)\n }\n img.src = dataUrl\n }\n\n /**\n * Render `_nameControl.value` as text onto the canvas and publish the\n * result as the form value. A null/empty name clears both.\n */\n private _drawTextToCanvas(): void {\n const canvas = this._typeCanvas()?.nativeElement\n if (!canvas) {\n return\n }\n const context = canvas.getContext('2d')\n if (!context) {\n return\n }\n\n const text = this._nameControl.value\n if (!text || text.trim().length === 0) {\n // Only clear if the user had previously rendered text on this instance.\n // Otherwise we'd wipe a restored image that writeValue just painted.\n if (this._renderedText !== null) {\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n this._renderedText = null\n this._setValue(null)\n }\n return\n }\n\n context.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n context.fillStyle = 'black'\n context.textBaseline = 'bottom'\n context.textAlign = 'center'\n let fontsize = 60\n do {\n fontsize--\n context.font = `${fontsize}px ${SIGNATURE_FONT_FAMILY}, cursive`\n } while (context.measureText(text).width > CANVAS_WIDTH)\n context.fillText(text, CANVAS_WIDTH / 2, 100)\n\n this._renderedText = text\n this._setValue(canvas.toDataURL())\n }\n\n private _clearCanvas(): void {\n const context = this._typeCanvas()?.nativeElement.getContext('2d')\n context?.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)\n }\n\n private _setValue(value: string | null): void {\n if (this._value === value) {\n return\n }\n this._value = value\n this._onChange(value)\n this._onTouched()\n }\n}\n","<div class=\"seam-signature-input-text\">\n <div class=\"seam-signature-input-text__header d-flex flex-row\">\n <seam-form-field\n [inline]=\"true\"\n class=\"flex-grow-1 mr-2\"\n [numPaddingErrors]=\"0\"\n >\n <span *seamFormFieldLabelTpl class=\"text-nowrap mr-2\"\n >Enter Full Name:</span\n >\n <input\n seamInput\n [formControl]=\"_nameControl\"\n class=\"pl-1 flex-grow-1\"\n autocomplete=\"off\"\n (keydown.enter)=\"_onKeyDownEnter()\"\n (blur)=\"_onNameInputBlur()\"\n [seamDisableControl]=\"_disabledOrFontNotActive()\"\n seamAutoFocus\n />\n </seam-form-field>\n </div>\n\n <div\n class=\"seam-signature-input-text__canvas-wrap overflow-hidden position-relative\"\n [style.height.px]=\"_canvasHeight\"\n >\n @if (_fontLoading()) {\n <div class=\"seam-signature-input-text__status\">Font Loading</div>\n }\n\n @if (_fontInactive()) {\n <div class=\"seam-signature-input-text__status text-warning\">\n <div class=\"seam-signature-input-text__status-headline\">\n Font failed to load.\n </div>\n <div>\n To use the typed signature, try refreshing the page or using another\n web browser. If you still have issues please contact support and let\n us know.\n </div>\n </div>\n }\n\n <canvas\n #typeCanvas\n class=\"position-absolute\"\n [attr.width]=\"_canvasWidth\"\n [attr.height]=\"_canvasHeight\"\n [style.top.px]=\"0\"\n [style.left.px]=\"0\"\n ></canvas>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n isDevMode,\n output,\n signal,\n} from '@angular/core'\nimport { A11yModule } from '@angular/cdk/a11y'\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop'\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'\nimport { combineLatest, map, switchMap } from 'rxjs'\n\nimport {\n faKeyboard,\n faSignature,\n faUpload,\n} from '@fortawesome/free-solid-svg-icons'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamLayoutService } from '@theseam/ui-common/layout'\nimport { ModalRef } from '@theseam/ui-common/modal'\nimport { TheSeamAutoFocusDirective } from '@theseam/ui-common/shared'\nimport {\n observeControlValid,\n observeControlValue,\n} from '@theseam/ui-common/utils'\n\nimport {\n SignatureInputContainer,\n SignatureInputItem,\n SignatureInputPanelResult,\n SignatureInputResetType,\n SignatureInputType,\n} from '../signature-input-panel.models'\nimport { THESEAM_SIGNATURE_INPUT_CONTAINER } from '../signature-input-container.token'\nimport { TheSeamSignatureInputImgComponent } from '../signature-input-img/signature-input-img.component'\nimport { TheSeamSignatureInputPenComponent } from '../signature-input-pen/signature-input-pen.component'\nimport { TheSeamSignatureInputTextComponent } from '../signature-input-text/signature-input-text.component'\n\ninterface SignatureInputPanelForm {\n pen: FormControl<string | null>\n text: FormControl<string | null>\n img: FormControl<string | null>\n}\n\nconst isValueEmpty = (value: unknown): boolean =>\n typeof value !== 'string' || value.trim().length === 0\n\n@Component({\n selector: 'seam-signature-input-panel',\n templateUrl: './signature-input-panel.component.html',\n styleUrls: ['./signature-input-panel.component.scss'],\n imports: [\n A11yModule,\n ReactiveFormsModule,\n TheSeamButtonsModule,\n TheSeamIconModule,\n TheSeamAutoFocusDirective,\n TheSeamSignatureInputPenComponent,\n TheSeamSignatureInputTextComponent,\n TheSeamSignatureInputImgComponent,\n ],\n providers: [\n {\n provide: THESEAM_SIGNATURE_INPUT_CONTAINER,\n useExisting: TheSeamSignatureInputPanelComponent,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /**\n * Allow focusing the host element via `focus()` without it being part of the\n * tab order (the inner inputs handle keyboard navigation).\n */\n '[attr.tabIndex]': '-1',\n },\n})\nexport class TheSeamSignatureInputPanelComponent\n implements SignatureInputContainer\n{\n private readonly _layout = inject(TheSeamLayoutService)\n private readonly _modalRef = inject<ModalRef<SignatureInputPanelResult>>(\n ModalRef,\n { optional: true },\n )\n\n /** Emitted when the panel is submitted or canceled. */\n readonly result = output<SignatureInputPanelResult>()\n\n protected readonly _faSignature = faSignature\n protected readonly _faUpload = faUpload\n protected readonly _faKeyboard = faKeyboard\n\n protected readonly _activeType = signal<SignatureInputType>('pen')\n protected readonly _resetType = computed<SignatureInputResetType>(() =>\n this._activeType() === 'img' ? 'delete' : 'cancel',\n )\n\n readonly _form = new FormGroup<SignatureInputPanelForm>({\n pen: new FormControl<string | null>(null),\n text: new FormControl<string | null>(null),\n img: new FormControl<string | null>(null),\n })\n\n private readonly _registeredInputItems = new Map<string, SignatureInputItem>()\n\n // Observables are used here because the active control changes, which makes\n // a pure-signal approach awkward (signals don't naturally switch between\n // observable sources). We derive the active control, its value, and its\n // validity via rxjs, then expose the results as signals for the template.\n private readonly _activeControl$ = toObservable(this._activeType).pipe(\n map((type) => this._form.controls[type]),\n )\n\n private readonly _activeValue$ = this._activeControl$.pipe(\n switchMap((control) => observeControlValue<string | null>(control)),\n map((value) => (isValueEmpty(value) ? null : (value as string))),\n )\n\n private readonly _canSubmit$ = combineLatest([\n this._activeControl$.pipe(switchMap((c) => observeControlValid(c))),\n this._activeValue$,\n ]).pipe(map(([valid, value]) => valid && value !== null))\n\n protected readonly _value = toSignal(this._activeValue$, {\n initialValue: null,\n })\n protected readonly _valueEmpty = computed(() => this._value() === null)\n protected readonly _canSubmit = toSignal(this._canSubmit$, {\n initialValue: false,\n })\n\n protected readonly _isSm = toSignal(this._layout.observe('sm'), {\n initialValue: false,\n })\n\n showType(type: SignatureInputType) {\n this._activeType.set(type)\n }\n\n registerInputItem(type: string, item: SignatureInputItem): boolean {\n if (this._registeredInputItems.has(type)) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Input item '${type}' is already registered.`,\n )\n }\n return false\n }\n this._registeredInputItems.set(type, item)\n return true\n }\n\n unregisterInputItem(type: string, item: SignatureInputItem): boolean {\n const registered = this._registeredInputItems.get(type)\n if (!registered) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Input item '${type}' can't be unregistered.`,\n )\n }\n return false\n }\n if (isDevMode() && registered !== item) {\n // eslint-disable-next-line no-console\n console.warn(\n `[TheSeamSignatureInputPanelComponent] Registered item for type '${type}' doesn't match the item being unregistered.`,\n )\n }\n this._registeredInputItems.delete(type)\n return true\n }\n\n reset() {\n this._form.reset({ pen: null, text: null, img: null })\n }\n\n protected _onClearBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n this._registeredInputItems.get(this._activeType())?.clear()\n }\n\n protected _onCancelBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n this.reset()\n this._emit({ type: 'cancel' })\n }\n\n protected _onSubmitBtnClick(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n if (!this._canSubmit()) {\n return\n }\n const value = this._value()\n if (value === null) {\n return\n }\n this._emit({ type: 'submit', value })\n }\n\n private _emit(result: SignatureInputPanelResult) {\n this.result.emit(result)\n this._modalRef?.close(result)\n }\n}\n","<div class=\"seam-signature-input-panel\">\n <div class=\"seam-signature-input-panel__content\" cdkTrapFocus>\n <div class=\"seam-signature-input-panel__options pb-2 mb-1\">\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mr-1\"\n [class.active]=\"_activeType() === 'pen'\"\n (click)=\"showType('pen')\"\n >\n <seam-icon [icon]=\"_faSignature\" size=\"sm\"></seam-icon> Draw\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap mx-1\"\n [class.active]=\"_activeType() === 'text'\"\n (click)=\"showType('text')\"\n >\n <seam-icon [icon]=\"_faKeyboard\" size=\"sm\"></seam-icon> Type\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n class=\"text-nowrap ml-1\"\n [class.active]=\"_activeType() === 'img'\"\n (click)=\"showType('img')\"\n >\n <seam-icon [icon]=\"_faUpload\" size=\"sm\"></seam-icon> Upload\n </button>\n </div>\n\n <form [formGroup]=\"_form\">\n @switch (_activeType()) {\n @case ('pen') {\n <seam-signature-input-pen\n formControlName=\"pen\"\n ></seam-signature-input-pen>\n }\n @case ('text') {\n <seam-signature-input-text\n formControlName=\"text\"\n ></seam-signature-input-text>\n }\n @case ('img') {\n <seam-signature-input-img\n formControlName=\"img\"\n ></seam-signature-input-img>\n }\n }\n </form>\n\n <div class=\"seam-signature-input-panel__footer mt-1\">\n <div>\n @if (_resetType() === 'delete') {\n <button\n seamButton\n theme=\"danger\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Delete\n </button>\n } @else {\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"_valueEmpty()\"\n (click)=\"_onClearBtnClick($event)\"\n >\n Clear\n </button>\n }\n </div>\n <div>\n <button\n seamButton\n theme=\"lightgray\"\n [class.btn-sm]=\"_isSm()\"\n seamAutoFocus\n (click)=\"_onCancelBtnClick($event)\"\n >\n Cancel\n </button>\n <button\n seamButton\n theme=\"primary\"\n [class.btn-sm]=\"_isSm()\"\n [disabled]=\"!_canSubmit()\"\n (click)=\"_onSubmitBtnClick($event)\"\n >\n Apply Signature\n </button>\n </div>\n </div>\n </div>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n Output,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { take } from 'rxjs/operators'\n\nimport {\n TheSeamAnchorButtonComponent,\n TheSeamButtonComponent,\n} from '@theseam/ui-common/buttons'\nimport { Modal, ModalConfig } from '@theseam/ui-common/modal'\n\nimport { SignatureInputPanelResult } from './signature-input-panel.models'\nimport { TheSeamSignatureInputPanelComponent } from './signature-input-panel/signature-input-panel.component'\n\n/**\n * Opens the signature input panel in a modal when the host button/anchor is\n * clicked, and writes the submitted data URL back through its bound form\n * control. Implements `ControlValueAccessor` so it works with any of the form\n * binding styles (`formControl`, `formControlName`, `ngModel`).\n *\n * Usage:\n *\n * ```html\n * <button seamButton theme=\"primary\" seamSignatureInput formControlName=\"signature\">\n * Sign\n * </button>\n * ```\n *\n * The selector-name input accepts a partial `ModalConfig` for cases that need\n * to tweak the modal (e.g. `disableClose`):\n *\n * ```html\n * <button\n * seamButton\n * [seamSignatureInput]=\"{ disableClose: true }\"\n * formControlName=\"signature\"\n * >Sign</button>\n * ```\n */\n@Directive({\n selector: 'button[seamSignatureInput], a[seamSignatureInput]',\n exportAs: 'seamSignatureInput',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: TheSeamSignatureInputButtonDirective,\n multi: true,\n },\n ],\n})\nexport class TheSeamSignatureInputButtonDirective\n implements ControlValueAccessor\n{\n private readonly _modal = inject(Modal)\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef)\n // When the same host element also carries `seamButton`/`a[seamButton]`,\n // delegate disabled state to its `disabled` input so its host binding remains\n // the single source of truth for the `disabled` attribute — avoids a\n // tug-of-war between this directive and the button directive's CD.\n private readonly _seamButton = inject(TheSeamButtonComponent, {\n optional: true,\n self: true,\n })\n private readonly _seamAnchor = inject(TheSeamAnchorButtonComponent, {\n optional: true,\n self: true,\n })\n\n /**\n * Partial `ModalConfig` passthrough. Most consumers leave this unset; the\n * signature panel's styles assume the default modal size.\n */\n\n @Input('seamSignatureInput') modalConfig: ModalConfig | null | undefined\n\n /** Emits the submitted data URL when the user applies a signature. */\n @Output() signed = new EventEmitter<string>()\n\n /** Emits when the user dismisses the panel without submitting. */\n @Output() canceled = new EventEmitter<void>()\n\n private _value: string | null = null\n private _disabled = false\n private _onChange: (value: string | null) => void = () => undefined\n private _onTouched: () => void = () => undefined\n\n writeValue(value: string | null): void {\n this._value = value\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this._onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled = isDisabled\n if (this._seamButton) {\n this._seamButton.disabled = isDisabled\n } else if (this._seamAnchor) {\n this._seamAnchor.disabled = isDisabled\n } else {\n const el = this._elementRef.nativeElement\n if (isDisabled) {\n el.setAttribute('disabled', '')\n } else {\n el.removeAttribute('disabled')\n }\n }\n }\n\n /** @ignore */\n @HostListener('click')\n _onClick(): void {\n if (this._disabled) {\n return\n }\n const ref = this._modal.openFromComponent<\n TheSeamSignatureInputPanelComponent,\n SignatureInputPanelResult\n >(TheSeamSignatureInputPanelComponent, this.modalConfig ?? undefined)\n\n ref\n .afterClosed()\n .pipe(take(1))\n .subscribe((result) => {\n this._onTouched()\n if (result?.type === 'submit') {\n this._value = result.value\n this._onChange(result.value)\n this.signed.emit(result.value)\n } else {\n this.canceled.emit()\n }\n })\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputImgHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-img'\n\n private readonly _fileDrop = this.locatorFor(\n '.seam-signature-input-img__upload-box',\n )\n private readonly _sizeError = this.locatorForOptional(\n '.seam-signature-input-img__size-error',\n )\n private readonly _preview = this.locatorForOptional(\n '.seam-signature-input-img__preview',\n )\n\n async getSizeError(): Promise<string | null> {\n const el = await this._sizeError()\n return el ? (await el.text()).trim() : null\n }\n\n async hasPreview(): Promise<boolean> {\n return (await this._preview()) !== null\n }\n\n async getPreviewSrc(): Promise<string | null> {\n const el = await this._preview()\n return el ? el.getAttribute('src') : null\n }\n\n async getFileDrop() {\n return this._fileDrop()\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputPenHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-pen'\n\n private readonly _canvas = this.locatorFor('canvas')\n\n async getCanvas() {\n return this._canvas()\n }\n\n async getCanvasWidth(): Promise<number | null> {\n const canvas = await this._canvas()\n const attr = await canvas.getAttribute('width')\n return attr ? Number(attr) : null\n }\n\n async getCanvasHeight(): Promise<number | null> {\n const canvas = await this._canvas()\n const attr = await canvas.getAttribute('height')\n return attr ? Number(attr) : null\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamSignatureInputTextHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-text'\n\n private readonly _input = this.locatorFor('input')\n private readonly _canvas = this.locatorFor('canvas')\n\n async getInput() {\n return this._input()\n }\n\n async enterName(text: string): Promise<void> {\n const input = await this._input()\n await input.clear()\n await input.sendKeys(text)\n }\n\n async getInputValue(): Promise<string> {\n const input = await this._input()\n return input.getProperty<string>('value')\n }\n\n async isInputDisabled(): Promise<boolean> {\n const input = await this._input()\n return (await input.getAttribute('disabled')) !== null\n }\n\n async getCanvas() {\n return this._canvas()\n }\n}\n","import { ComponentHarness, TestElement } from '@angular/cdk/testing'\n\nimport { SignatureInputType } from '../signature-input-panel.models'\nimport { TheSeamSignatureInputImgHarness } from './signature-input-img.harness'\nimport { TheSeamSignatureInputPenHarness } from './signature-input-pen.harness'\nimport { TheSeamSignatureInputTextHarness } from './signature-input-text.harness'\n\nexport class TheSeamSignatureInputPanelHarness extends ComponentHarness {\n static hostSelector = 'seam-signature-input-panel'\n\n private readonly _drawBtn = this.locatorFor('button:nth-of-type(1)')\n private readonly _typeBtn = this.locatorFor('button:nth-of-type(2)')\n private readonly _uploadBtn = this.locatorFor('button:nth-of-type(3)')\n\n private readonly _footerBtns = this.locatorForAll(\n '.seam-signature-input-panel__footer button',\n )\n\n private readonly _penHarness = this.locatorForOptional(\n TheSeamSignatureInputPenHarness,\n )\n private readonly _textHarness = this.locatorForOptional(\n TheSeamSignatureInputTextHarness,\n )\n private readonly _imgHarness = this.locatorForOptional(\n TheSeamSignatureInputImgHarness,\n )\n\n async showType(type: SignatureInputType): Promise<void> {\n const btn =\n type === 'pen'\n ? await this._drawBtn()\n : type === 'text'\n ? await this._typeBtn()\n : await this._uploadBtn()\n await btn.click()\n }\n\n async getActiveType(): Promise<SignatureInputType | null> {\n if (await this._penHarness()) return 'pen'\n if (await this._textHarness()) return 'text'\n if (await this._imgHarness()) return 'img'\n return null\n }\n\n async getPen(): Promise<TheSeamSignatureInputPenHarness | null> {\n return this._penHarness()\n }\n\n async getText(): Promise<TheSeamSignatureInputTextHarness | null> {\n return this._textHarness()\n }\n\n async getImg(): Promise<TheSeamSignatureInputImgHarness | null> {\n return this._imgHarness()\n }\n\n async getClearOrDeleteButton(): Promise<TestElement> {\n const [btn] = await this._footerBtns()\n return btn\n }\n\n async getCancelButton(): Promise<TestElement> {\n const buttons = await this._footerBtns()\n return buttons[buttons.length - 2]\n }\n\n async getSubmitButton(): Promise<TestElement> {\n const buttons = await this._footerBtns()\n return buttons[buttons.length - 1]\n }\n\n async isSubmitDisabled(): Promise<boolean> {\n const btn = await this.getSubmitButton()\n return (await btn.getAttribute('disabled')) !== null\n }\n\n async cancel(): Promise<void> {\n const btn = await this.getCancelButton()\n await btn.click()\n }\n\n async submit(): Promise<void> {\n const btn = await this.getSubmitButton()\n await btn.click()\n }\n}\n","import {\n BaseHarnessFilters,\n ComponentHarness,\n HarnessPredicate,\n} from '@angular/cdk/testing'\n\nexport interface SignatureInputButtonHarnessFilters extends BaseHarnessFilters {\n text?: string | RegExp\n}\n\nexport class TheSeamSignatureInputButtonHarness extends ComponentHarness {\n static hostSelector = 'button[seamSignatureInput], a[seamSignatureInput]'\n\n static with(\n options: SignatureInputButtonHarnessFilters = {},\n ): HarnessPredicate<TheSeamSignatureInputButtonHarness> {\n return new HarnessPredicate(\n TheSeamSignatureInputButtonHarness,\n options,\n ).addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n )\n }\n\n async getText(): Promise<string> {\n return (await this.host()).text()\n }\n\n async isDisabled(): Promise<boolean> {\n return (await this.host()).getAttribute('disabled').then((v) => v !== null)\n }\n\n async click(): Promise<void> {\n await (await this.host()).click()\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","switchMap"],"mappings":"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"}