@theseam/ui-common 1.0.2-beta.59 → 1.0.2-beta.63

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 +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/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/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 { 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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","switchMap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;MAIa,iCAAiC,GAC5C,IAAI,cAAc,CAChB,mCAAmC;;ACwBvC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;AAE3C,MAAM,oBAAoB,GAAgB,CACxC,OAAwB,KACG;AAC3B,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;AAC3B,IAAA,IAAI,EAAE,KAAK,YAAY,IAAI,CAAC,EAAE;AAC5B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAK,CAAC,IAAI,GAAG,mBAAmB,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,IAAI;AACtE,CAAC;MAgBY,iCAAiC,CAAA;AAG5C,IAAA,OAAgB,aAAa,GAAG,mBAAmB;AAElC,IAAA,UAAU,GAAG,MAAM,CAAC,iCAAiC,EAAE;AACtE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEjD;;;;;AAKG;AACgB,IAAA,YAAY,GAAG,IAAI,WAAW,CAAc,IAAI,EAAE;QACnE,UAAU,EAAE,CAAC,oBAAoB,CAAC;AACnC,KAAA,CAAC;IAEe,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACvE,QAAA,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;AACvC,KAAA,CAAC;AAEiB,IAAA,UAAU,GAAG,QAAQ,CAAgB,MAAK;;QAE3D,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa;AAC7C,cAAE;cACA,IAAI;AACV,IAAA,CAAC,sDAAC;AAEF;;;;;AAKG;AACc,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,kDAAC;IAClC,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC/C,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AACzD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACzB,OAAO,GAAG,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,EAAA,CAAI,GAAG,IAAI;AACrC,IAAA,CAAC,mEAAC;AAEM,IAAA,SAAS,GAAmC,MAAM,SAAS;AAC3D,IAAA,UAAU,GAAe,MAAM,SAAS;AAEhD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;AAC9C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MACzB,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAClD;QACH;;;QAIA,IAAI,CAAC,YAAY,CAAC;AACf,aAAA,IAAI,CACH,SAAS,CAAC,MAAK;AACb,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;YACpC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACtC,gBAAA,OAAO,EAAE,CAAgB,IAAI,CAAC;YAChC;AACA,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;AAC3C,QAAA,CAAC,CAAC,EACF,kBAAkB,EAAE;AAErB,aAAA,SAAS,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD;AAEA,IAAA,UAAU,CAAC,KAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEA,IAAA,gBAAgB,CAAC,EAAkC,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,UAAU;YAAE;AAC/C,QAAA,IAAI,UAAU;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;IACjC;IAEA,KAAK,GAAA;;;AAGH,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;IAClC;IAEA,cAAc,GAAA;QACZ,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACjD,QAAA,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;QAEtC,MAAM,OAAO,GAAG,MAAK;;;YAGnB,UAAU,CAAC,MAAK;AACd,gBAAA,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC;AAC3D,gBAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC;YACtD,CAAC,EAAE,IAAI,CAAC;AACV,QAAA,CAAC;AAED,QAAA,MAAM,YAAY,GAAG,CAAC,KAAY,KAAI;AACpC,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,YAAA,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5C;AACA,YAAA,OAAO,EAAE;AACX,QAAA,CAAC;AACD,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;;AAGlD,QAAA,MAAM,eAAe,GAAG,MAAM,OAAO,EAAE;QACvC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC;AACxD,QAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC;QAEjD,SAAS,CAAC,KAAK,EAAE;IACnB;AAEU,IAAA,cAAc,CAAC,KAAyB,EAAA;AAChD,QAAA,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE;AAC/B,YAAA,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE;AAChC,gBAAA,MAAM,SAAS,GAAG,WAAW,CAAC,SAAgC;AAC9D,gBAAA,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1D;YACF;QACF;IACF;AAEQ,IAAA,SAAS,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE;IACnB;wGA7IW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,SAAA,EATjC;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,iCAAiC;AAC9C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrDH,omCAgCA,ksBDcY,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mCAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAUhB,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAd7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,OAAA,EAG3B,CAAC,iBAAiB,CAAC,EAAA,SAAA,EACjB;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,iCAAmC;AAC9C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,omCAAA,EAAA,MAAA,EAAA,CAAA,2oBAAA,CAAA,EAAA;;;AE9BjD,MAAM,eAAe,GAA0B;AAC7C,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,YAAY,EAAE,GAAG;CAClB;MAgBY,iCAAiC,CAAA;AAG3B,IAAA,UAAU,GAAG,MAAM,CAAC,iCAAiC,EAAE;AACtE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAExC,IAAA,OAAO,GAAG,KAAK,CACtB,eAAe,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EACb,SAAS,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,eAAe,EAAE,GAAG,KAAK,EAAE,CAAC,EAAA,CAAA,GAAA,CAA1D,EAAE,SAAS,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,eAAe,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,GAC7D;IAEQ,YAAY,GAAG,MAAM,EAAsB;IAC3C,UAAU,GAAG,MAAM,EAAsB;;;AAIjC,IAAA,aAAa,GAAG,SAAS,CAAwB,QAAQ,yDAAC;AAE1D,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,kDAAC;AACpC,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;AAEhC,IAAA,YAAY,GAAG,QAAQ,CACxC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,wDAChE;AACkB,IAAA,aAAa,GAAG,QAAQ,CACzC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,IAAI,eAAe,CAAC,YAAY,yDAClE;AAEO,IAAA,SAAS,GAAmC,MAAM,SAAS;AAC3D,IAAA,UAAU,GAAe,MAAM,SAAS;AAEhD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;AAC9C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MACzB,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAClD;QACH;;;QAIA,eAAe,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAChD;AAEA,IAAA,UAAU,CAAC,KAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAAkC,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;IAChC;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IACtB;AAEU,IAAA,UAAU,CAAC,KAAyB,EAAA;AAC5C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEU,IAAA,aAAa,CAAC,KAAyB,EAAA;QAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE;AACzB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,GAAG,CAAC,SAAS,EAAE;IACxB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,IAAI,CAAC,GAAG,EAAE;YACR;QACF;AACA,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;YAC3B,IAAI,KAAK,EAAE;;;;AAIT,gBAAA,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;YAC/C;iBAAO;gBACL,GAAG,CAAC,KAAK,EAAE;YACb;QACF;AAAE,QAAA,MAAM;;;;;;QAMR;IACF;AAEQ,IAAA,SAAS,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE;IACnB;wGAjHW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EATjC;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,iCAAiC;AAC9C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxCH,wTAYA,kSDqBY,yBAAyB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAUxB,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAd7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,OAAA,EAG3B,CAAC,yBAAyB,CAAC,EAAA,SAAA,EACzB;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,iCAAmC;AAC9C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wTAAA,EAAA,MAAA,EAAA,CAAA,2OAAA,CAAA,EAAA;yTAoBmB,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5B5E,MAAM,qBAAqB,GAAG,gBAAgB;AAC9C,MAAM,YAAY,GAAG,GAAG;AACxB,MAAM,aAAa,GAAG,GAAG;MAqBZ,kCAAkC,CAAA;AAG5B,IAAA,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC9C,IAAA,UAAU,GAAG,MAAM,CAAC,iCAAiC,EAAE;AACtE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;;AAIhC,IAAA,WAAW,GAC1B,SAAS,CAAgC,YAAY,uDAAC;AAE/C,IAAA,YAAY,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC;AAE3C,IAAA,UAAU,GAAG,MAAM,CAAqB,SAAS,sDAAC;AAChD,IAAA,YAAY,GAAG,QAAQ,CACxC,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,wDACtC;AACkB,IAAA,aAAa,GAAG,QAAQ,CACzC,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,yDACvC;AACkB,IAAA,cAAc,GAAG,QAAQ,CAC1C,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,0DACrC;AAEgB,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;AAChC,IAAA,wBAAwB,GAAG,QAAQ,CACpD,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,oEAChD;IAEkB,YAAY,GAAG,YAAY;IAC3B,aAAa,GAAG,aAAa;;IAGxC,MAAM,GAAkB,IAAI;AACpC;;;;AAIG;IACK,aAAa,GAAkB,IAAI;AAEnC,IAAA,SAAS,GAAmC,MAAM,SAAS;AAC3D,IAAA,UAAU,GAAe,MAAM,SAAS;AAEhD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MACzB,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CACnD;QACH;AAEA,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE,EAAE;aACtD,IAAI,CAAC,kBAAkB,EAAE;AACzB,aAAA,SAAS,CAAC,CAAC,CAAC,KAAI;AACf,YAAA,IACE,CAAC,CAAC,IAAI,KAAK,SAAS;gBACpB,CAAC,CAAC,IAAI,KAAK,UAAU;AACrB,gBAAA,CAAC,CAAC,IAAI,KAAK,QAAQ,EACnB;gBACA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,YAAY,CAAC;aACf,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,EAAE;aAC5C,SAAS,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;;;;;QAM5C,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE;gBACxD,IAAI,CAAC,iBAAiB,EAAE;YAC1B;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;;;;AAIb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC;IACF;AAEA,IAAA,UAAU,CAAC,KAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;;AAGzB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;IAChC;AAEA,IAAA,gBAAgB,CAAC,EAAkC,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;IAChC;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IACtB;IAEU,eAAe,GAAA;QACvB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEU,gBAAgB,GAAA;QACxB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA;;;;AAIG;AACK,IAAA,kBAAkB,CAAC,OAAsB,EAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,MAAM,EAAE;YACX;QACF;QACA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QACA,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;YAChB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC;YACpD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9B,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,GAAG,GAAG,OAAO;IACnB;AAEA;;;AAGG;IACK,iBAAiB,GAAA;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,MAAM,EAAE;YACX;QACF;QACA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACpC,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;;;AAGrC,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;gBAC/B,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC;AACpD,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB;YACA;QACF;QAEA,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC;AACpD,QAAA,OAAO,CAAC,SAAS,GAAG,OAAO;AAC3B,QAAA,OAAO,CAAC,YAAY,GAAG,QAAQ;AAC/B,QAAA,OAAO,CAAC,SAAS,GAAG,QAAQ;QAC5B,IAAI,QAAQ,GAAG,EAAE;AACjB,QAAA,GAAG;AACD,YAAA,QAAQ,EAAE;YACV,OAAO,CAAC,IAAI,GAAG,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,qBAAqB,WAAW;QAClE,CAAC,QAAQ,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,YAAY;QACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,EAAE,GAAG,CAAC;AAE7C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACpC;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;QAClE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC;IACvD;AAEQ,IAAA,SAAS,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YACzB;QACF;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE;IACnB;wGAhNW,kCAAkC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kCAAkC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,SAAA,EATlC;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,kCAAkC;AAC/C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrDH,+lDAsDA,sXDZI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,sBAAsB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,eAAA,EAAA,YAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,yKAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,yBAAyB,oHACzB,8BAA8B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAWrB,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAnB9C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,OAAA,EAG5B;wBACP,mBAAmB;wBACnB,sBAAsB;wBACtB,yBAAyB;wBACzB,8BAA8B;qBAC/B,EAAA,SAAA,EACU;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,kCAAoC;AAC/C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+lDAAA,EAAA,MAAA,EAAA,CAAA,+TAAA,CAAA,EAAA;mGAcJ,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEpBzD,MAAM,YAAY,GAAG,CAAC,KAAc,KAClC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;MA+B3C,mCAAmC,CAAA;AAG7B,IAAA,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACtC,SAAS,GAAG,MAAM,CACjC,QAAQ,EACR,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB;;IAGQ,MAAM,GAAG,MAAM,EAA6B;IAElC,YAAY,GAAG,WAAW;IAC1B,SAAS,GAAG,QAAQ;IACpB,WAAW,GAAG,UAAU;AAExB,IAAA,WAAW,GAAG,MAAM,CAAqB,KAAK,uDAAC;IAC/C,UAAU,GAAG,QAAQ,CAA0B,MAChE,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACnD;IAEQ,KAAK,GAAG,IAAI,SAAS,CAA0B;AACtD,QAAA,GAAG,EAAE,IAAI,WAAW,CAAgB,IAAI,CAAC;AACzC,QAAA,IAAI,EAAE,IAAI,WAAW,CAAgB,IAAI,CAAC;AAC1C,QAAA,GAAG,EAAE,IAAI,WAAW,CAAgB,IAAI,CAAC;AAC1C,KAAA,CAAC;AAEe,IAAA,qBAAqB,GAAG,IAAI,GAAG,EAA8B;;;;;IAM7D,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACpE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzC;AAEgB,IAAA,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACxDC,WAAS,CAAC,CAAC,OAAO,KAAK,mBAAmB,CAAgB,OAAO,CAAC,CAAC,EACnE,GAAG,CAAC,CAAC,KAAK,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,GAAI,KAAgB,CAAC,CAAC,CACjE;IAEgB,WAAW,GAAG,aAAa,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAACA,WAAS,CAAC,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,aAAa;KACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;AAEtC,IAAA,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;AACvD,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA,CAAC;AACiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,uDAAC;AACpD,IAAA,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE;AACzD,QAAA,YAAY,EAAE,KAAK;AACpB,KAAA,CAAC;IAEiB,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC9D,QAAA,YAAY,EAAE,KAAK;AACpB,KAAA,CAAC;AAEF,IAAA,QAAQ,CAAC,IAAwB,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;IAEA,iBAAiB,CAAC,IAAY,EAAE,IAAwB,EAAA;QACtD,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACxC,IAAI,SAAS,EAAE,EAAE;;AAEf,gBAAA,OAAO,CAAC,IAAI,CACV,qDAAqD,IAAI,CAAA,wBAAA,CAA0B,CACpF;YACH;AACA,YAAA,OAAO,KAAK;QACd;QACA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAC1C,QAAA,OAAO,IAAI;IACb;IAEA,mBAAmB,CAAC,IAAY,EAAE,IAAwB,EAAA;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,SAAS,EAAE,EAAE;;AAEf,gBAAA,OAAO,CAAC,IAAI,CACV,qDAAqD,IAAI,CAAA,wBAAA,CAA0B,CACpF;YACH;AACA,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,SAAS,EAAE,IAAI,UAAU,KAAK,IAAI,EAAE;;AAEtC,YAAA,OAAO,CAAC,IAAI,CACV,mEAAmE,IAAI,CAAA,4CAAA,CAA8C,CACtH;QACH;AACA,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC;AACvC,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACxD;AAEU,IAAA,gBAAgB,CAAC,KAAY,EAAA;QACrC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE;IAC7D;AAEU,IAAA,iBAAiB,CAAC,KAAY,EAAA;QACtC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,KAAK,EAAE;QACZ,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChC;AAEU,IAAA,iBAAiB,CAAC,KAAY,EAAA;QACtC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB;QACF;QACA,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvC;AAEQ,IAAA,KAAK,CAAC,MAAiC,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;IAC/B;wGAnIW,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mCAAmC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAfnC;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iCAAiC;AAC1C,gBAAA,WAAW,EAAE,mCAAmC;AACjD,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtEH,i3FAsGA,EAAA,MAAA,EAAA,CAAA,+fAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9CI,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,mBAAmB,4rBACnB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,yBAAyB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,iCAAiC,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjC,kCAAkC,sEAClC,iCAAiC,EAAA,QAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAiBxB,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBA7B/C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,OAAA,EAG7B;wBACP,UAAU;wBACV,mBAAmB;wBACnB,oBAAoB;wBACpB,iBAAiB;wBACjB,yBAAyB;wBACzB,iCAAiC;wBACjC,kCAAkC;wBAClC,iCAAiC;qBAClC,EAAA,SAAA,EACU;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iCAAiC;AAC1C,4BAAA,WAAW,EAAA,mCAAqC;AACjD,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ;;;AAGG;AACH,wBAAA,iBAAiB,EAAE,IAAI;AACxB,qBAAA,EAAA,QAAA,EAAA,i3FAAA,EAAA,MAAA,EAAA,CAAA,+fAAA,CAAA,EAAA;;;AE5EG,MAAO,+BAAgC,SAAQ,gBAAgB,CAAA;AACnE,IAAA,OAAO,YAAY,GAAG,0BAA0B;AAE/B,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;AAC5C,IAAA,UAAU,GAAG,IAAI,CAAC,kBAAkB,CACnD,uCAAuC,CACxC;AACgB,IAAA,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CACjD,oCAAoC,CACrC;AAED,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;AAClC,QAAA,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI;IAC7C;AAEA,IAAA,MAAM,UAAU,GAAA;QACd,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI;IACzC;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI;IAC3C;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;IACzB;;;AC3BI,MAAO,+BAAgC,SAAQ,gBAAgB,CAAA;AACnE,IAAA,OAAO,YAAY,GAAG,0BAA0B;AAE/B,IAAA,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAEpD,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;AAEA,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;AAC/C,QAAA,OAAO,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI;IACnC;AAEA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC;AAChD,QAAA,OAAO,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI;IACnC;;;ACnBI,MAAO,gCAAiC,SAAQ,gBAAgB,CAAA;AACpE,IAAA,OAAO,YAAY,GAAG,2BAA2B;AAEhC,IAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACjC,IAAA,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAEpD,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;IAEA,MAAM,SAAS,CAAC,IAAY,EAAA;AAC1B,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AACjC,QAAA,MAAM,KAAK,CAAC,KAAK,EAAE;AACnB,QAAA,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AACjC,QAAA,OAAO,KAAK,CAAC,WAAW,CAAS,OAAO,CAAC;IAC3C;AAEA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;QACjC,OAAO,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,IAAI;IACxD;AAEA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;;;ACvBI,MAAO,iCAAkC,SAAQ,gBAAgB,CAAA;AACrE,IAAA,OAAO,YAAY,GAAG,4BAA4B;AAEjC,IAAA,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;AACnD,IAAA,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;AACnD,IAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;AAErD,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAC/C,4CAA4C,CAC7C;AAEgB,IAAA,WAAW,GAAG,IAAI,CAAC,kBAAkB,CACpD,+BAA+B,CAChC;AACgB,IAAA,YAAY,GAAG,IAAI,CAAC,kBAAkB,CACrD,gCAAgC,CACjC;AACgB,IAAA,WAAW,GAAG,IAAI,CAAC,kBAAkB,CACpD,+BAA+B,CAChC;IAED,MAAM,QAAQ,CAAC,IAAwB,EAAA;AACrC,QAAA,MAAM,GAAG,GACP,IAAI,KAAK;AACP,cAAE,MAAM,IAAI,CAAC,QAAQ;cACnB,IAAI,KAAK;AACT,kBAAE,MAAM,IAAI,CAAC,QAAQ;AACrB,kBAAE,MAAM,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,MAAM,GAAG,CAAC,KAAK,EAAE;IACnB;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,IAAI,MAAM,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,MAAM,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,MAAM;AAC5C,QAAA,IAAI,MAAM,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;IAC5B;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;AAEA,IAAA,MAAM,sBAAsB,GAAA;QAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,OAAO,GAAG;IACZ;AAEA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;QACxC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC;AAEA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;QACxC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC;AAEA,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;QACxC,OAAO,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,IAAI;IACtD;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;AACxC,QAAA,MAAM,GAAG,CAAC,KAAK,EAAE;IACnB;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;AACxC,QAAA,MAAM,GAAG,CAAC,KAAK,EAAE;IACnB;;;ACrFF;;AAEG;;;;"}
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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"}
@@ -0,0 +1,190 @@
1
+ import * as _theseam_ui_common_icon from '@theseam/ui-common/icon';
2
+ import { SeamIcon } from '@theseam/ui-common/icon';
3
+ import * as _angular_core from '@angular/core';
4
+ import { AfterViewInit } from '@angular/core';
5
+ import * as _fortawesome_fontawesome_common_types from '@fortawesome/fontawesome-common-types';
6
+ import { ControlValueAccessor } from '@angular/forms';
7
+
8
+ /** Tagged union describing where a file item's bytes (or asset pointer) live. */
9
+ type SeamFileItemSource = {
10
+ kind: 'file';
11
+ file: File;
12
+ } | {
13
+ kind: 'url';
14
+ url: string;
15
+ } | {
16
+ kind: 'blob';
17
+ blob: Blob;
18
+ };
19
+ /**
20
+ * A file entry usable by `<seam-file-tile>` and `<seam-file-field>`.
21
+ *
22
+ * Covers three cases:
23
+ * - Pending upload (File source)
24
+ * - Already-uploaded server asset (URL source)
25
+ * - In-memory bytes without a File wrapper (Blob source)
26
+ */
27
+ interface SeamFileItem {
28
+ /** Display name. */
29
+ name: string;
30
+ /** Bytes. Known for File/Blob; optional for URL. */
31
+ size?: number;
32
+ /** MIME type. Known for File/Blob; may be absent for URL. */
33
+ type?: string;
34
+ /** Where the bytes (or the asset pointer) live. */
35
+ source: SeamFileItemSource;
36
+ /** Consumer-supplied tracking key (e.g. documentId, syncId). */
37
+ id?: string;
38
+ /** Override thumbnail URL. Otherwise derived for image sources. */
39
+ thumbnailUrl?: string;
40
+ }
41
+ /** Why a file was rejected at selection/drop time. */
42
+ type SeamFileRejectionReason = 'type' | 'size' | 'count';
43
+ /** One rejected file and the set of reasons it failed validation. */
44
+ interface SeamFileRejection {
45
+ file: File;
46
+ reasons: SeamFileRejectionReason[];
47
+ }
48
+ /** Tile layout. `row` = horizontal list item; `preview` = thumbnail tile. */
49
+ type SeamFileTileVariant = 'row' | 'preview';
50
+
51
+ declare function seamFileItemFromFile(file: File, id?: string): SeamFileItem;
52
+ interface SeamFileItemFromUrlOptions {
53
+ name?: string;
54
+ type?: string;
55
+ size?: number;
56
+ id?: string;
57
+ thumbnailUrl?: string;
58
+ }
59
+ declare function seamFileItemFromUrl(url: string, opts?: SeamFileItemFromUrlOptions): SeamFileItem;
60
+ /**
61
+ * Extracts native `File` objects from items whose source is `file`. Items
62
+ * backed by a URL or a Blob are ignored. Useful for submit-side mapping
63
+ * when the consumer only cares about newly-uploaded blobs.
64
+ */
65
+ declare function seamFilesFromItems(items: SeamFileItem[]): File[];
66
+ /**
67
+ * Maps a MIME type to a built-in SeamIcon. Returns a generic file icon for
68
+ * unknown, empty, or missing types. Returns SeamIcon (not IconDefinition) so
69
+ * the icon set can change later without a breaking signature change.
70
+ */
71
+ declare function iconForMime(type: string | undefined): SeamIcon;
72
+
73
+ declare class TheSeamFileDropZoneDirective {
74
+ readonly accept: _angular_core.InputSignal<string>;
75
+ readonly maxSize: _angular_core.InputSignal<number | null>;
76
+ readonly maxFiles: _angular_core.InputSignal<number | null>;
77
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
78
+ readonly seamFileDrop: _angular_core.OutputEmitterRef<File[]>;
79
+ readonly seamFileDropRejected: _angular_core.OutputEmitterRef<SeamFileRejection[]>;
80
+ /** Counter-based dragenter/leave tracking to avoid child-element flicker. */
81
+ private readonly _dragDepth;
82
+ protected readonly _isOver: _angular_core.Signal<boolean>;
83
+ protected _onDragEnter(event: DragEvent): void;
84
+ protected _onDragOver(event: DragEvent): void;
85
+ protected _onDragLeave(event: DragEvent): void;
86
+ protected _onDrop(event: DragEvent): void;
87
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TheSeamFileDropZoneDirective, never>;
88
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TheSeamFileDropZoneDirective, "[seamFileDropZone]", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "seamFileDrop": "seamFileDrop"; "seamFileDropRejected": "seamFileDropRejected"; }, never, never, true, never>;
89
+ }
90
+
91
+ declare class TheSeamFileInputComponent {
92
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
93
+ readonly accept: _angular_core.InputSignal<string>;
94
+ readonly maxSize: _angular_core.InputSignal<number | null>;
95
+ readonly maxFiles: _angular_core.InputSignal<number | null>;
96
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
97
+ readonly hideErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
98
+ readonly promptText: _angular_core.InputSignal<string>;
99
+ readonly promptSuffix: _angular_core.InputSignal<string>;
100
+ readonly filesAdded: _angular_core.OutputEmitterRef<File[]>;
101
+ readonly rejected: _angular_core.OutputEmitterRef<SeamFileRejection[]>;
102
+ protected readonly _faUpload: _fortawesome_fontawesome_common_types.IconDefinition;
103
+ protected readonly _lastRejections: _angular_core.WritableSignal<SeamFileRejection[]>;
104
+ protected readonly _effectiveMaxFiles: _angular_core.Signal<number | null>;
105
+ protected readonly _errorMessage: _angular_core.Signal<string | null>;
106
+ private readonly _nativeInput;
107
+ _openPicker(): void;
108
+ protected _onFilesDropped(files: File[]): void;
109
+ protected _onRejected(rejections: SeamFileRejection[]): void;
110
+ protected _onNativeChange(event: Event): void;
111
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TheSeamFileInputComponent, never>;
112
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TheSeamFileInputComponent, "seam-file-input", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hideErrors": { "alias": "hideErrors"; "required": false; "isSignal": true; }; "promptText": { "alias": "promptText"; "required": false; "isSignal": true; }; "promptSuffix": { "alias": "promptSuffix"; "required": false; "isSignal": true; }; }, { "filesAdded": "filesAdded"; "rejected": "rejected"; }, never, never, true, never>;
113
+ }
114
+
115
+ declare class TheSeamFileTileComponent implements AfterViewInit {
116
+ private readonly _cdr;
117
+ readonly item: _angular_core.InputSignal<SeamFileItem>;
118
+ readonly variant: _angular_core.InputSignal<SeamFileTileVariant>;
119
+ readonly showName: _angular_core.InputSignalWithTransform<boolean, unknown>;
120
+ readonly showMeta: _angular_core.InputSignalWithTransform<boolean, unknown>;
121
+ readonly removable: _angular_core.InputSignalWithTransform<boolean, unknown>;
122
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
123
+ readonly remove: _angular_core.OutputEmitterRef<SeamFileItem>;
124
+ readonly itemClick: _angular_core.OutputEmitterRef<SeamFileItem>;
125
+ protected readonly _faTimes: _fortawesome_fontawesome_common_types.IconDefinition;
126
+ protected readonly _mimeIcon: _angular_core.Signal<_theseam_ui_common_icon.SeamIcon>;
127
+ protected readonly _metaLine: _angular_core.Signal<string>;
128
+ protected readonly _showRemoveBtn: _angular_core.Signal<boolean>;
129
+ /** True when itemClick is observed AND the tile is not disabled. */
130
+ protected readonly _isInteractive: _angular_core.Signal<boolean>;
131
+ /**
132
+ * Thumbnail URL for image items. Tracked across item changes so object
133
+ * URLs are revoked when the item changes or the component is destroyed.
134
+ */
135
+ private _ownedObjectUrl;
136
+ private _pendingObjectUrl;
137
+ protected readonly _thumbUrl: _angular_core.Signal<string | null>;
138
+ /**
139
+ * True once we detect that a consumer has wired (itemClick).
140
+ * Detected in ngAfterViewInit — by that point the parent's template binding
141
+ * has called subscribe() on the OutputEmitterRef, populating its internal
142
+ * `listeners` array (Option A: access via internal field on Angular 20's
143
+ * OutputEmitterRef). If the internal shape is absent, conservatively stays
144
+ * false (opt-out default — no unwanted role=button on inert tiles).
145
+ */
146
+ protected readonly _clickObserved: _angular_core.WritableSignal<boolean>;
147
+ constructor();
148
+ ngAfterViewInit(): void;
149
+ protected _onRemove(event: MouseEvent): void;
150
+ protected _onBodyClick(): void;
151
+ protected _onBodyKey(event: KeyboardEvent): void;
152
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TheSeamFileTileComponent, never>;
153
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TheSeamFileTileComponent, "seam-file-tile", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "showName": { "alias": "showName"; "required": false; "isSignal": true; }; "showMeta": { "alias": "showMeta"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "remove": "remove"; "itemClick": "itemClick"; }, never, never, true, never>;
154
+ }
155
+
156
+ declare class TheSeamFileFieldComponent implements ControlValueAccessor {
157
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
158
+ readonly accept: _angular_core.InputSignal<string>;
159
+ readonly maxSize: _angular_core.InputSignal<number | null>;
160
+ readonly maxFiles: _angular_core.InputSignal<number | null>;
161
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
162
+ readonly previewMode: _angular_core.InputSignalWithTransform<boolean, unknown>;
163
+ readonly showTileName: _angular_core.InputSignalWithTransform<boolean, unknown>;
164
+ readonly promptText: _angular_core.InputSignal<string>;
165
+ readonly promptSuffix: _angular_core.InputSignal<string>;
166
+ readonly replaceText: _angular_core.InputSignal<string>;
167
+ readonly hideErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
168
+ readonly rejected: _angular_core.OutputEmitterRef<SeamFileRejection[]>;
169
+ protected readonly _items: _angular_core.WritableSignal<SeamFileItem[]>;
170
+ protected readonly _cvaDisabled: _angular_core.WritableSignal<boolean>;
171
+ protected readonly _effectiveDisabled: _angular_core.Signal<boolean>;
172
+ protected readonly _hasFile: _angular_core.Signal<boolean>;
173
+ protected readonly _remainingMaxFiles: _angular_core.Signal<number | null>;
174
+ protected readonly _tileVariant: _angular_core.Signal<"row" | "preview">;
175
+ private _onChange;
176
+ private _onTouched;
177
+ writeValue(value: SeamFileItem[] | null): void;
178
+ registerOnChange(fn: (value: SeamFileItem[]) => void): void;
179
+ registerOnTouched(fn: () => void): void;
180
+ setDisabledState(isDisabled: boolean): void;
181
+ protected _onFilesAdded(files: File[]): void;
182
+ protected _onRejected(rejections: SeamFileRejection[]): void;
183
+ protected _onTileRemove(item: SeamFileItem): void;
184
+ private _emit;
185
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TheSeamFileFieldComponent, never>;
186
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TheSeamFileFieldComponent, "seam-file-field", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "previewMode": { "alias": "previewMode"; "required": false; "isSignal": true; }; "showTileName": { "alias": "showTileName"; "required": false; "isSignal": true; }; "promptText": { "alias": "promptText"; "required": false; "isSignal": true; }; "promptSuffix": { "alias": "promptSuffix"; "required": false; "isSignal": true; }; "replaceText": { "alias": "replaceText"; "required": false; "isSignal": true; }; "hideErrors": { "alias": "hideErrors"; "required": false; "isSignal": true; }; }, { "rejected": "rejected"; }, never, never, true, never>;
187
+ }
188
+
189
+ export { TheSeamFileDropZoneDirective, TheSeamFileFieldComponent, TheSeamFileInputComponent, TheSeamFileTileComponent, iconForMime, seamFileItemFromFile, seamFileItemFromUrl, seamFilesFromItems };
190
+ export type { SeamFileItem, SeamFileItemFromUrlOptions, SeamFileItemSource, SeamFileRejection, SeamFileRejectionReason, SeamFileTileVariant };
@@ -0,0 +1,3 @@
1
+ {
2
+ "module": "../fesm2022/theseam-ui-common-file-input.mjs"
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theseam/ui-common",
3
- "version": "1.0.2-beta.59",
3
+ "version": "1.0.2-beta.63",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.3",
6
6
  "@angular/common": "^20.3.0",
@@ -191,6 +191,10 @@
191
191
  "types": "./dynamic-component-loader/index.d.ts",
192
192
  "default": "./fesm2022/theseam-ui-common-dynamic-component-loader.mjs"
193
193
  },
194
+ "./file-input": {
195
+ "types": "./file-input/index.d.ts",
196
+ "default": "./fesm2022/theseam-ui-common-file-input.mjs"
197
+ },
194
198
  "./footer-bar": {
195
199
  "types": "./footer-bar/index.d.ts",
196
200
  "default": "./fesm2022/theseam-ui-common-footer-bar.mjs"