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

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.
@@ -0,0 +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":"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"}
@@ -1,17 +1,16 @@
1
1
  import { ThemeNames, OutlineThemeNames } from '@theseam/ui-common/models';
2
2
  import { useStoryContext } from 'storybook/preview-api';
3
3
  import * as i0 from '@angular/core';
4
- import { Component, InjectionToken, Injectable, APP_INITIALIZER, NgModule, Injector, Input, ElementRef, APP_BOOTSTRAP_LISTENER } from '@angular/core';
4
+ import { Component, InjectionToken, Injectable, APP_INITIALIZER, NgModule, signal, computed, Injector, Input, ChangeDetectionStrategy, ElementRef, APP_BOOTSTRAP_LISTENER } from '@angular/core';
5
5
  import * as i1 from '@angular/router';
6
6
  import { Router, NavigationEnd, RouterModule } from '@angular/router';
7
- import { filter, take, startWith, auditTime, map, takeUntil } from 'rxjs/operators';
7
+ import { filter, take } from 'rxjs/operators';
8
8
  import * as i1$1 from '@angular/common';
9
9
  import { CommonModule } from '@angular/common';
10
- import * as i2 from '@theseam/ui-common/scrollbar';
11
10
  import { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar';
12
- import { of, Subject, ReplaySubject, combineLatest } from 'rxjs';
11
+ import { of } from 'rxjs';
13
12
  import { ModalRef, MODAL_DATA } from '@theseam/ui-common/modal';
14
- import { applicationConfig } from '@storybook/angular';
13
+ import { componentWrapperDecorator, applicationConfig } from '@storybook/angular';
15
14
 
16
15
  // import { ArgType } from '@storybook/addons'
17
16
  const themeArgType = {
@@ -235,46 +234,61 @@ class FakeModalRef {
235
234
  afterOpened() {
236
235
  return of(undefined);
237
236
  }
238
- close(dialogResult) { }
237
+ close(_dialogResult) {
238
+ /* no-op in stories */
239
+ }
239
240
  }
241
+ /**
242
+ * Renders its content (or an imperatively provided component/template) inside
243
+ * a stand-in modal frame so stories can preview components that are normally
244
+ * opened through the modal service.
245
+ *
246
+ * Three ways to provide content, checked in order:
247
+ * 1. `[component]` input — renders via `ngComponentOutlet`. Kept for
248
+ * compatibility with existing app stories.
249
+ * 2. `[template]` input — renders a `TemplateRef` via `ngTemplateOutlet`.
250
+ * 3. Projected content (`<ng-content>`) — the preferred form for new stories
251
+ * because Storybook's default template auto-binds inputs/outputs.
252
+ */
240
253
  class StoryModalContainerComponent {
241
254
  _injector;
242
- _ngUnsubscribe = new Subject();
255
+ constructor(_injector) {
256
+ this._injector = _injector;
257
+ }
243
258
  set component(c) {
244
- this._component.next(c);
259
+ this._component.set(c ?? null);
245
260
  }
246
261
  set data(d) {
247
- this._data.next(d);
262
+ this._data.set(d ?? null);
248
263
  }
249
- modalConfig;
250
- _component = new ReplaySubject(1);
251
- _data = new ReplaySubject(1);
252
- _outletData$;
253
- constructor(_injector) {
254
- this._injector = _injector;
255
- this._outletData$ = combineLatest([
256
- this._component.asObservable(),
257
- this._data.asObservable().pipe(startWith(undefined)),
258
- ]).pipe(auditTime(0), map(([component, data]) => ({
259
- component,
260
- injector: this._createInjector(data),
261
- })), takeUntil(this._ngUnsubscribe));
264
+ set modalConfig(config) {
265
+ this._modalConfig.set(config ?? null);
262
266
  }
263
- ngOnDestroy() {
264
- this._ngUnsubscribe.next(undefined);
265
- this._ngUnsubscribe.complete();
267
+ get modalConfig() {
268
+ return this._modalConfig();
266
269
  }
270
+ template;
271
+ _component = signal(null, ...(ngDevMode ? [{ debugName: "_component" }] : []));
272
+ _data = signal(null, ...(ngDevMode ? [{ debugName: "_data" }] : []));
273
+ _modalConfig = signal(null, ...(ngDevMode ? [{ debugName: "_modalConfig" }] : []));
274
+ _componentInjector = computed(() => this._createInjector(this._data()), ...(ngDevMode ? [{ debugName: "_componentInjector" }] : []));
275
+ // No default size — stories opt into a Bootstrap modal size via
276
+ // `modalConfig.modalSize`, matching how the real ModalService is used.
277
+ _modalSizeClass = computed(() => {
278
+ const size = this._modalConfig()?.modalSize;
279
+ return size ? `modal-${size}` : '';
280
+ }, ...(ngDevMode ? [{ debugName: "_modalSizeClass" }] : []));
267
281
  _createInjector(data) {
268
282
  return Injector.create({
269
283
  providers: [
270
284
  { provide: ModalRef, useClass: FakeModalRef, deps: [] },
271
- { provide: MODAL_DATA, useValue: data },
285
+ { provide: MODAL_DATA, useValue: data ?? undefined },
272
286
  ],
273
287
  parent: this._injector,
274
288
  });
275
289
  }
276
290
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryModalContainerComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
277
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: StoryModalContainerComponent, isStandalone: false, selector: "story-modal-container-component", inputs: { component: "component", data: "data", modalConfig: "modalConfig" }, ngImport: i0, template: `
291
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: StoryModalContainerComponent, isStandalone: true, selector: "story-modal-container-component", inputs: { component: "component", data: "data", modalConfig: "modalConfig", template: "template" }, ngImport: i0, template: `
278
292
  <div class="cdk-overlay-container">
279
293
  <div
280
294
  class="cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing"
@@ -287,31 +301,29 @@ class StoryModalContainerComponent {
287
301
  >
288
302
  <div
289
303
  class="seam-modal-container modal-dialog modal-dialog-centered {{
290
- modalConfig?.modalSize
291
- ? 'modal-' + modalConfig?.modalSize
292
- : 'modal-lg'
304
+ _modalSizeClass()
293
305
  }}"
294
306
  tabindex="-1"
295
- [class.modal-lg]="!modalConfig"
296
307
  >
297
308
  <div class="modal-content">
298
- <ng-container *ngIf="_outletData$ | async as outletData">
309
+ @if (_component(); as c) {
299
310
  <ng-container
300
- *ngComponentOutlet="
301
- outletData.component;
302
- injector: outletData.injector
303
- "
311
+ *ngComponentOutlet="c; injector: _componentInjector()"
304
312
  ></ng-container>
305
- </ng-container>
313
+ } @else if (template) {
314
+ <ng-container *ngTemplateOutlet="template"></ng-container>
315
+ } @else {
316
+ <ng-content></ng-content>
317
+ }
306
318
  </div>
307
319
  </div>
308
320
  </div>
309
321
  </div>
310
- `, isInline: true, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TheSeamOverlayScrollbarDirective, selector: "[seamOverlayScrollbar]", inputs: ["seamOverlayScrollbar", "overlayScrollbarEnabled"], exportAs: ["seamOverlayScrollbar"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
322
+ `, isInline: true, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TheSeamOverlayScrollbarDirective, selector: "[seamOverlayScrollbar]", inputs: ["seamOverlayScrollbar", "overlayScrollbarEnabled"], exportAs: ["seamOverlayScrollbar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
311
323
  }
312
324
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryModalContainerComponent, decorators: [{
313
325
  type: Component,
314
- args: [{ selector: 'story-modal-container-component', template: `
326
+ args: [{ selector: 'story-modal-container-component', imports: [CommonModule, TheSeamOverlayScrollbarDirective], template: `
315
327
  <div class="cdk-overlay-container">
316
328
  <div
317
329
  class="cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing"
@@ -324,49 +336,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
324
336
  >
325
337
  <div
326
338
  class="seam-modal-container modal-dialog modal-dialog-centered {{
327
- modalConfig?.modalSize
328
- ? 'modal-' + modalConfig?.modalSize
329
- : 'modal-lg'
339
+ _modalSizeClass()
330
340
  }}"
331
341
  tabindex="-1"
332
- [class.modal-lg]="!modalConfig"
333
342
  >
334
343
  <div class="modal-content">
335
- <ng-container *ngIf="_outletData$ | async as outletData">
344
+ @if (_component(); as c) {
336
345
  <ng-container
337
- *ngComponentOutlet="
338
- outletData.component;
339
- injector: outletData.injector
340
- "
346
+ *ngComponentOutlet="c; injector: _componentInjector()"
341
347
  ></ng-container>
342
- </ng-container>
348
+ } @else if (template) {
349
+ <ng-container *ngTemplateOutlet="template"></ng-container>
350
+ } @else {
351
+ <ng-content></ng-content>
352
+ }
343
353
  </div>
344
354
  </div>
345
355
  </div>
346
356
  </div>
347
- `, standalone: false, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"] }]
357
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".seam-modal-container[tabindex=\"-1\"]:focus{outline:0!important}\n"] }]
348
358
  }], ctorParameters: () => [{ type: i0.Injector }], propDecorators: { component: [{
349
359
  type: Input
350
360
  }], data: [{
351
361
  type: Input
352
362
  }], modalConfig: [{
353
363
  type: Input
364
+ }], template: [{
365
+ type: Input
354
366
  }] } });
355
367
 
356
368
  class StoryHelperComponentsModule {
357
369
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
358
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, declarations: [StoryEmptyWithRouteComponent, StoryModalContainerComponent], imports: [CommonModule, RouterModule, TheSeamOverlayScrollbarDirective], exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent] });
359
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, imports: [CommonModule, RouterModule] });
370
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, declarations: [StoryEmptyWithRouteComponent], imports: [CommonModule,
371
+ RouterModule,
372
+ TheSeamOverlayScrollbarDirective,
373
+ StoryModalContainerComponent], exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent] });
374
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, imports: [CommonModule,
375
+ RouterModule,
376
+ StoryModalContainerComponent] });
360
377
  }
361
378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StoryHelperComponentsModule, decorators: [{
362
379
  type: NgModule,
363
380
  args: [{
364
- declarations: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],
365
- imports: [CommonModule, RouterModule, TheSeamOverlayScrollbarDirective],
381
+ declarations: [StoryEmptyWithRouteComponent],
382
+ imports: [
383
+ CommonModule,
384
+ RouterModule,
385
+ TheSeamOverlayScrollbarDirective,
386
+ StoryModalContainerComponent,
387
+ ],
366
388
  exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],
367
389
  }]
368
390
  }] });
369
391
 
392
+ /**
393
+ * Wraps a story's rendered component in `<story-modal-container-component>`
394
+ * so it previews inside a stand-in modal frame. Storybook's default template
395
+ * binds the story's args to the wrapped component, so inputs/outputs (e.g.
396
+ * for the Actions addon) work without extra wiring.
397
+ *
398
+ * Use as an entry in a story's `decorators` array:
399
+ *
400
+ * ```ts
401
+ * const meta: Meta<MyModalComponent> = {
402
+ * title: 'Modal/My',
403
+ * component: MyModalComponent,
404
+ * decorators: [storyModalDecorator({ modalConfig: { modalSize: 'lg' } })],
405
+ * }
406
+ * ```
407
+ */
408
+ function storyModalDecorator(options) {
409
+ return (storyFn, storyContext) => {
410
+ const result = componentWrapperDecorator((story) => `
411
+ <story-modal-container-component [modalConfig]="_storyModalConfig">
412
+ ${story}
413
+ </story-modal-container-component>
414
+ `)(storyFn, storyContext);
415
+ return {
416
+ ...result,
417
+ props: {
418
+ ...(result.props ?? {}),
419
+ // Prefixed to avoid colliding with a story's own args.
420
+ _storyModalConfig: options?.modalConfig ?? null,
421
+ },
422
+ moduleMetadata: {
423
+ ...(result.moduleMetadata ?? {}),
424
+ imports: [
425
+ ...(result.moduleMetadata?.imports ?? []),
426
+ StoryModalContainerComponent,
427
+ ],
428
+ },
429
+ };
430
+ };
431
+ }
432
+
370
433
  /**
371
434
  * Can be used to access a stories component after the story has been bootstrapped.
372
435
  *
@@ -535,5 +598,5 @@ const getInjectorFromArgs = (args, argName = INJECTOR_TO_ARGS_PROPERTY_NAME) =>
535
598
  * Generated bundle index. Do not edit.
536
599
  */
537
600
 
538
- export { INJECTOR_TO_ARGS_PROPERTY_NAME, STORY_INITIAL_ROUTE_URL, StoryEmptyComponent, StoryEmptyWithRouteComponent, StoryHelperComponentsModule, StoryInitialRouteModule, StoryInitialRouteService, StoryModalContainerComponent, StoryPreferencesAccessorService, addInjectorGetterToArgs, argsToTpl, buttonTypeArgType, getInjectorFromArgs, onStoryBootstrappedTrigger, routeButton, routesArgType, sizeArgType, storyInitialRouteFactory, themeArgType, themeWithOutlineArgType };
601
+ export { INJECTOR_TO_ARGS_PROPERTY_NAME, STORY_INITIAL_ROUTE_URL, StoryEmptyComponent, StoryEmptyWithRouteComponent, StoryHelperComponentsModule, StoryInitialRouteModule, StoryInitialRouteService, StoryModalContainerComponent, StoryPreferencesAccessorService, addInjectorGetterToArgs, argsToTpl, buttonTypeArgType, getInjectorFromArgs, onStoryBootstrappedTrigger, routeButton, routesArgType, sizeArgType, storyInitialRouteFactory, storyModalDecorator, themeArgType, themeWithOutlineArgType };
539
602
  //# sourceMappingURL=theseam-ui-common-story-helpers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-story-helpers.mjs","sources":["../../../projects/ui-common/story-helpers/arg-type-helpers.ts","../../../projects/ui-common/story-helpers/args-to-tpl.ts","../../../projects/ui-common/story-helpers/story-empty.component.ts","../../../projects/ui-common/story-helpers/initial-route-factory.ts","../../../projects/ui-common/story-helpers/initial-route.service.ts","../../../projects/ui-common/story-helpers/story-initial-route.ts","../../../projects/ui-common/story-helpers/route-button.ts","../../../projects/ui-common/story-helpers/routes-arg-type.ts","../../../projects/ui-common/story-helpers/story-empty-with-route.component.ts","../../../projects/ui-common/story-helpers/story-modal-container.component.ts","../../../projects/ui-common/story-helpers/story-helper-components.module.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-exec.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-trigger.ts","../../../projects/ui-common/story-helpers/story-preferences-accessor.service.ts","../../../projects/ui-common/story-helpers/add-injector-to-args.ts","../../../projects/ui-common/story-helpers/theseam-ui-common-story-helpers.ts"],"sourcesContent":["// import { ArgType } from '@storybook/addons'\n\nimport { OutlineThemeNames, ThemeNames } from '@theseam/ui-common/models'\n\ndeclare type ArgType = any\n\nexport const themeArgType: ArgType = {\n options: ThemeNames,\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const themeWithOutlineArgType: ArgType = {\n options: [...ThemeNames, ...OutlineThemeNames],\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const sizeArgType: ArgType = {\n options: [undefined, 'sm', 'lg'],\n control: {\n type: 'select',\n },\n description: `Size.`,\n}\n\nexport const buttonTypeArgType: ArgType = {\n options: ['button', 'submit'],\n control: {\n type: 'select',\n },\n description: `Button type.`,\n}\n","/* eslint-disable no-prototype-builtins */\nimport { action, HandlerFunction } from 'storybook/actions'\nimport { AngularRenderer, ArgTypes } from '@storybook/angular'\nimport { useStoryContext } from 'storybook/preview-api'\n\nexport interface ArgsTplParts {\n actions: { [prop: string]: HandlerFunction }\n tplfragment: string\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\n// export function argsToTplParts(args: any, argTypes: ArgTypes): ArgsTplParts {\n// // console.log({ args, argTypes })\n// const parts: ArgsTplParts = {\n// actions: {},\n// tplfragment: ''\n// }\n\n// Object.keys(argTypes).forEach(k => {\n// // Inputs\n// if (\n// // Is in the inputs category\n// argTypes[k].table.category === 'inputs' &&\n// // Needs a control to be able to change from auto-generated args.\n// argTypes[k]?.hasOwnProperty('control') &&\n// // Assuming the arg might not be in props if there isn't an arg value.\n// args.hasOwnProperty(k)\n// ) {\n// parts.tplfragment += `[${k}]=\"${k}\" `\n// }\n\n// // Outputs\n// if (\n// // Is in the outputs category\n// argTypes[k]?.table?.category === 'outputs'\n// ) {\n// // Without access to props, I don't know if I can get an action into the\n// // template context like this.\n// parts.tplfragment += `(${k})=\"${k}($event)\" `\n// parts.actions[k] = action(k)\n// }\n// })\n\n// return parts\n// }\n\nfunction removeDuplicates(arr: string[]) {\n const seen: { [k: string]: boolean } = {}\n return arr.filter((item) => {\n if (!seen[item]) {\n seen[item] = true\n return true\n }\n return false\n })\n}\n\nexport interface ArgsTplOptions {\n /**\n * Properties to always bind to the template.\n */\n alwaysBind?: string[]\n /**\n * Properties to exclude from bidning to the template.\n */\n exclude?: string[]\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\nexport function argsToTpl(options?: ArgsTplOptions) {\n const context = useStoryContext<AngularRenderer>()\n\n const exclude = [\n ...(context?.parameters?.argsToTplOptions?.exclude || []),\n ...(options?.exclude || []),\n ]\n\n const alwaysBind = context?.parameters?.argsToTplOptions?.alwaysBind || []\n\n const props = removeDuplicates([...alwaysBind, ...Object.keys(context.args)])\n\n const parts = props\n .filter((k) => exclude.indexOf(k) === -1)\n .map((k) => {\n // Outputs\n if (\n context.argTypes[k]?.hasOwnProperty('action') &&\n (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1)\n ) {\n return `(${k})=\"${k}($event)\"`\n }\n\n // Inputs\n if (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1) {\n return `[${k}]=\"${k}\"`\n }\n })\n\n return parts.length > 0 ? parts.join(' ') : ''\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: ``, standalone: true })\nexport class StoryEmptyComponent {}\n","import { StoryInitialRouteService } from './initial-route.service'\n\nexport function storyInitialRouteFactory(\n _storyInitialRouteService: StoryInitialRouteService,\n) {\n return () => _storyInitialRouteService.setInitialRoute()\n}\n","import { Injectable, InjectionToken, Injector } from '@angular/core'\nimport { NavigationEnd, Router } from '@angular/router'\nimport { filter, take } from 'rxjs/operators'\n\nexport const STORY_INITIAL_ROUTE_URL = new InjectionToken<any>(\n 'STORY_INITIAL_ROUTE_URL',\n)\n\n@Injectable()\nexport class StoryInitialRouteService {\n constructor(private _injector: Injector) {}\n\n public setInitialRoute() {\n const _router = this._injector.get(Router)\n const url = this._injector.get(STORY_INITIAL_ROUTE_URL)\n if (_router.navigated) {\n _router.navigateByUrl(url)\n } else {\n _router.events\n .pipe(\n filter((e) => e instanceof NavigationEnd),\n take(1),\n )\n .subscribe(() => {\n _router.navigateByUrl(url)\n })\n }\n }\n}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'\n\nimport { storyInitialRouteFactory } from './initial-route-factory'\nimport {\n StoryInitialRouteService,\n STORY_INITIAL_ROUTE_URL,\n} from './initial-route.service'\n\n@NgModule()\nexport class StoryInitialRouteModule {\n static forRoot(url: string): ModuleWithProviders<StoryInitialRouteModule> {\n return {\n ngModule: StoryInitialRouteModule,\n providers: [\n StoryInitialRouteService,\n {\n provide: APP_INITIALIZER,\n useFactory: storyInitialRouteFactory,\n deps: [StoryInitialRouteService],\n multi: true,\n },\n { provide: STORY_INITIAL_ROUTE_URL, useValue: url },\n ],\n }\n }\n}\n","// import { button } from '@storybook/addon-knobs'\n\n/**\n * Until I find a way to avoid '@storybook/addon-knobs' from interfering with\n * NgZone I can't import it in the knob when built by ng-packagr.\n */\nexport function routeButton(buttonKnob: any, url: string) {\n return buttonKnob(url, () => {\n location.hash = `#${url}`\n return false\n })\n}\n","// import { ArgType } from '@storybook/addons'\n\ndeclare const __STORYBOOK_ADDONS: any\n\nfunction goToHashUrl(url: string): void {\n location.hash = `#${url}`\n}\n\n// __STORYBOOK_ADDONS.getChannel().on('custom/go-to-hash', (data: { hash: string }) => {\n\n// goToHashUrl(data.hash)\n// })\n\n// __STORYBOOK_ADDONS.getChannel().on('storyArgsUpdated', (data: { hash: string }) => {\n// console.log('storyArgsUpdated')\n// })\n\nexport function routesArgType(routes: string[]) /*: ArgType*/ {\n return {\n options: routes,\n control: {\n type: 'select',\n // Runs in the 'manager', so I am emitting to a channel in the 'preview'.\n onChange: (e: any, a: any) => {\n __STORYBOOK_ADDONS.getChannel().emit('custom/go-to-hash', { hash: e })\n return e\n },\n },\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: `<router-outlet></router-outlet>`, standalone: false })\nexport class StoryEmptyWithRouteComponent {}\n","import { Component, Injector, Input, OnDestroy } from '@angular/core'\nimport { combineLatest, Observable, of, ReplaySubject, Subject } from 'rxjs'\nimport { auditTime, map, startWith, takeUntil } from 'rxjs/operators'\n\nimport { ModalConfig, ModalRef, MODAL_DATA } from '@theseam/ui-common/modal'\nimport type { ComponentType } from '@theseam/ui-common/models'\n\nclass FakeModalRef<T, R = any> implements Partial<ModalRef<T, R>> {\n afterOpened() {\n return of(undefined)\n }\n\n close(dialogResult?: R): void {}\n}\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'story-modal-container-component',\n template: `\n <div class=\"cdk-overlay-container\">\n <div\n class=\"cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing\"\n ></div>\n <div\n class=\"cdk-global-overlay-wrapper\"\n dir=\"ltr\"\n style=\"justify-content: flex-start; align-items: center; pointer-events: auto\"\n seamOverlayScrollbar\n >\n <div\n class=\"seam-modal-container modal-dialog modal-dialog-centered {{\n modalConfig?.modalSize\n ? 'modal-' + modalConfig?.modalSize\n : 'modal-lg'\n }}\"\n tabindex=\"-1\"\n [class.modal-lg]=\"!modalConfig\"\n >\n <div class=\"modal-content\">\n <ng-container *ngIf=\"_outletData$ | async as outletData\">\n <ng-container\n *ngComponentOutlet=\"\n outletData.component;\n injector: outletData.injector\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .seam-modal-container[tabindex='-1']:focus {\n outline: 0 !important;\n }\n `,\n ],\n standalone: false,\n})\nexport class StoryModalContainerComponent<T, D = any> implements OnDestroy {\n private readonly _ngUnsubscribe = new Subject<void>()\n\n @Input() set component(c: ComponentType<T>) {\n this._component.next(c)\n }\n @Input() set data(d: D) {\n this._data.next(d)\n }\n\n @Input() modalConfig?: ModalConfig<D>\n\n _component = new ReplaySubject<ComponentType<T>>(1)\n _data = new ReplaySubject<D>(1)\n\n _outletData$: Observable<{\n component: ComponentType<T>\n injector: Injector\n } | null>\n\n constructor(private _injector: Injector) {\n this._outletData$ = combineLatest([\n this._component.asObservable(),\n this._data.asObservable().pipe(startWith(undefined)),\n ]).pipe(\n auditTime(0),\n map(([component, data]) => ({\n component,\n injector: this._createInjector(data),\n })),\n takeUntil(this._ngUnsubscribe),\n )\n }\n\n ngOnDestroy() {\n this._ngUnsubscribe.next(undefined)\n this._ngUnsubscribe.complete()\n }\n\n private _createInjector(data?: D): Injector {\n return Injector.create({\n providers: [\n { provide: ModalRef, useClass: FakeModalRef, deps: [] },\n { provide: MODAL_DATA, useValue: data },\n ],\n parent: this._injector,\n })\n }\n}\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { RouterModule } from '@angular/router'\n\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nimport { StoryEmptyWithRouteComponent } from './story-empty-with-route.component'\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\n@NgModule({\n declarations: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],\n imports: [CommonModule, RouterModule, TheSeamOverlayScrollbarDirective],\n exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],\n})\nexport class StoryHelperComponentsModule {}\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef } from '@angular/core'\n// import { STORY } from '@storybook/angular/dist/ts3.9/client/preview/angular/app.token'\n// import { StoryFnAngularReturnType } from '@storybook/angular/dist/ts3.9/client/preview/types'\nimport { Observable } from 'rxjs'\nimport { first } from 'rxjs/operators'\n\n/**\n * Can be used to access a stories component after the story has been bootstrapped.\n *\n * Example:\n * ```ts\n * @Component({\n * selector: 'story-example',\n * template: `Touched: {{ exControl.touched }}`\n * })\n * class StoryExampleComponent {\n * exControl = new FormControl('')\n * }\n *\n * export const TouchExample2 = () => ({\n * moduleMetadata: {\n * declarations: [ StoryExampleComponent ],\n * providers: [ onStoryBootstrappedExec((c: StoryExampleComponent) => c.exControl.markAsTouched()) ]\n * },\n * props: { },\n * component: StoryExampleComponent\n * })\n * ```\n */\n// export function onStoryBootstrappedExec<T = any>(callback: (component: T) => void) {\n// function bootstrapped(componentRef: ComponentRef<any>) {\n// const data = componentRef.instance.target.injector.get(STORY, null) as Observable<StoryFnAngularReturnType> | null\n// if (!data) {\n// console.warn(`STORY provider not found.`)\n// return\n// }\n// data?.pipe(first()).subscribe(story => {\n// if (!story.component) {\n// console.warn(`'onStoryBootstrappedExec' only supported on stories that provide 'component' property.`)\n// return\n// }\n\n// let c = null\n// for (let i = 0; i < componentRef.instance.target.length; i++) {\n// const tmp = componentRef.instance.target._embeddedViews[i].nodes?.find((f: any) => f?.instance instanceof story.component)\n// const comp = tmp?.instance\n// if (comp) {\n// c = comp\n// break\n// }\n// }\n\n// if (!c) {\n// console.warn(`Story component instance not found.`)\n// return\n// }\n\n// if (c) {\n// callback(c)\n// }\n// })\n// }\n\n// return {\n// provide: APP_BOOTSTRAP_LISTENER,\n// useValue: bootstrapped,\n// multi: true\n// }\n// }\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef, ElementRef } from '@angular/core'\n\n// TODO: Consider supporting a target selection function, so that complex\n// selections that can't be expressed by a simple selector can be used.\n\n/**\n * Can be used to trigger an event on a target element when the story component has been bootstrapped.\n *\n * Example:\n * ```\n * export const TouchExample1 = () => ({\n * moduleMetadata: {\n * providers: [ onStoryBootstrappedTrigger('input', 'blur') ]\n * },\n * props: { control: new FormControl('') },\n * template: `\n * <input type=\"text\" [formControl]=\"control\">\n * Touched: {{ control.touched }}\n * `\n * })\n * ```\n */\nexport function onStoryBootstrappedTrigger(\n targetSelector: string,\n eventName: string,\n) {\n function bootstrapped(componentRef: ComponentRef<any>) {\n const elementRef = componentRef.injector.get(ElementRef, null)\n const target = elementRef?.nativeElement.querySelector(targetSelector)\n if (!target) {\n // eslint-disable-next-line no-console\n console.warn(\n `Unable to trigger event '${eventName}'. Target '${targetSelector}' not found.`,\n )\n }\n\n const e = document.createEvent('HTMLEvents')\n e.initEvent('blur', false, true)\n target.dispatchEvent(e)\n }\n\n return {\n provide: APP_BOOTSTRAP_LISTENER,\n useValue: bootstrapped,\n multi: true,\n }\n}\n","import { Injectable } from '@angular/core'\nimport { Observable, of } from 'rxjs'\n\nimport { TheSeamPreferencesAccessor } from '@theseam/ui-common/services'\n\nconst ACCESSOR_PREFIX = 'story-pref'\n\n@Injectable()\nexport class StoryPreferencesAccessorService\n implements TheSeamPreferencesAccessor\n{\n /**\n * Gets a preference.\n */\n public get(name: string): Observable<string> {\n // console.log('get', name)\n return of(localStorage.getItem(`${ACCESSOR_PREFIX}-${name}`) || '{}')\n }\n\n /**\n * Update a preference.\n */\n public update(name: string, value: string): Observable<string> {\n // console.log('update', name)\n localStorage.setItem(`${ACCESSOR_PREFIX}-${name}`, value)\n return this.get(name)\n }\n\n /**\n * Delete a preference.\n */\n public delete(name: string): Observable<boolean> {\n localStorage.removeItem(`${ACCESSOR_PREFIX}-${name}`)\n return of(true)\n }\n}\n","import { APP_INITIALIZER, Injector } from '@angular/core'\n\nimport { AngularRenderer, applicationConfig } from '@storybook/angular'\nimport { DecoratorFunction } from 'storybook/internal/csf'\n\nexport const INJECTOR_TO_ARGS_PROPERTY_NAME = '__getInjector'\n\n// TODO: Decide a better way to persist the injector reference than poluting\n// args with a value that isn't really meant to be an arg.\n\n/**\n * Storybook decorator that stores the Angular Injector in\n * args, for retrieval in play function.\n */\nexport const addInjectorGetterToArgs =\n (\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n ): DecoratorFunction<AngularRenderer> =>\n (story: any, context: any) => {\n // TODO: Test this more thoroughly.\n let injector: Injector | null = null\n context.args[argName] = () => injector\n return applicationConfig({\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: (injectorService: Injector) => () => {\n injector = injectorService\n },\n deps: [Injector],\n multi: true,\n },\n ],\n })(story, context)\n }\n\nexport const getInjectorFromArgs = (\n args: any,\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n): Injector => {\n if (!args || typeof args[argName] !== 'function') {\n throw Error(`Injector getter function '${argName}' not found.`)\n }\n const injector = args[argName]()\n if (!injector) {\n throw Error(\n `Injector not found. Did you add 'addInjectorGetterToArgs' to your story dectorators?`,\n )\n }\n\n return injector\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-story-helpers.mjs","sources":["../../../projects/ui-common/story-helpers/arg-type-helpers.ts","../../../projects/ui-common/story-helpers/args-to-tpl.ts","../../../projects/ui-common/story-helpers/story-empty.component.ts","../../../projects/ui-common/story-helpers/initial-route-factory.ts","../../../projects/ui-common/story-helpers/initial-route.service.ts","../../../projects/ui-common/story-helpers/story-initial-route.ts","../../../projects/ui-common/story-helpers/route-button.ts","../../../projects/ui-common/story-helpers/routes-arg-type.ts","../../../projects/ui-common/story-helpers/story-empty-with-route.component.ts","../../../projects/ui-common/story-helpers/story-modal-container.component.ts","../../../projects/ui-common/story-helpers/story-helper-components.module.ts","../../../projects/ui-common/story-helpers/story-modal-decorator.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-exec.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-trigger.ts","../../../projects/ui-common/story-helpers/story-preferences-accessor.service.ts","../../../projects/ui-common/story-helpers/add-injector-to-args.ts","../../../projects/ui-common/story-helpers/theseam-ui-common-story-helpers.ts"],"sourcesContent":["// import { ArgType } from '@storybook/addons'\n\nimport { OutlineThemeNames, ThemeNames } from '@theseam/ui-common/models'\n\ndeclare type ArgType = any\n\nexport const themeArgType: ArgType = {\n options: ThemeNames,\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const themeWithOutlineArgType: ArgType = {\n options: [...ThemeNames, ...OutlineThemeNames],\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const sizeArgType: ArgType = {\n options: [undefined, 'sm', 'lg'],\n control: {\n type: 'select',\n },\n description: `Size.`,\n}\n\nexport const buttonTypeArgType: ArgType = {\n options: ['button', 'submit'],\n control: {\n type: 'select',\n },\n description: `Button type.`,\n}\n","/* eslint-disable no-prototype-builtins */\nimport { action, HandlerFunction } from 'storybook/actions'\nimport { AngularRenderer, ArgTypes } from '@storybook/angular'\nimport { useStoryContext } from 'storybook/preview-api'\n\nexport interface ArgsTplParts {\n actions: { [prop: string]: HandlerFunction }\n tplfragment: string\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\n// export function argsToTplParts(args: any, argTypes: ArgTypes): ArgsTplParts {\n// // console.log({ args, argTypes })\n// const parts: ArgsTplParts = {\n// actions: {},\n// tplfragment: ''\n// }\n\n// Object.keys(argTypes).forEach(k => {\n// // Inputs\n// if (\n// // Is in the inputs category\n// argTypes[k].table.category === 'inputs' &&\n// // Needs a control to be able to change from auto-generated args.\n// argTypes[k]?.hasOwnProperty('control') &&\n// // Assuming the arg might not be in props if there isn't an arg value.\n// args.hasOwnProperty(k)\n// ) {\n// parts.tplfragment += `[${k}]=\"${k}\" `\n// }\n\n// // Outputs\n// if (\n// // Is in the outputs category\n// argTypes[k]?.table?.category === 'outputs'\n// ) {\n// // Without access to props, I don't know if I can get an action into the\n// // template context like this.\n// parts.tplfragment += `(${k})=\"${k}($event)\" `\n// parts.actions[k] = action(k)\n// }\n// })\n\n// return parts\n// }\n\nfunction removeDuplicates(arr: string[]) {\n const seen: { [k: string]: boolean } = {}\n return arr.filter((item) => {\n if (!seen[item]) {\n seen[item] = true\n return true\n }\n return false\n })\n}\n\nexport interface ArgsTplOptions {\n /**\n * Properties to always bind to the template.\n */\n alwaysBind?: string[]\n /**\n * Properties to exclude from bidning to the template.\n */\n exclude?: string[]\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\nexport function argsToTpl(options?: ArgsTplOptions) {\n const context = useStoryContext<AngularRenderer>()\n\n const exclude = [\n ...(context?.parameters?.argsToTplOptions?.exclude || []),\n ...(options?.exclude || []),\n ]\n\n const alwaysBind = context?.parameters?.argsToTplOptions?.alwaysBind || []\n\n const props = removeDuplicates([...alwaysBind, ...Object.keys(context.args)])\n\n const parts = props\n .filter((k) => exclude.indexOf(k) === -1)\n .map((k) => {\n // Outputs\n if (\n context.argTypes[k]?.hasOwnProperty('action') &&\n (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1)\n ) {\n return `(${k})=\"${k}($event)\"`\n }\n\n // Inputs\n if (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1) {\n return `[${k}]=\"${k}\"`\n }\n })\n\n return parts.length > 0 ? parts.join(' ') : ''\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: ``, standalone: true })\nexport class StoryEmptyComponent {}\n","import { StoryInitialRouteService } from './initial-route.service'\n\nexport function storyInitialRouteFactory(\n _storyInitialRouteService: StoryInitialRouteService,\n) {\n return () => _storyInitialRouteService.setInitialRoute()\n}\n","import { Injectable, InjectionToken, Injector } from '@angular/core'\nimport { NavigationEnd, Router } from '@angular/router'\nimport { filter, take } from 'rxjs/operators'\n\nexport const STORY_INITIAL_ROUTE_URL = new InjectionToken<any>(\n 'STORY_INITIAL_ROUTE_URL',\n)\n\n@Injectable()\nexport class StoryInitialRouteService {\n constructor(private _injector: Injector) {}\n\n public setInitialRoute() {\n const _router = this._injector.get(Router)\n const url = this._injector.get(STORY_INITIAL_ROUTE_URL)\n if (_router.navigated) {\n _router.navigateByUrl(url)\n } else {\n _router.events\n .pipe(\n filter((e) => e instanceof NavigationEnd),\n take(1),\n )\n .subscribe(() => {\n _router.navigateByUrl(url)\n })\n }\n }\n}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'\n\nimport { storyInitialRouteFactory } from './initial-route-factory'\nimport {\n StoryInitialRouteService,\n STORY_INITIAL_ROUTE_URL,\n} from './initial-route.service'\n\n@NgModule()\nexport class StoryInitialRouteModule {\n static forRoot(url: string): ModuleWithProviders<StoryInitialRouteModule> {\n return {\n ngModule: StoryInitialRouteModule,\n providers: [\n StoryInitialRouteService,\n {\n provide: APP_INITIALIZER,\n useFactory: storyInitialRouteFactory,\n deps: [StoryInitialRouteService],\n multi: true,\n },\n { provide: STORY_INITIAL_ROUTE_URL, useValue: url },\n ],\n }\n }\n}\n","// import { button } from '@storybook/addon-knobs'\n\n/**\n * Until I find a way to avoid '@storybook/addon-knobs' from interfering with\n * NgZone I can't import it in the knob when built by ng-packagr.\n */\nexport function routeButton(buttonKnob: any, url: string) {\n return buttonKnob(url, () => {\n location.hash = `#${url}`\n return false\n })\n}\n","// import { ArgType } from '@storybook/addons'\n\ndeclare const __STORYBOOK_ADDONS: any\n\nfunction goToHashUrl(url: string): void {\n location.hash = `#${url}`\n}\n\n// __STORYBOOK_ADDONS.getChannel().on('custom/go-to-hash', (data: { hash: string }) => {\n\n// goToHashUrl(data.hash)\n// })\n\n// __STORYBOOK_ADDONS.getChannel().on('storyArgsUpdated', (data: { hash: string }) => {\n// console.log('storyArgsUpdated')\n// })\n\nexport function routesArgType(routes: string[]) /*: ArgType*/ {\n return {\n options: routes,\n control: {\n type: 'select',\n // Runs in the 'manager', so I am emitting to a channel in the 'preview'.\n onChange: (e: any, a: any) => {\n __STORYBOOK_ADDONS.getChannel().emit('custom/go-to-hash', { hash: e })\n return e\n },\n },\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: `<router-outlet></router-outlet>`, standalone: false })\nexport class StoryEmptyWithRouteComponent {}\n","import { CommonModule } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n Injector,\n Input,\n signal,\n TemplateRef,\n} from '@angular/core'\nimport { of } from 'rxjs'\n\nimport { ModalConfig, ModalRef, MODAL_DATA } from '@theseam/ui-common/modal'\nimport type { ComponentType } from '@theseam/ui-common/models'\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nclass FakeModalRef<T, R = any> implements Partial<ModalRef<T, R>> {\n afterOpened() {\n return of(undefined)\n }\n\n close(_dialogResult?: R): void {\n /* no-op in stories */\n }\n}\n\n/**\n * Renders its content (or an imperatively provided component/template) inside\n * a stand-in modal frame so stories can preview components that are normally\n * opened through the modal service.\n *\n * Three ways to provide content, checked in order:\n * 1. `[component]` input — renders via `ngComponentOutlet`. Kept for\n * compatibility with existing app stories.\n * 2. `[template]` input — renders a `TemplateRef` via `ngTemplateOutlet`.\n * 3. Projected content (`<ng-content>`) — the preferred form for new stories\n * because Storybook's default template auto-binds inputs/outputs.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'story-modal-container-component',\n imports: [CommonModule, TheSeamOverlayScrollbarDirective],\n template: `\n <div class=\"cdk-overlay-container\">\n <div\n class=\"cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing\"\n ></div>\n <div\n class=\"cdk-global-overlay-wrapper\"\n dir=\"ltr\"\n style=\"justify-content: flex-start; align-items: center; pointer-events: auto\"\n seamOverlayScrollbar\n >\n <div\n class=\"seam-modal-container modal-dialog modal-dialog-centered {{\n _modalSizeClass()\n }}\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n @if (_component(); as c) {\n <ng-container\n *ngComponentOutlet=\"c; injector: _componentInjector()\"\n ></ng-container>\n } @else if (template) {\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .seam-modal-container[tabindex='-1']:focus {\n outline: 0 !important;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StoryModalContainerComponent<T = unknown, D = any> {\n constructor(private readonly _injector: Injector) {}\n\n @Input()\n set component(c: ComponentType<T> | null | undefined) {\n this._component.set(c ?? null)\n }\n\n @Input()\n set data(d: D | null | undefined) {\n this._data.set(d ?? null)\n }\n\n @Input()\n set modalConfig(config: ModalConfig<D> | null | undefined) {\n this._modalConfig.set(config ?? null)\n }\n get modalConfig(): ModalConfig<D> | null {\n return this._modalConfig()\n }\n\n @Input() template?: TemplateRef<unknown> | null\n\n protected readonly _component = signal<ComponentType<T> | null>(null)\n private readonly _data = signal<D | null>(null)\n private readonly _modalConfig = signal<ModalConfig<D> | null>(null)\n\n protected readonly _componentInjector = computed(() =>\n this._createInjector(this._data()),\n )\n\n // No default size — stories opt into a Bootstrap modal size via\n // `modalConfig.modalSize`, matching how the real ModalService is used.\n protected readonly _modalSizeClass = computed(() => {\n const size = this._modalConfig()?.modalSize\n return size ? `modal-${size}` : ''\n })\n\n private _createInjector(data: D | null): Injector {\n return Injector.create({\n providers: [\n { provide: ModalRef, useClass: FakeModalRef, deps: [] },\n { provide: MODAL_DATA, useValue: data ?? undefined },\n ],\n parent: this._injector,\n })\n }\n}\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { RouterModule } from '@angular/router'\n\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nimport { StoryEmptyWithRouteComponent } from './story-empty-with-route.component'\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\n@NgModule({\n declarations: [StoryEmptyWithRouteComponent],\n imports: [\n CommonModule,\n RouterModule,\n TheSeamOverlayScrollbarDirective,\n StoryModalContainerComponent,\n ],\n exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],\n})\nexport class StoryHelperComponentsModule {}\n","import { componentWrapperDecorator, Decorator } from '@storybook/angular'\n\nimport { ModalConfig } from '@theseam/ui-common/modal'\n\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\nexport interface StoryModalDecoratorOptions {\n /**\n * Passed through to `StoryModalContainerComponent`'s `modalConfig` input.\n * Commonly used to opt into a Bootstrap modal size, e.g.\n * `{ modalSize: 'lg' }`.\n */\n modalConfig?: ModalConfig\n}\n\n/**\n * Wraps a story's rendered component in `<story-modal-container-component>`\n * so it previews inside a stand-in modal frame. Storybook's default template\n * binds the story's args to the wrapped component, so inputs/outputs (e.g.\n * for the Actions addon) work without extra wiring.\n *\n * Use as an entry in a story's `decorators` array:\n *\n * ```ts\n * const meta: Meta<MyModalComponent> = {\n * title: 'Modal/My',\n * component: MyModalComponent,\n * decorators: [storyModalDecorator({ modalConfig: { modalSize: 'lg' } })],\n * }\n * ```\n */\nexport function storyModalDecorator(\n options?: StoryModalDecoratorOptions,\n): Decorator {\n return (storyFn, storyContext) => {\n const result = componentWrapperDecorator(\n (story) => `\n <story-modal-container-component [modalConfig]=\"_storyModalConfig\">\n ${story}\n </story-modal-container-component>\n `,\n )(storyFn, storyContext)\n\n return {\n ...result,\n props: {\n ...(result.props ?? {}),\n // Prefixed to avoid colliding with a story's own args.\n _storyModalConfig: options?.modalConfig ?? null,\n },\n moduleMetadata: {\n ...(result.moduleMetadata ?? {}),\n imports: [\n ...(result.moduleMetadata?.imports ?? []),\n StoryModalContainerComponent,\n ],\n },\n }\n }\n}\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef } from '@angular/core'\n// import { STORY } from '@storybook/angular/dist/ts3.9/client/preview/angular/app.token'\n// import { StoryFnAngularReturnType } from '@storybook/angular/dist/ts3.9/client/preview/types'\nimport { Observable } from 'rxjs'\nimport { first } from 'rxjs/operators'\n\n/**\n * Can be used to access a stories component after the story has been bootstrapped.\n *\n * Example:\n * ```ts\n * @Component({\n * selector: 'story-example',\n * template: `Touched: {{ exControl.touched }}`\n * })\n * class StoryExampleComponent {\n * exControl = new FormControl('')\n * }\n *\n * export const TouchExample2 = () => ({\n * moduleMetadata: {\n * declarations: [ StoryExampleComponent ],\n * providers: [ onStoryBootstrappedExec((c: StoryExampleComponent) => c.exControl.markAsTouched()) ]\n * },\n * props: { },\n * component: StoryExampleComponent\n * })\n * ```\n */\n// export function onStoryBootstrappedExec<T = any>(callback: (component: T) => void) {\n// function bootstrapped(componentRef: ComponentRef<any>) {\n// const data = componentRef.instance.target.injector.get(STORY, null) as Observable<StoryFnAngularReturnType> | null\n// if (!data) {\n// console.warn(`STORY provider not found.`)\n// return\n// }\n// data?.pipe(first()).subscribe(story => {\n// if (!story.component) {\n// console.warn(`'onStoryBootstrappedExec' only supported on stories that provide 'component' property.`)\n// return\n// }\n\n// let c = null\n// for (let i = 0; i < componentRef.instance.target.length; i++) {\n// const tmp = componentRef.instance.target._embeddedViews[i].nodes?.find((f: any) => f?.instance instanceof story.component)\n// const comp = tmp?.instance\n// if (comp) {\n// c = comp\n// break\n// }\n// }\n\n// if (!c) {\n// console.warn(`Story component instance not found.`)\n// return\n// }\n\n// if (c) {\n// callback(c)\n// }\n// })\n// }\n\n// return {\n// provide: APP_BOOTSTRAP_LISTENER,\n// useValue: bootstrapped,\n// multi: true\n// }\n// }\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef, ElementRef } from '@angular/core'\n\n// TODO: Consider supporting a target selection function, so that complex\n// selections that can't be expressed by a simple selector can be used.\n\n/**\n * Can be used to trigger an event on a target element when the story component has been bootstrapped.\n *\n * Example:\n * ```\n * export const TouchExample1 = () => ({\n * moduleMetadata: {\n * providers: [ onStoryBootstrappedTrigger('input', 'blur') ]\n * },\n * props: { control: new FormControl('') },\n * template: `\n * <input type=\"text\" [formControl]=\"control\">\n * Touched: {{ control.touched }}\n * `\n * })\n * ```\n */\nexport function onStoryBootstrappedTrigger(\n targetSelector: string,\n eventName: string,\n) {\n function bootstrapped(componentRef: ComponentRef<any>) {\n const elementRef = componentRef.injector.get(ElementRef, null)\n const target = elementRef?.nativeElement.querySelector(targetSelector)\n if (!target) {\n // eslint-disable-next-line no-console\n console.warn(\n `Unable to trigger event '${eventName}'. Target '${targetSelector}' not found.`,\n )\n }\n\n const e = document.createEvent('HTMLEvents')\n e.initEvent('blur', false, true)\n target.dispatchEvent(e)\n }\n\n return {\n provide: APP_BOOTSTRAP_LISTENER,\n useValue: bootstrapped,\n multi: true,\n }\n}\n","import { Injectable } from '@angular/core'\nimport { Observable, of } from 'rxjs'\n\nimport { TheSeamPreferencesAccessor } from '@theseam/ui-common/services'\n\nconst ACCESSOR_PREFIX = 'story-pref'\n\n@Injectable()\nexport class StoryPreferencesAccessorService\n implements TheSeamPreferencesAccessor\n{\n /**\n * Gets a preference.\n */\n public get(name: string): Observable<string> {\n // console.log('get', name)\n return of(localStorage.getItem(`${ACCESSOR_PREFIX}-${name}`) || '{}')\n }\n\n /**\n * Update a preference.\n */\n public update(name: string, value: string): Observable<string> {\n // console.log('update', name)\n localStorage.setItem(`${ACCESSOR_PREFIX}-${name}`, value)\n return this.get(name)\n }\n\n /**\n * Delete a preference.\n */\n public delete(name: string): Observable<boolean> {\n localStorage.removeItem(`${ACCESSOR_PREFIX}-${name}`)\n return of(true)\n }\n}\n","import { APP_INITIALIZER, Injector } from '@angular/core'\n\nimport { AngularRenderer, applicationConfig } from '@storybook/angular'\nimport { DecoratorFunction } from 'storybook/internal/csf'\n\nexport const INJECTOR_TO_ARGS_PROPERTY_NAME = '__getInjector'\n\n// TODO: Decide a better way to persist the injector reference than poluting\n// args with a value that isn't really meant to be an arg.\n\n/**\n * Storybook decorator that stores the Angular Injector in\n * args, for retrieval in play function.\n */\nexport const addInjectorGetterToArgs =\n (\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n ): DecoratorFunction<AngularRenderer> =>\n (story: any, context: any) => {\n // TODO: Test this more thoroughly.\n let injector: Injector | null = null\n context.args[argName] = () => injector\n return applicationConfig({\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: (injectorService: Injector) => () => {\n injector = injectorService\n },\n deps: [Injector],\n multi: true,\n },\n ],\n })(story, context)\n }\n\nexport const getInjectorFromArgs = (\n args: any,\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n): Injector => {\n if (!args || typeof args[argName] !== 'function') {\n throw Error(`Injector getter function '${argName}' not found.`)\n }\n const injector = args[argName]()\n if (!injector) {\n throw Error(\n `Injector not found. Did you add 'addInjectorGetterToArgs' to your story dectorators?`,\n )\n }\n\n return injector\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theseam/ui-common",
3
- "version": "1.0.2-beta.57",
3
+ "version": "1.0.2-beta.59",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.3",
6
6
  "@angular/common": "^20.3.0",
@@ -267,6 +267,10 @@
267
267
  "types": "./shared/index.d.ts",
268
268
  "default": "./fesm2022/theseam-ui-common-shared.mjs"
269
269
  },
270
+ "./signature-input": {
271
+ "types": "./signature-input/index.d.ts",
272
+ "default": "./fesm2022/theseam-ui-common-signature-input.mjs"
273
+ },
270
274
  "./states-counties-map": {
271
275
  "types": "./states-counties-map/index.d.ts",
272
276
  "default": "./fesm2022/theseam-ui-common-states-counties-map.mjs"