@forgeroute/ui 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { ChangeDetectorRef, InjectionToken, OnDestroy, OnInit, Signal, WritableSignal } from "@angular/core";
3
- import { AbstractControl, ControlValueAccessor, ValidationErrors, Validator } from "@angular/forms";
3
+ import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator } from "@angular/forms";
4
4
  import { Observable, Subject } from "rxjs";
5
5
  import { HttpClient, HttpInterceptorFn } from "@angular/common/http";
6
6
  import { SafeHtml } from "@angular/platform-browser";
@@ -2056,12 +2056,34 @@ export declare class ImageRepositionComponent {
2056
2056
  "y": "yChange";
2057
2057
  }, never, never, true, never>;
2058
2058
  }
2059
+ /** One checkbox of a group (`options`). */
2060
+ export interface CheckboxOption {
2061
+ value: string;
2062
+ label: string;
2063
+ /** Helper text under the option. */
2064
+ description?: string;
2065
+ disabled?: boolean;
2066
+ }
2059
2067
  export declare class CheckboxComponent implements ControlValueAccessor, Validator, UiFieldValidity {
2060
2068
  readonly label: import("@angular/core").InputSignal<string>;
2061
2069
  /** Accessible name for the native checkbox when there is no visible `label` (e.g. a table row's selector). */
2062
2070
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2063
2071
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2064
2072
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2073
+ /**
2074
+ * GROUP MODE (optional): with `options` the component renders a native `<fieldset>` with a `<legend>` and one checkbox per option,
2075
+ * and its value (ngModel / forms) is the array of ticked option values (in option order). Without `options` it is the single
2076
+ * boolean checkbox it always was. In group mode `label` / `checked` / `indeterminate` are not used; `required` means at least one
2077
+ * option must be ticked ("<legend> is required.").
2078
+ */
2079
+ readonly options: import("@angular/core").InputSignal<CheckboxOption[]>;
2080
+ /** Group heading (the fieldset's legend). */
2081
+ readonly legend: import("@angular/core").InputSignal<string>;
2082
+ /** Indent this checkbox (or the whole group) under its parent option, aligned with the parent's label. */
2083
+ readonly indent: import("@angular/core").InputSignal<boolean>;
2084
+ protected readonly groupMode: import("@angular/core").Signal<boolean>;
2085
+ private readonly _selected;
2086
+ protected isSelected(value: string): boolean;
2065
2087
  /** The box must be ticked. */
2066
2088
  readonly required: import("@angular/core").InputSignal<boolean>;
2067
2089
  /** Replaces the built-in "<label> is required." message. */
@@ -2094,11 +2116,15 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2094
2116
  protected readonly disabled: import("@angular/core").Signal<boolean>;
2095
2117
  private onChange;
2096
2118
  private onTouched;
2097
- writeValue(val: boolean): void;
2098
- registerOnChange(fn: (v: boolean) => void): void;
2119
+ writeValue(val: boolean | string[] | null): void;
2120
+ registerOnChange(fn: (v: boolean | string[]) => void): void;
2099
2121
  registerOnTouched(fn: () => void): void;
2100
2122
  setDisabledState(d: boolean): void;
2101
2123
  onToggle(event: Event): void;
2124
+ /** The values keep the option order, and values that are not an option are dropped. */
2125
+ private inOptionOrder;
2126
+ /** Group mode: ticks / unticks one option; the form gets the full list of ticked values. */
2127
+ onToggleOption(value: string, event: Event): void;
2102
2128
  static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxComponent, never>;
2103
2129
  static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxComponent, "ui-checkbox", never, {
2104
2130
  "label": {
@@ -2121,6 +2147,21 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2121
2147
  "required": false;
2122
2148
  "isSignal": true;
2123
2149
  };
2150
+ "options": {
2151
+ "alias": "options";
2152
+ "required": false;
2153
+ "isSignal": true;
2154
+ };
2155
+ "legend": {
2156
+ "alias": "legend";
2157
+ "required": false;
2158
+ "isSignal": true;
2159
+ };
2160
+ "indent": {
2161
+ "alias": "indent";
2162
+ "required": false;
2163
+ "isSignal": true;
2164
+ };
2124
2165
  "required": {
2125
2166
  "alias": "required";
2126
2167
  "required": false;
@@ -2156,6 +2197,542 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2156
2197
  "invalidChange": "invalidChange";
2157
2198
  }, never, ["*"], true, never>;
2158
2199
  }
2200
+ /**
2201
+ * On/off switch for settings: a label and optional hint on the left, the switch on the right
2202
+ * (ControlValueAccessor with a boolean value; `[(checked)]` also works).
2203
+ *
2204
+ * <ui-toggle label="SMS Enabled" hint="Allow sending texts" [(ngModel)]="form.sms" />
2205
+ * <ui-toggle label="Autoplay" [checked]="on()" (checkedChange)="on.set($event)" />
2206
+ * <ui-toggle ariaLabel="Enable feature" [(checked)]="on" /> <!-- no visible label -->
2207
+ *
2208
+ * Built on a native `<input type="checkbox" role="switch">`, so Space toggles it, it is focusable, and a screen reader
2209
+ * announces it as a switch (on / off). The label and hint name and describe it. `disabled` (input or form control) dims it
2210
+ * and blocks changes. On touch devices and phones the switch has a >= 44px hit area.
2211
+ */
2212
+ export declare class ToggleComponent implements ControlValueAccessor {
2213
+ /** Bold line on the left. */
2214
+ readonly label: import("@angular/core").InputSignal<string>;
2215
+ /** Grey helper text under the label. */
2216
+ readonly hint: import("@angular/core").InputSignal<string>;
2217
+ /** Accessible name when there is no visible `label`. */
2218
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
2219
+ /** Whether the switch is on. Two-way: `[(checked)]`. */
2220
+ readonly checked: import("@angular/core").ModelSignal<boolean>;
2221
+ /** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking, TS2445). */
2222
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
2223
+ private readonly _cvaDisabled;
2224
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
2225
+ private readonly _id;
2226
+ protected readonly _labelId: string;
2227
+ protected readonly _hintId: string;
2228
+ private _onChange;
2229
+ private _onTouched;
2230
+ writeValue(val: boolean): void;
2231
+ registerOnChange(fn: (v: boolean) => void): void;
2232
+ registerOnTouched(fn: () => void): void;
2233
+ setDisabledState(d: boolean): void;
2234
+ protected onTouched(): void;
2235
+ protected onToggle(event: Event): void;
2236
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToggleComponent, never>;
2237
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToggleComponent, "ui-toggle", never, {
2238
+ "label": {
2239
+ "alias": "label";
2240
+ "required": false;
2241
+ "isSignal": true;
2242
+ };
2243
+ "hint": {
2244
+ "alias": "hint";
2245
+ "required": false;
2246
+ "isSignal": true;
2247
+ };
2248
+ "ariaLabel": {
2249
+ "alias": "ariaLabel";
2250
+ "required": false;
2251
+ "isSignal": true;
2252
+ };
2253
+ "checked": {
2254
+ "alias": "checked";
2255
+ "required": false;
2256
+ "isSignal": true;
2257
+ };
2258
+ "_disabledInput": {
2259
+ "alias": "disabled";
2260
+ "required": false;
2261
+ "isSignal": true;
2262
+ };
2263
+ }, {
2264
+ "checked": "checkedChange";
2265
+ }, never, never, true, never>;
2266
+ }
2267
+ /** One weekday of the schedule. `open` / `close` are `HH:mm`; `open2` / `close2` are the optional second shift (split shift). */
2268
+ export interface BusinessHoursDay {
2269
+ /** 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat' | 'sun' */
2270
+ day: string;
2271
+ /** 'Monday' … */
2272
+ label: string;
2273
+ enabled: boolean;
2274
+ open: string;
2275
+ close: string;
2276
+ open2?: string;
2277
+ close2?: string;
2278
+ }
2279
+ /** Mon–Fri 9:00 AM – 5:00 PM, Sat/Sun closed (their stored times are 9:00 AM – 12:00 PM, used when the day is switched on). */
2280
+ export declare function buildDefaultSchedule(): BusinessHoursDay[];
2281
+ /**
2282
+ * Parses a stored schedule (`{"mon":{"enabled":true,"open":"09:00","close":"17:00"}, …}`, optionally with `open2` / `close2`)
2283
+ * into a full Mon–Sun array. Missing days / fields fall back to the defaults; anything that is not valid JSON gives the defaults.
2284
+ */
2285
+ export declare function parseBizHours(json: string | null | undefined): BusinessHoursDay[];
2286
+ /** The inverse of `parseBizHours`: `{ mon: { enabled, open, close[, open2, close2] }, … }` as a JSON string. */
2287
+ export declare function serializeBizHours(schedule: BusinessHoursDay[]): string;
2288
+ export type BusinessHoursStep = 15 | 30 | 60;
2289
+ /** `HH:mm` options for one day, every `step` minutes from 00:00 to the last slot of the day, labelled 12-hour ("9:00 AM") or 24-hour ("09:00"). */
2290
+ export declare function businessTimeOptions(step?: BusinessHoursStep, hour24?: boolean): {
2291
+ value: string;
2292
+ label: string;
2293
+ }[];
2294
+ /**
2295
+ * Weekly business-hours editor: one row per weekday with a checkbox (open / closed) and "opens … to … closes" selects.
2296
+ * ControlValueAccessor over `BusinessHoursDay[]` (`[(ngModel)]`, `formControl`, or `[(value)]`); the array is never mutated, each change emits a new array.
2297
+ *
2298
+ * <ui-business-hours label="Schedule" [(ngModel)]="schedule" />
2299
+ * <ui-business-hours label="Schedule" [(ngModel)]="schedule" [step]="15" [hour24]="true" [allowSplitShifts]="true" [showCopyToWeekdays]="true" />
2300
+ *
2301
+ * Inputs
2302
+ * - `label` (names the group), `hint`, `error` (host message, wins), `showErrors` (reveal built-in messages now; otherwise after the first change / blur), `disabled`.
2303
+ * - `step` 15 | 30 | 60 minutes between time options (default 30). A stored time that is not on the grid is still offered, so it never shows blank.
2304
+ * - `hour24` 24-hour labels ("17:00") instead of "5:00 PM".
2305
+ * - `allowSplitShifts` adds an "Add shift" / "Remove shift" link per open day for a second shift (`open2` / `close2`), e.g. 9–12 and 1–5.
2306
+ * - `showCopyToWeekdays` adds a "Copy Monday to weekdays" button that copies Monday's open flag and times (incl. the second shift) to Tue–Fri.
2307
+ * - `required` at least one day must be open ("<label> needs at least one open day.").
2308
+ *
2309
+ * Validation (built in; `Validator` + `UiFieldValidity` + `invalidChange`, like the other inputs): for every open day the closing time must be after
2310
+ * the opening time ("Monday: closing time must be after opening time."); with a second shift it must start after the first ends and end after it starts.
2311
+ * Overnight ranges are not supported (a single `open < close` window per shift), the same as call routing.
2312
+ *
2313
+ * Accessibility: a `role="group"` named by `label`; every select has its own name ("Monday opens", "Monday closes", "Monday second shift opens" …);
2314
+ * errors are announced (`role="alert"`) and linked with `aria-describedby`.
2315
+ */
2316
+ export declare class BusinessHoursComponent implements ControlValueAccessor, Validator, UiFieldValidity {
2317
+ /** The schedule (also what `ngModel` / `formControl` hold). Two-way: `[(value)]`. */
2318
+ readonly value: import("@angular/core").ModelSignal<BusinessHoursDay[]>;
2319
+ readonly label: import("@angular/core").InputSignal<string>;
2320
+ readonly hint: import("@angular/core").InputSignal<string>;
2321
+ /** Host-provided error message (wins over the built-in ones). */
2322
+ readonly error: import("@angular/core").InputSignal<string>;
2323
+ /** Reveal the built-in message now (e.g. after a failed Save click) instead of after the first change. */
2324
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
2325
+ /** At least one day must be open. */
2326
+ readonly required: import("@angular/core").InputSignal<boolean>;
2327
+ /** Minutes between time options. */
2328
+ readonly step: import("@angular/core").InputSignal<BusinessHoursStep>;
2329
+ /** 24-hour labels. */
2330
+ readonly hour24: import("@angular/core").InputSignal<boolean>;
2331
+ /** Allow a second shift per day (split shifts). */
2332
+ readonly allowSplitShifts: import("@angular/core").InputSignal<boolean>;
2333
+ /** Show "Copy Monday to weekdays". */
2334
+ readonly showCopyToWeekdays: import("@angular/core").InputSignal<boolean>;
2335
+ /** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking, TS2445). */
2336
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
2337
+ private readonly _cvaDisabled;
2338
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
2339
+ protected readonly _descId: string;
2340
+ private readonly _reveal;
2341
+ private readonly _issue;
2342
+ /** True while a built-in rule is broken or the host passed an `[error]`. */
2343
+ readonly invalid: import("@angular/core").Signal<boolean>;
2344
+ /** Message of the first broken built-in rule ('' when valid), shown or not. */
2345
+ readonly errorMessage: import("@angular/core").Signal<string>;
2346
+ /** Emits whenever the field becomes invalid / valid. */
2347
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
2348
+ protected readonly _activeError: import("@angular/core").Signal<string>;
2349
+ private _onValidatorChange;
2350
+ private readonly _options;
2351
+ constructor();
2352
+ /** Re-run the form control's validation when a rule input (`required`, `allowSplitShifts`) changes. */
2353
+ ngOnChanges(): void;
2354
+ validate(control: AbstractControl): ValidationErrors | null;
2355
+ registerOnValidatorChange(fn: () => void): void;
2356
+ private _onChange;
2357
+ private _onTouched;
2358
+ writeValue(val: BusinessHoursDay[] | null): void;
2359
+ registerOnChange(fn: (v: BusinessHoursDay[]) => void): void;
2360
+ registerOnTouched(fn: () => void): void;
2361
+ setDisabledState(d: boolean): void;
2362
+ /** The grid options plus the stored value when it is not on the grid (so a saved 09:15 never renders blank). */
2363
+ protected optionsFor(current: string): {
2364
+ value: string;
2365
+ label: string;
2366
+ }[];
2367
+ protected hasSecondShift(d: BusinessHoursDay): boolean;
2368
+ /** A second shift needs room: the first must end at least one hour before the last slot of the day. */
2369
+ protected canAddShift(d: BusinessHoursDay): boolean;
2370
+ protected update(day: string, patch: Partial<BusinessHoursDay>): void;
2371
+ protected addShift(day: string): void;
2372
+ protected removeShift(day: string): void;
2373
+ protected copyMondayToWeekdays(): void;
2374
+ private _emit;
2375
+ private _check;
2376
+ static ɵfac: i0.ɵɵFactoryDeclaration<BusinessHoursComponent, never>;
2377
+ static ɵcmp: i0.ɵɵComponentDeclaration<BusinessHoursComponent, "ui-business-hours", never, {
2378
+ "value": {
2379
+ "alias": "value";
2380
+ "required": false;
2381
+ "isSignal": true;
2382
+ };
2383
+ "label": {
2384
+ "alias": "label";
2385
+ "required": false;
2386
+ "isSignal": true;
2387
+ };
2388
+ "hint": {
2389
+ "alias": "hint";
2390
+ "required": false;
2391
+ "isSignal": true;
2392
+ };
2393
+ "error": {
2394
+ "alias": "error";
2395
+ "required": false;
2396
+ "isSignal": true;
2397
+ };
2398
+ "showErrors": {
2399
+ "alias": "showErrors";
2400
+ "required": false;
2401
+ "isSignal": true;
2402
+ };
2403
+ "required": {
2404
+ "alias": "required";
2405
+ "required": false;
2406
+ "isSignal": true;
2407
+ };
2408
+ "step": {
2409
+ "alias": "step";
2410
+ "required": false;
2411
+ "isSignal": true;
2412
+ };
2413
+ "hour24": {
2414
+ "alias": "hour24";
2415
+ "required": false;
2416
+ "isSignal": true;
2417
+ };
2418
+ "allowSplitShifts": {
2419
+ "alias": "allowSplitShifts";
2420
+ "required": false;
2421
+ "isSignal": true;
2422
+ };
2423
+ "showCopyToWeekdays": {
2424
+ "alias": "showCopyToWeekdays";
2425
+ "required": false;
2426
+ "isSignal": true;
2427
+ };
2428
+ "_disabledInput": {
2429
+ "alias": "disabled";
2430
+ "required": false;
2431
+ "isSignal": true;
2432
+ };
2433
+ }, {
2434
+ "value": "valueChange";
2435
+ "invalidChange": "invalidChange";
2436
+ }, never, never, true, never>;
2437
+ }
2438
+ export interface RadioOption {
2439
+ value: string;
2440
+ label: string;
2441
+ description?: string;
2442
+ disabled?: boolean;
2443
+ }
2444
+ /**
2445
+ * Group of native radio buttons inside a `<fieldset>` (+ `<legend>` = `label`), a ControlValueAccessor (string value, `''`
2446
+ * = nothing selected). Arrow keys move and select natively because all radios share one `name`.
2447
+ * Built-in validation: `required` -> "<label> is required."; a non-empty value that is not one of the `options` ->
2448
+ * "Select a valid option." (not checked while `options` is empty). Disabled groups are never invalid.
2449
+ *
2450
+ * Validity API (same on every ui input): Angular `Validator`, signals `invalid` + `errorMessage`, `invalidChange` output,
2451
+ * provides `UiFieldValidity`. Messages show after the group lost focus or while `[showErrors]="true"`; a host `[error]` wins.
2452
+ */
2453
+ export declare class RadioGroupComponent implements ControlValueAccessor, Validator, UiFieldValidity {
2454
+ readonly label: import("@angular/core").InputSignal<string>;
2455
+ readonly options: import("@angular/core").InputSignal<RadioOption[]>;
2456
+ readonly required: import("@angular/core").InputSignal<boolean>;
2457
+ readonly hint: import("@angular/core").InputSignal<string>;
2458
+ readonly error: import("@angular/core").InputSignal<string>;
2459
+ /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
2460
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
2461
+ readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal">;
2462
+ /** Native `name` shared by the radios; a unique one is generated when omitted. */
2463
+ readonly name: import("@angular/core").InputSignal<string>;
2464
+ protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
2465
+ private readonly _cvaDisabled;
2466
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
2467
+ private readonly _generatedName;
2468
+ protected get _name(): string;
2469
+ protected readonly _descId: string;
2470
+ protected readonly _value: import("@angular/core").WritableSignal<string>;
2471
+ private readonly _reveal;
2472
+ private readonly _issue;
2473
+ /** True while the value breaks a built-in rule or the host passed an `[error]`. */
2474
+ readonly invalid: import("@angular/core").Signal<boolean>;
2475
+ /** Message of the first broken built-in rule ('' when valid), shown or not. */
2476
+ readonly errorMessage: import("@angular/core").Signal<string>;
2477
+ /** Emits whenever the field becomes invalid / valid. */
2478
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
2479
+ protected readonly _activeError: import("@angular/core").Signal<string>;
2480
+ private _onValidatorChange;
2481
+ constructor();
2482
+ /** Re-run the form control's validation when a rule input (required, options) changes. */
2483
+ ngOnChanges(): void;
2484
+ validate(control: AbstractControl): ValidationErrors | null;
2485
+ registerOnValidatorChange(fn: () => void): void;
2486
+ private _onChange;
2487
+ private _onTouched;
2488
+ writeValue(val: string): void;
2489
+ registerOnChange(fn: (v: string) => void): void;
2490
+ registerOnTouched(fn: () => void): void;
2491
+ setDisabledState(d: boolean): void;
2492
+ protected onSelect(value: string): void;
2493
+ /** Touched once focus leaves the whole group (moving between its radios does not count). */
2494
+ protected onFocusOut(event: FocusEvent): void;
2495
+ private _check;
2496
+ static ɵfac: i0.ɵɵFactoryDeclaration<RadioGroupComponent, never>;
2497
+ static ɵcmp: i0.ɵɵComponentDeclaration<RadioGroupComponent, "ui-radio-group", never, {
2498
+ "label": {
2499
+ "alias": "label";
2500
+ "required": false;
2501
+ "isSignal": true;
2502
+ };
2503
+ "options": {
2504
+ "alias": "options";
2505
+ "required": false;
2506
+ "isSignal": true;
2507
+ };
2508
+ "required": {
2509
+ "alias": "required";
2510
+ "required": false;
2511
+ "isSignal": true;
2512
+ };
2513
+ "hint": {
2514
+ "alias": "hint";
2515
+ "required": false;
2516
+ "isSignal": true;
2517
+ };
2518
+ "error": {
2519
+ "alias": "error";
2520
+ "required": false;
2521
+ "isSignal": true;
2522
+ };
2523
+ "showErrors": {
2524
+ "alias": "showErrors";
2525
+ "required": false;
2526
+ "isSignal": true;
2527
+ };
2528
+ "orientation": {
2529
+ "alias": "orientation";
2530
+ "required": false;
2531
+ "isSignal": true;
2532
+ };
2533
+ "name": {
2534
+ "alias": "name";
2535
+ "required": false;
2536
+ "isSignal": true;
2537
+ };
2538
+ "_disabledInput": {
2539
+ "alias": "disabled";
2540
+ "required": false;
2541
+ "isSignal": true;
2542
+ };
2543
+ }, {
2544
+ "invalidChange": "invalidChange";
2545
+ }, never, never, true, never>;
2546
+ }
2547
+ /** One phone number the host found for sale. */
2548
+ export interface PhoneNumberOption {
2549
+ /** E.164 number, e.g. '+15125550100'. */
2550
+ phoneNumber: string;
2551
+ /** What the user sees, e.g. '(512) 555-0100'. */
2552
+ friendlyName: string;
2553
+ /** City / state label shown as a badge, e.g. 'Austin, TX'. */
2554
+ region: string | null;
2555
+ }
2556
+ /** What the host's `search` function receives: exactly one of the two keys. */
2557
+ export interface PhoneNumberSearchCriteria {
2558
+ postalCode?: string;
2559
+ areaCode?: string;
2560
+ }
2561
+ /** What `selected` emits: the chosen number plus the criteria that found it. */
2562
+ export type PhoneNumberSelection = PhoneNumberOption & PhoneNumberSearchCriteria;
2563
+ export type PhoneNumberSearchMode = 'zip' | 'area-code';
2564
+ export declare const PHONE_NUMBER_ZIP_LENGTH = 5;
2565
+ export declare const PHONE_NUMBER_AREA_CODE_LENGTH = 3;
2566
+ /** Keeps only digits and cuts to `max` ("78701-1234" -> "78701"). */
2567
+ export declare function digitsOnly(value: string | null | undefined, max: number): string;
2568
+ /**
2569
+ * Side panel that walks the user through finding and choosing a phone number to buy. The HOST does the searching (the
2570
+ * library owns no HTTP and knows nothing about the phone provider): it passes a `search` function that returns the
2571
+ * numbers for a ZIP code or an area code.
2572
+ *
2573
+ * <ui-phone-number-picker
2574
+ * [open]="showPicker()"
2575
+ * defaultPostalCode="78701"
2576
+ * costNotice="Each number costs about $1.00/month."
2577
+ * [search]="searchNumbers"
2578
+ * (selected)="buy($event)"
2579
+ * (closed)="showPicker.set(false)" />
2580
+ *
2581
+ * searchNumbers = (c: PhoneNumberSearchCriteria) => this.api.get<PhoneNumberOption[]>('/phone-numbers/available', c);
2582
+ *
2583
+ * Inputs: `open`, `title` ('Get a Phone Number'), `subtitle`, `defaultPostalCode` (prefilled ZIP, may be empty),
2584
+ * `defaultMode` ('zip' | 'area-code'), `allowAreaCode` (true: the user can switch to an area code search), `search`
2585
+ * (required), `costNotice` (warning shown on steps 1 and 3), `confirmLabel` ('Get this number'), `maxResults` (5: caps what is shown).
2586
+ * Outputs: `selected` (PhoneNumberSelection, only from the final confirm button) and `closed`.
2587
+ *
2588
+ * Flow (three steps, nothing is ever searched or bought without a click):
2589
+ * 1. Confirm location - ZIP code (5 digits) or area code (3 digits), prefilled from `defaultPostalCode`. The primary button
2590
+ * "Confirm ZIP code and search" is disabled until the value is complete; Enter does the same. Non-digits are ignored while
2591
+ * typing, a pasted ZIP+4 keeps its first 5 digits.
2592
+ * 2. Results - `search(criteria)` runs ONCE per confirm; a newer search (or closing) drops the older response. Skeleton while
2593
+ * loading, an empty state, or an error with Retry. Picking a row only moves on to step 3.
2594
+ * 3. Confirm number - "You chose ...". Only the final button emits `selected`, then `closed`.
2595
+ * Every time `open` becomes true the panel starts again at step 1 with the defaults; closing discards everything.
2596
+ * `defaultPostalCode` may arrive after the panel opened (the host loads it asynchronously): while the panel is on step 1 in ZIP
2597
+ * mode and the user has NOT typed or pasted in the ZIP field (clearing it counts as an edit), a non-empty default fills the field;
2598
+ * typed input is never overwritten, an empty default is ignored, and a default that arrives on step 2 or 3 is applied when the user
2599
+ * returns to step 1 only if the field is still untouched.
2600
+ * The final confirm emits `selected` at most once per opening (double clicks / repeated Enter are ignored and the button is disabled
2601
+ * after the first click). The panel emits `closed` right after `selected`, so the host closes it; reopening re-enables the button.
2602
+ *
2603
+ * Accessibility: labelled fields with the library's inline errors, focus moves to the first control of each step (a text
2604
+ * field is not focused on touch devices so no keyboard pops up), a visually hidden polite live region announces searching,
2605
+ * result counts, errors and step changes, Escape closes the panel even from inside a field, 44px touch targets come from the
2606
+ * shared components.
2607
+ */
2608
+ export declare class PhoneNumberPickerComponent {
2609
+ readonly open: import("@angular/core").InputSignal<boolean>;
2610
+ readonly title: import("@angular/core").InputSignal<string>;
2611
+ readonly subtitle: import("@angular/core").InputSignal<string>;
2612
+ readonly defaultPostalCode: import("@angular/core").InputSignal<string>;
2613
+ readonly defaultMode: import("@angular/core").InputSignal<PhoneNumberSearchMode>;
2614
+ readonly allowAreaCode: import("@angular/core").InputSignal<boolean>;
2615
+ /** Host-supplied search. Called once per confirm; the library never fetches by itself. */
2616
+ readonly search: import("@angular/core").InputSignal<(criteria: PhoneNumberSearchCriteria) => Observable<PhoneNumberOption[]>>;
2617
+ readonly costNotice: import("@angular/core").InputSignal<string>;
2618
+ readonly confirmLabel: import("@angular/core").InputSignal<string>;
2619
+ readonly maxResults: import("@angular/core").InputSignal<number>;
2620
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
2621
+ readonly selected: import("@angular/core").OutputEmitterRef<PhoneNumberSelection>;
2622
+ protected readonly modeOptions: RadioOption[];
2623
+ protected readonly skeletonRows: number[];
2624
+ protected readonly modeCtl: FormControl<string>;
2625
+ protected readonly zipCtl: FormControl<string>;
2626
+ protected readonly areaCtl: FormControl<string>;
2627
+ protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
2628
+ protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
2629
+ private readonly _zip;
2630
+ private readonly _area;
2631
+ protected readonly touched: import("@angular/core").WritableSignal<boolean>;
2632
+ /** True once the user typed / pasted in the ZIP field this opening: a late default never overwrites it. */
2633
+ private readonly _zipEdited;
2634
+ /** True once the final confirm emitted `selected` this opening: further confirms are ignored. */
2635
+ protected readonly confirmed: import("@angular/core").WritableSignal<boolean>;
2636
+ protected readonly loading: import("@angular/core").WritableSignal<boolean>;
2637
+ protected readonly searchFailed: import("@angular/core").WritableSignal<boolean>;
2638
+ private readonly _results;
2639
+ private readonly _criteria;
2640
+ protected readonly chosen: import("@angular/core").WritableSignal<PhoneNumberOption | null>;
2641
+ private readonly _value;
2642
+ private readonly _length;
2643
+ protected readonly valid: import("@angular/core").Signal<boolean>;
2644
+ private readonly _fieldName;
2645
+ /** Own "wrong length" message (empty is left to the input's built-in "is required"); only once the field was touched. */
2646
+ protected readonly fieldError: import("@angular/core").Signal<string>;
2647
+ protected readonly visibleResults: import("@angular/core").Signal<PhoneNumberOption[]>;
2648
+ protected readonly primaryLabel: import("@angular/core").Signal<string>;
2649
+ protected readonly changeLabel: import("@angular/core").Signal<"Change area code" | "Change ZIP code">;
2650
+ protected readonly emptyTitle: import("@angular/core").Signal<string>;
2651
+ protected readonly criteriaText: import("@angular/core").Signal<string>;
2652
+ protected readonly announcement: import("@angular/core").Signal<string>;
2653
+ private readonly _destroyRef;
2654
+ private readonly _injector;
2655
+ private readonly _el;
2656
+ private _searchSub;
2657
+ constructor();
2658
+ protected onPrimary(): void;
2659
+ protected onEnter(event: Event): void;
2660
+ /** Typing a non-digit is blocked before it reaches the field. */
2661
+ protected onBeforeInput(event: Event): void;
2662
+ /** A pasted ZIP+4 / formatted text keeps its first 5 (or 3) digits and replaces the field's text. */
2663
+ protected onPaste(event: Event): void;
2664
+ protected submit(): void;
2665
+ protected retry(): void;
2666
+ protected choose(option: PhoneNumberOption): void;
2667
+ protected changeLocation(): void;
2668
+ protected backToResults(): void;
2669
+ protected confirm(): void;
2670
+ protected close(): void;
2671
+ private _run;
2672
+ private _abort;
2673
+ private _reset;
2674
+ /** A user edit: sanitise and write back into the field when something was stripped. */
2675
+ private _typed;
2676
+ private _write;
2677
+ /** Moves focus to the first control of the step that was just shown. */
2678
+ private _focusStep;
2679
+ static ɵfac: i0.ɵɵFactoryDeclaration<PhoneNumberPickerComponent, never>;
2680
+ static ɵcmp: i0.ɵɵComponentDeclaration<PhoneNumberPickerComponent, "ui-phone-number-picker", never, {
2681
+ "open": {
2682
+ "alias": "open";
2683
+ "required": false;
2684
+ "isSignal": true;
2685
+ };
2686
+ "title": {
2687
+ "alias": "title";
2688
+ "required": false;
2689
+ "isSignal": true;
2690
+ };
2691
+ "subtitle": {
2692
+ "alias": "subtitle";
2693
+ "required": false;
2694
+ "isSignal": true;
2695
+ };
2696
+ "defaultPostalCode": {
2697
+ "alias": "defaultPostalCode";
2698
+ "required": false;
2699
+ "isSignal": true;
2700
+ };
2701
+ "defaultMode": {
2702
+ "alias": "defaultMode";
2703
+ "required": false;
2704
+ "isSignal": true;
2705
+ };
2706
+ "allowAreaCode": {
2707
+ "alias": "allowAreaCode";
2708
+ "required": false;
2709
+ "isSignal": true;
2710
+ };
2711
+ "search": {
2712
+ "alias": "search";
2713
+ "required": true;
2714
+ "isSignal": true;
2715
+ };
2716
+ "costNotice": {
2717
+ "alias": "costNotice";
2718
+ "required": false;
2719
+ "isSignal": true;
2720
+ };
2721
+ "confirmLabel": {
2722
+ "alias": "confirmLabel";
2723
+ "required": false;
2724
+ "isSignal": true;
2725
+ };
2726
+ "maxResults": {
2727
+ "alias": "maxResults";
2728
+ "required": false;
2729
+ "isSignal": true;
2730
+ };
2731
+ }, {
2732
+ "closed": "closed";
2733
+ "selected": "selected";
2734
+ }, never, never, true, never>;
2735
+ }
2159
2736
  export declare class ButtonComponent {
2160
2737
  readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "tab" | "icon" | "icon-danger">;
2161
2738
  /** Renders an anchor to this route instead of a button (use with `variant="link"` for an inline text link). `['/settings']` or `'/settings'`. */
@@ -2955,120 +3532,11 @@ export declare class ComboboxComponent<T = unknown> implements ControlValueAcces
2955
3532
  "isSignal": true;
2956
3533
  };
2957
3534
  }, {
2958
- "searchChange": "searchChange";
2959
- "valueChange": "valueChange";
2960
- "invalidChange": "invalidChange";
2961
- "focused": "focused";
2962
- "blurred": "blurred";
2963
- }, never, never, true, never>;
2964
- }
2965
- export interface RadioOption {
2966
- value: string;
2967
- label: string;
2968
- description?: string;
2969
- disabled?: boolean;
2970
- }
2971
- /**
2972
- * Group of native radio buttons inside a `<fieldset>` (+ `<legend>` = `label`), a ControlValueAccessor (string value, `''`
2973
- * = nothing selected). Arrow keys move and select natively because all radios share one `name`.
2974
- * Built-in validation: `required` -> "<label> is required."; a non-empty value that is not one of the `options` ->
2975
- * "Select a valid option." (not checked while `options` is empty). Disabled groups are never invalid.
2976
- *
2977
- * Validity API (same on every ui input): Angular `Validator`, signals `invalid` + `errorMessage`, `invalidChange` output,
2978
- * provides `UiFieldValidity`. Messages show after the group lost focus or while `[showErrors]="true"`; a host `[error]` wins.
2979
- */
2980
- export declare class RadioGroupComponent implements ControlValueAccessor, Validator, UiFieldValidity {
2981
- readonly label: import("@angular/core").InputSignal<string>;
2982
- readonly options: import("@angular/core").InputSignal<RadioOption[]>;
2983
- readonly required: import("@angular/core").InputSignal<boolean>;
2984
- readonly hint: import("@angular/core").InputSignal<string>;
2985
- readonly error: import("@angular/core").InputSignal<string>;
2986
- /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
2987
- readonly showErrors: import("@angular/core").InputSignal<boolean>;
2988
- readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal">;
2989
- /** Native `name` shared by the radios; a unique one is generated when omitted. */
2990
- readonly name: import("@angular/core").InputSignal<string>;
2991
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
2992
- private readonly _cvaDisabled;
2993
- protected readonly disabled: import("@angular/core").Signal<boolean>;
2994
- private readonly _generatedName;
2995
- protected get _name(): string;
2996
- protected readonly _descId: string;
2997
- protected readonly _value: import("@angular/core").WritableSignal<string>;
2998
- private readonly _reveal;
2999
- private readonly _issue;
3000
- /** True while the value breaks a built-in rule or the host passed an `[error]`. */
3001
- readonly invalid: import("@angular/core").Signal<boolean>;
3002
- /** Message of the first broken built-in rule ('' when valid), shown or not. */
3003
- readonly errorMessage: import("@angular/core").Signal<string>;
3004
- /** Emits whenever the field becomes invalid / valid. */
3005
- readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
3006
- protected readonly _activeError: import("@angular/core").Signal<string>;
3007
- private _onValidatorChange;
3008
- constructor();
3009
- /** Re-run the form control's validation when a rule input (required, options) changes. */
3010
- ngOnChanges(): void;
3011
- validate(control: AbstractControl): ValidationErrors | null;
3012
- registerOnValidatorChange(fn: () => void): void;
3013
- private _onChange;
3014
- private _onTouched;
3015
- writeValue(val: string): void;
3016
- registerOnChange(fn: (v: string) => void): void;
3017
- registerOnTouched(fn: () => void): void;
3018
- setDisabledState(d: boolean): void;
3019
- protected onSelect(value: string): void;
3020
- /** Touched once focus leaves the whole group (moving between its radios does not count). */
3021
- protected onFocusOut(event: FocusEvent): void;
3022
- private _check;
3023
- static ɵfac: i0.ɵɵFactoryDeclaration<RadioGroupComponent, never>;
3024
- static ɵcmp: i0.ɵɵComponentDeclaration<RadioGroupComponent, "ui-radio-group", never, {
3025
- "label": {
3026
- "alias": "label";
3027
- "required": false;
3028
- "isSignal": true;
3029
- };
3030
- "options": {
3031
- "alias": "options";
3032
- "required": false;
3033
- "isSignal": true;
3034
- };
3035
- "required": {
3036
- "alias": "required";
3037
- "required": false;
3038
- "isSignal": true;
3039
- };
3040
- "hint": {
3041
- "alias": "hint";
3042
- "required": false;
3043
- "isSignal": true;
3044
- };
3045
- "error": {
3046
- "alias": "error";
3047
- "required": false;
3048
- "isSignal": true;
3049
- };
3050
- "showErrors": {
3051
- "alias": "showErrors";
3052
- "required": false;
3053
- "isSignal": true;
3054
- };
3055
- "orientation": {
3056
- "alias": "orientation";
3057
- "required": false;
3058
- "isSignal": true;
3059
- };
3060
- "name": {
3061
- "alias": "name";
3062
- "required": false;
3063
- "isSignal": true;
3064
- };
3065
- "_disabledInput": {
3066
- "alias": "disabled";
3067
- "required": false;
3068
- "isSignal": true;
3069
- };
3070
- }, {
3535
+ "searchChange": "searchChange";
3536
+ "valueChange": "valueChange";
3071
3537
  "invalidChange": "invalidChange";
3538
+ "focused": "focused";
3539
+ "blurred": "blurred";
3072
3540
  }, never, never, true, never>;
3073
3541
  }
3074
3542
  /**
@@ -3273,8 +3741,27 @@ export interface DocumentPreviewTarget {
3273
3741
  title: string;
3274
3742
  fileName: string | null;
3275
3743
  }
3276
- /** Opens a document for preview (the host knows its own route / viewer). Called synchronously inside the click. */
3277
- export type DocumentPreviewHandler = (doc: DocumentPreviewTarget) => void;
3744
+ /** The recipient the panel currently holds (as the panel's `contactId` / `contactName` / `contactEmail` / `contactPhone` inputs). */
3745
+ export interface DocumentPreviewContact {
3746
+ id: string;
3747
+ name: string;
3748
+ email: string;
3749
+ phone: string;
3750
+ }
3751
+ /**
3752
+ * Second argument of `documentPreview`: who the document is being sent to, so the host can preview it filled for that recipient.
3753
+ * `contact` is `null` when the panel has no recipient (all four contact inputs blank); `sendContext` is the panel's `sendContext` input
3754
+ * as given (not filtered by `documentContextTypes`) or `null`.
3755
+ */
3756
+ export interface DocumentPreviewContext {
3757
+ contact: DocumentPreviewContact | null;
3758
+ sendContext: SendContext | null;
3759
+ }
3760
+ /**
3761
+ * Opens a document for preview (the host knows its own route / viewer). Called synchronously inside the click. The second argument
3762
+ * is new and optional to use: a handler that only declares `doc` keeps working.
3763
+ */
3764
+ export type DocumentPreviewHandler = (doc: DocumentPreviewTarget, context: DocumentPreviewContext) => void;
3278
3765
  /**
3279
3766
  * Turns on the "Expiry and Reminders" settings of the document section and sets their starting values (the keys you leave out start at
3280
3767
  * the defaults below). `null` / not passed = the settings are not shown and nothing about them is sent.
@@ -3402,6 +3889,10 @@ export declare class DocumentSendOptionsComponent implements UiFieldValidity {
3402
3889
  * (`window.open` after an await is blocked as a popup in Safari).
3403
3890
  */
3404
3891
  readonly documentPreview: import("@angular/core").InputSignal<DocumentPreviewHandler | null>;
3892
+ /** The recipient passed to `documentPreview` as `context.contact` (the send panel sets it from its contact inputs). `null` = none. */
3893
+ readonly previewContact: import("@angular/core").InputSignal<DocumentPreviewContact | null>;
3894
+ /** The send context passed to `documentPreview` as `context.sendContext` (the send panel sets it from its `sendContext`). `null` = none. */
3895
+ readonly previewSendContext: import("@angular/core").InputSignal<SendContext | null>;
3405
3896
  /**
3406
3897
  * Turns on the signer logic (`documentSigners` of the panel): a document's customer roles (from its row's `signerRoles`, or the config's
3407
3898
  * `resolveRoles`), informational documents (no signature fields), the one-signer DocuSign rule and the read-only countersign rule.
@@ -3552,6 +4043,16 @@ export declare class DocumentSendOptionsComponent implements UiFieldValidity {
3552
4043
  "required": false;
3553
4044
  "isSignal": true;
3554
4045
  };
4046
+ "previewContact": {
4047
+ "alias": "previewContact";
4048
+ "required": false;
4049
+ "isSignal": true;
4050
+ };
4051
+ "previewSendContext": {
4052
+ "alias": "previewSendContext";
4053
+ "required": false;
4054
+ "isSignal": true;
4055
+ };
3555
4056
  "signers": {
3556
4057
  "alias": "signers";
3557
4058
  "required": false;
@@ -3829,6 +4330,8 @@ declare class SendEmailComponent implements OnInit {
3829
4330
  readonly docuSignConnected: import("@angular/core").InputSignal<boolean>;
3830
4331
  /** "Preview Document" button(s) in the Documents section call this; `null` hides them. */
3831
4332
  readonly documentPreview: import("@angular/core").InputSignal<DocumentPreviewHandler | null>;
4333
+ /** The recipient handed to `documentPreview` (second argument): the panel's contact inputs, `null` while all four are blank. */
4334
+ readonly previewContact: import("@angular/core").Signal<DocumentPreviewContact | null>;
3832
4335
  /**
3833
4336
  * Turns on the video settings (Playback, Call-to-Action, Hide reactions, Watch Preview, Remove Video) once a video is attached, starting
3834
4337
  * from these defaults, and makes the video link carry them. `null` (default) = the attached video's plain share link is inserted, as before.
@@ -4214,6 +4717,8 @@ declare class SendTextComponent implements OnInit {
4214
4717
  readonly documentSigningOptions: import("@angular/core").InputSignal<DocumentSigningOptions | null | undefined>;
4215
4718
  /** "Preview Document" button(s) in the Documents section call this; `null` hides them. */
4216
4719
  readonly documentPreview: import("@angular/core").InputSignal<DocumentPreviewHandler | null>;
4720
+ /** The recipient handed to `documentPreview` (second argument): the panel's contact inputs, `null` while all four are blank. */
4721
+ readonly previewContact: import("@angular/core").Signal<DocumentPreviewContact | null>;
4217
4722
  /**
4218
4723
  * Turns on the video settings (Playback, Call-to-Action, Hide reactions, Watch Preview, Remove Video) once a video is attached, starting
4219
4724
  * from these defaults, and makes the video link carry them. `null` (default) = the plain share link is inserted, as before.
@@ -5347,47 +5852,133 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
5347
5852
  "invalidChange": "invalidChange";
5348
5853
  }, never, never, true, never>;
5349
5854
  }
5855
+ /** Why a chosen file was refused. */
5856
+ export type FileRejectReason = 'type' | 'size';
5857
+ /** A refused file with the message the field shows (also emitted by `(fileRejected)`). */
5858
+ export interface FileRejection {
5859
+ file: File;
5860
+ reason: FileRejectReason;
5861
+ message: string;
5862
+ }
5863
+ /** "1.5 MB", "820 KB", "12 B" (binary units, one decimal for MB and above). */
5864
+ export declare function formatFileSize(bytes: number): string;
5865
+ /** True when `file` matches one token of a native `accept` string (`.pdf`, `image/png`, `image/*`). Empty `accept` accepts everything. */
5866
+ export declare function fileMatchesAccept(file: File, accept: string): boolean;
5867
+ /** "PDF", "PNG, JPEG and WEBP" from an `accept` string, for the default type message. */
5868
+ export declare function acceptLabel(accept: string): string;
5350
5869
  /**
5351
5870
  * File picker styled like the other `ui-*` inputs (label, hint, required marker, error, disabled).
5352
5871
  * Value (ngModel / forms) is `File | null`, or `File[]` when `multiple` is set.
5353
5872
  *
5354
5873
  * Set `[showField]="false"` for a picker with no visible field and call `open()` from the host
5355
5874
  * (e.g. an "Attach document" menu action). `(filesSelected)` fires in both modes.
5875
+ *
5876
+ * Built in (all opt-in, nothing changes unless an input is set):
5877
+ * - `clearable`: a Remove button next to the chosen file; `(fileRemoved)` fires after it clears the selection.
5878
+ * - `accept` is enforced on picked AND dropped files (`enforceAccept`, on by default), `maxSize` (bytes) refuses bigger
5879
+ * files. A refused file is never added to the value: the field shows the message (`typeMessage` / `sizeMessage`
5880
+ * override the wording, also in picker-only mode), and `(fileRejected)` emits `{ file, reason, message }`.
5881
+ * - `required` is a real rule: Angular `Validator` + `UiFieldValidity` (`invalid`, `errorMessage`, `invalidChange`,
5882
+ * `showErrors`), like the other inputs. The message shows after the field was used or `[showErrors]="true"`.
5883
+ * - `dropzone`: the field accepts files dropped on it.
5884
+ * - `showDetails`: file size after the name; `preview`: a thumbnail of a chosen image.
5885
+ * - `loading` (+ `loadingText`): a `ui-skeleton` replaces the file name while the host works on the file (scanning, uploading).
5356
5886
  */
5357
- export declare class FileInputComponent implements ControlValueAccessor {
5887
+ export declare class FileInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
5358
5888
  readonly label: import("@angular/core").InputSignal<string>;
5359
5889
  /** Accessible name for a field with no visible label. */
5360
5890
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
5361
5891
  readonly placeholder: import("@angular/core").InputSignal<string>;
5362
5892
  readonly buttonLabel: import("@angular/core").InputSignal<string>;
5363
- /** Native `accept` string, e.g. ".pdf,.png". */
5893
+ /** Native `accept` string, e.g. ".pdf,.png". Also enforced on picked and dropped files unless `enforceAccept` is false. */
5364
5894
  readonly accept: import("@angular/core").InputSignal<string>;
5365
5895
  readonly multiple: import("@angular/core").InputSignal<boolean>;
5896
+ /** A file must be chosen (a real rule: Validator + UiFieldValidity, message shown after use or `showErrors`). */
5366
5897
  readonly required: import("@angular/core").InputSignal<boolean>;
5367
5898
  readonly hint: import("@angular/core").InputSignal<string>;
5899
+ /** Host-provided error message (wins over the built-in ones). Shown under a visible field only. */
5368
5900
  readonly error: import("@angular/core").InputSignal<string>;
5369
5901
  /** false = no visible field; open the picker from the host with `open()`. */
5370
5902
  readonly showField: import("@angular/core").InputSignal<boolean>;
5371
- /** Emits the chosen files (one or many) each time the user picks. */
5903
+ /** Reveal the built-in "required" message now (e.g. after a failed Save click). */
5904
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
5905
+ /** Show a Remove button next to the chosen file. */
5906
+ readonly clearable: import("@angular/core").InputSignal<boolean>;
5907
+ readonly removeLabel: import("@angular/core").InputSignal<string>;
5908
+ /** Largest allowed file in bytes; a bigger file is refused. null = no limit. */
5909
+ readonly maxSize: import("@angular/core").InputSignal<number | null>;
5910
+ /** Refuse files that do not match `accept` (picked or dropped). */
5911
+ readonly enforceAccept: import("@angular/core").InputSignal<boolean>;
5912
+ /** Replaces the built-in "Only PDF files are allowed." message. */
5913
+ readonly typeMessage: import("@angular/core").InputSignal<string>;
5914
+ /** Replaces the built-in "The file must be 5 MB or smaller." message. */
5915
+ readonly sizeMessage: import("@angular/core").InputSignal<string>;
5916
+ /** The field accepts files dropped on it. */
5917
+ readonly dropzone: import("@angular/core").InputSignal<boolean>;
5918
+ /** Show the file size after the name. */
5919
+ readonly showDetails: import("@angular/core").InputSignal<boolean>;
5920
+ /** Show a thumbnail when the chosen file is an image. */
5921
+ readonly preview: import("@angular/core").InputSignal<boolean>;
5922
+ /** The host is working on the file (scanning, uploading): a skeleton replaces the name and Browse / Remove are disabled. */
5923
+ readonly loading: import("@angular/core").InputSignal<boolean>;
5924
+ /** Screen-reader text while `loading` (default "Processing…"). */
5925
+ readonly loadingText: import("@angular/core").InputSignal<string>;
5926
+ /** Emits the chosen (accepted) files (one or many) each time the user picks or drops. */
5372
5927
  readonly filesSelected: import("@angular/core").OutputEmitterRef<File[]>;
5928
+ /** A picked or dropped file was refused (wrong type or too big). */
5929
+ readonly fileRejected: import("@angular/core").OutputEmitterRef<FileRejection>;
5930
+ /** The Remove button cleared the selection. */
5931
+ readonly fileRemoved: import("@angular/core").OutputEmitterRef<void>;
5932
+ /** Emits whenever the field becomes invalid / valid. */
5933
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
5373
5934
  protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
5374
5935
  private readonly _cvaDisabled;
5375
5936
  protected readonly disabled: import("@angular/core").Signal<boolean>;
5376
5937
  protected readonly _files: import("@angular/core").WritableSignal<File[]>;
5377
5938
  protected readonly _inputId: string;
5378
5939
  private readonly fileEl;
5940
+ protected readonly _dragging: import("@angular/core").WritableSignal<boolean>;
5941
+ /** Message of the last refused file ('' when the last pick was fine); shown in every mode. */
5942
+ private readonly _rejection;
5943
+ private readonly _reveal;
5944
+ private readonly _issue;
5945
+ /** True while a required field is empty, the last pick was refused, or the host passed an `[error]`. */
5946
+ readonly invalid: import("@angular/core").Signal<boolean>;
5947
+ /** Message of the first broken built-in rule ('' when valid), shown or not. */
5948
+ readonly errorMessage: import("@angular/core").Signal<string>;
5949
+ /** What the field shows: the host error (visible field only), a refused file, or the revealed built-in message. */
5950
+ protected readonly _shownError: import("@angular/core").Signal<string>;
5379
5951
  protected readonly summary: import("@angular/core").Signal<string>;
5952
+ /** Object URL of the chosen image (single file) while `preview` is on. */
5953
+ protected readonly _previewUrl: import("@angular/core").WritableSignal<string | null>;
5954
+ private _urlToRevoke;
5955
+ private _onValidatorChange;
5380
5956
  protected _onChange: (_: File | File[] | null) => void;
5381
5957
  protected _onTouched: () => void;
5958
+ constructor();
5959
+ private revokePreview;
5960
+ /** Re-run the form control's validation when a rule input changes. */
5961
+ ngOnChanges(): void;
5962
+ validate(_control: AbstractControl): ValidationErrors | null;
5963
+ registerOnValidatorChange(fn: () => void): void;
5382
5964
  /** Opens the native file dialog. */
5383
5965
  open(): void;
5384
- /** Clears the selection (and the native input, so the same file can be picked again). */
5966
+ /** Clears the selection (and the native input, so the same file can be picked again) and any "refused file" message. */
5385
5967
  clear(): void;
5968
+ /** The Remove button: clears, then tells the host. */
5969
+ protected remove(): void;
5386
5970
  writeValue(val: File | File[] | null): void;
5387
5971
  registerOnChange(fn: (v: File | File[] | null) => void): void;
5388
5972
  registerOnTouched(fn: () => void): void;
5389
5973
  setDisabledState(d: boolean): void;
5974
+ protected _touch(): void;
5390
5975
  protected onChange(event: Event): void;
5976
+ protected onDragOver(event: DragEvent): void;
5977
+ protected onDragLeave(event: DragEvent): void;
5978
+ protected onDrop(event: DragEvent): void;
5979
+ private rejectionFor;
5980
+ /** Applies picked / dropped files: refused ones raise the message and `fileRejected`, accepted ones become the value. */
5981
+ private accept$;
5391
5982
  static ɵfac: i0.ɵɵFactoryDeclaration<FileInputComponent, never>;
5392
5983
  static ɵcmp: i0.ɵɵComponentDeclaration<FileInputComponent, "ui-file-input", never, {
5393
5984
  "label": {
@@ -5440,6 +6031,66 @@ export declare class FileInputComponent implements ControlValueAccessor {
5440
6031
  "required": false;
5441
6032
  "isSignal": true;
5442
6033
  };
6034
+ "showErrors": {
6035
+ "alias": "showErrors";
6036
+ "required": false;
6037
+ "isSignal": true;
6038
+ };
6039
+ "clearable": {
6040
+ "alias": "clearable";
6041
+ "required": false;
6042
+ "isSignal": true;
6043
+ };
6044
+ "removeLabel": {
6045
+ "alias": "removeLabel";
6046
+ "required": false;
6047
+ "isSignal": true;
6048
+ };
6049
+ "maxSize": {
6050
+ "alias": "maxSize";
6051
+ "required": false;
6052
+ "isSignal": true;
6053
+ };
6054
+ "enforceAccept": {
6055
+ "alias": "enforceAccept";
6056
+ "required": false;
6057
+ "isSignal": true;
6058
+ };
6059
+ "typeMessage": {
6060
+ "alias": "typeMessage";
6061
+ "required": false;
6062
+ "isSignal": true;
6063
+ };
6064
+ "sizeMessage": {
6065
+ "alias": "sizeMessage";
6066
+ "required": false;
6067
+ "isSignal": true;
6068
+ };
6069
+ "dropzone": {
6070
+ "alias": "dropzone";
6071
+ "required": false;
6072
+ "isSignal": true;
6073
+ };
6074
+ "showDetails": {
6075
+ "alias": "showDetails";
6076
+ "required": false;
6077
+ "isSignal": true;
6078
+ };
6079
+ "preview": {
6080
+ "alias": "preview";
6081
+ "required": false;
6082
+ "isSignal": true;
6083
+ };
6084
+ "loading": {
6085
+ "alias": "loading";
6086
+ "required": false;
6087
+ "isSignal": true;
6088
+ };
6089
+ "loadingText": {
6090
+ "alias": "loadingText";
6091
+ "required": false;
6092
+ "isSignal": true;
6093
+ };
5443
6094
  "_disabledInput": {
5444
6095
  "alias": "disabled";
5445
6096
  "required": false;
@@ -5447,6 +6098,9 @@ export declare class FileInputComponent implements ControlValueAccessor {
5447
6098
  };
5448
6099
  }, {
5449
6100
  "filesSelected": "filesSelected";
6101
+ "fileRejected": "fileRejected";
6102
+ "fileRemoved": "fileRemoved";
6103
+ "invalidChange": "invalidChange";
5450
6104
  }, never, never, true, never>;
5451
6105
  }
5452
6106
  export declare class DateInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
@@ -6522,6 +7176,83 @@ export declare class HintComponent {
6522
7176
  static ɵfac: i0.ɵɵFactoryDeclaration<HintComponent, never>;
6523
7177
  static ɵcmp: i0.ɵɵComponentDeclaration<HintComponent, "ui-hint", never, {}, {}, never, ["*"], true, never>;
6524
7178
  }
7179
+ /** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
7180
+ export declare function iconPath(name: string): string | undefined;
7181
+ /** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
7182
+ export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'view' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call';
7183
+ /**
7184
+ * A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
7185
+ * `iconClick`, and the host does the actual work (delete the row, open a panel, …).
7186
+ *
7187
+ * <ui-icon name="delete" tooltip="Remove line item 1" variant="danger" (iconClick)="removeLineItem(i)" />
7188
+ *
7189
+ * `tooltip` is the text shown on hover / keyboard focus (any length) and, unless `ariaLabel` is set, the name
7190
+ * assistive tech reads — always set it on a clickable icon. An unknown `name` draws nothing.
7191
+ *
7192
+ * `[interactive]="false"` draws just the picture (no button, no click) for an icon that sits next to text or inside another
7193
+ * button — e.g. the arrow in a "Back" button, a bell beside a reminder. It is hidden from assistive tech unless a `tooltip` or `ariaLabel` is set.
7194
+ *
7195
+ * <ui-button><ui-icon name="arrow-left" [interactive]="false" /> Back to Dashboard</ui-button>
7196
+ */
7197
+ export declare class IconComponent {
7198
+ /** Which icon to draw, e.g. `delete`, `edit`, `add`. */
7199
+ readonly name: import("@angular/core").InputSignal<IconName | (string & {})>;
7200
+ /** Hover / keyboard-focus tooltip text, e.g. "Remove line item 1". Any length. Also the accessible name unless `ariaLabel` is set. */
7201
+ readonly tooltip: import("@angular/core").InputSignal<string>;
7202
+ /** Screen-reader name. Leave empty to use `tooltip`; set it only when it should differ. */
7203
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
7204
+ /** Icon size in px. */
7205
+ readonly size: import("@angular/core").InputSignal<number>;
7206
+ readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
7207
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
7208
+ /** false = just the picture (no button, no click) — for an icon beside text or inside another button. */
7209
+ readonly interactive: import("@angular/core").InputSignal<boolean>;
7210
+ /** Fires on click (not while disabled); the host performs the action. */
7211
+ readonly iconClick: import("@angular/core").OutputEmitterRef<MouseEvent>;
7212
+ protected readonly accessibleName: import("@angular/core").Signal<string>;
7213
+ protected readonly path: import("@angular/core").Signal<string | undefined>;
7214
+ protected onClick(event: MouseEvent): void;
7215
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconComponent, never>;
7216
+ static ɵcmp: i0.ɵɵComponentDeclaration<IconComponent, "ui-icon", never, {
7217
+ "name": {
7218
+ "alias": "name";
7219
+ "required": true;
7220
+ "isSignal": true;
7221
+ };
7222
+ "tooltip": {
7223
+ "alias": "tooltip";
7224
+ "required": false;
7225
+ "isSignal": true;
7226
+ };
7227
+ "ariaLabel": {
7228
+ "alias": "ariaLabel";
7229
+ "required": false;
7230
+ "isSignal": true;
7231
+ };
7232
+ "size": {
7233
+ "alias": "size";
7234
+ "required": false;
7235
+ "isSignal": true;
7236
+ };
7237
+ "variant": {
7238
+ "alias": "variant";
7239
+ "required": false;
7240
+ "isSignal": true;
7241
+ };
7242
+ "disabled": {
7243
+ "alias": "disabled";
7244
+ "required": false;
7245
+ "isSignal": true;
7246
+ };
7247
+ "interactive": {
7248
+ "alias": "interactive";
7249
+ "required": false;
7250
+ "isSignal": true;
7251
+ };
7252
+ }, {
7253
+ "iconClick": "iconClick";
7254
+ }, never, never, true, never>;
7255
+ }
6525
7256
  export type ImagePreviewShape = 'circle' | 'rounded';
6526
7257
  export type ImagePreviewSize = 'sm' | 'md' | 'lg';
6527
7258
  export type ImagePreviewPlaceholder = 'person' | 'image';
@@ -7149,6 +7880,9 @@ export declare class RadioMatrixComponent implements ControlValueAccessor, Valid
7149
7880
  * - `<ng-container card-header>`: your own header content, shown under the title (or instead of it when no title is set).
7150
7881
  * - `<ng-container card-header-action>`: buttons or links on the right side of the header.
7151
7882
  * - `showEdit` + `editLabel` + `(editClick)`: the built-in Edit button.
7883
+ * - `background`: the card's background colour (any CSS colour; default white).
7884
+ * - `textColor`: the colour of the title, subtitle, chevron and body text (any CSS colour; default: the normal slate colours). Use it for light text on a dark `background`. Text you colour yourself inside the body keeps its own colour.
7885
+ * - The body has built-in padding (16px 18px, matching the header's 18px side padding); there is no padding input.
7152
7886
  * - `collapsible` (default true): a chevron toggle and a clickable header; `[(expanded)]` is two-way.
7153
7887
  * Without a header, or with `collapsible` false, the body is always open.
7154
7888
  *
@@ -7172,6 +7906,10 @@ export declare class DetailCardComponent {
7172
7906
  readonly titleId: import("@angular/core").InputSignal<string>;
7173
7907
  /** Grey line under the title. */
7174
7908
  readonly subtitle: import("@angular/core").InputSignal<string>;
7909
+ /** Card background as any CSS colour (`#f8fafc`, `var(--surface)` …). Empty = white. */
7910
+ readonly background: import("@angular/core").InputSignal<string>;
7911
+ /** Text colour as any CSS colour (`#fff`, `var(--on-dark)` …). Empty = the default colours. Colours the title, subtitle, chevron and body text. */
7912
+ readonly textColor: import("@angular/core").InputSignal<string>;
7175
7913
  /** false = no header at all (no title, edit button, toggle or divider): the card is only the body, always open. */
7176
7914
  readonly showHeader: import("@angular/core").InputSignal<boolean>;
7177
7915
  /** Chevron toggle + clickable header. false = the body is always open. */
@@ -7209,6 +7947,16 @@ export declare class DetailCardComponent {
7209
7947
  "required": false;
7210
7948
  "isSignal": true;
7211
7949
  };
7950
+ "background": {
7951
+ "alias": "background";
7952
+ "required": false;
7953
+ "isSignal": true;
7954
+ };
7955
+ "textColor": {
7956
+ "alias": "textColor";
7957
+ "required": false;
7958
+ "isSignal": true;
7959
+ };
7212
7960
  "showHeader": {
7213
7961
  "alias": "showHeader";
7214
7962
  "required": false;
@@ -7278,4 +8026,222 @@ export declare class DividerComponent {
7278
8026
  };
7279
8027
  }, {}, never, never, true, never>;
7280
8028
  }
8029
+ /**
8030
+ * Wraps a block of form controls (a settings page, a configuration card) so a view-only user can look at the current
8031
+ * values but change nothing. While `readOnly` is true the wrapper's native `<fieldset>` is `disabled`, and the browser
8032
+ * disables every native form control inside it: text inputs, checkboxes, selects, textareas, radios and the `<button>`
8033
+ * rendered by `ui-button`, plus the native controls inside the `ui-*` inputs.
8034
+ *
8035
+ * **Default: `readOnly` is false.** With no input nothing is locked and every control is fully editable. The wrapper only
8036
+ * locks when the host passes `[readOnly]="true"` (typically `perm() !== 'full'`). Flipping it live re-enables / disables
8037
+ * the same projected DOM nodes; values, `ngModel` state and focus targets are preserved.
8038
+ *
8039
+ * Limits (native `<fieldset disabled>` semantics):
8040
+ * - Only NATIVE form controls are disabled. Non-native clickable things (divs with click handlers, links, drag handles,
8041
+ * `ui-data-table` toolbars and row menus) are NOT affected: hide or guard them in the host.
8042
+ * - A `ui-data-table` has its own `[permission]` input. Keep tables outside the wrapper or use that input.
8043
+ * - Nesting: a nested wrapper with `readOnly=false` inside a locked wrapper stays disabled, because a disabled
8044
+ * ancestor fieldset always disables its descendants. A nested wrapper cannot "unlock" a region.
8045
+ *
8046
+ * Layout: the fieldset is reset (border 0, margin 0, padding 0, min-width 0) and is a plain flex column, not
8047
+ * `display: contents` (unreliable on `<fieldset>` in some browsers). Children therefore lay out as direct children;
8048
+ * set `gap` when the parent spaced them with a flex gap.
8049
+ *
8050
+ * Accessibility: optional `ariaLabel` names the group; optional `reason` ("You have view-only access") is rendered as
8051
+ * visually-hidden text linked via `aria-describedby`, only while locked.
8052
+ *
8053
+ * Usage: `<ui-readonly-fieldset [readOnly]="perm() !== 'full'" gap="20px"> ...controls... </ui-readonly-fieldset>`
8054
+ */
8055
+ export declare class ReadonlyFieldsetComponent {
8056
+ /** Lock every native control inside. Default false: nothing is locked. */
8057
+ readonly readOnly: import("@angular/core").InputSignal<boolean>;
8058
+ /** CSS `gap` between the children (default none). */
8059
+ readonly gap: import("@angular/core").InputSignal<string>;
8060
+ /** Optional accessible name for the group. */
8061
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
8062
+ /** Optional explanation announced while locked (visually hidden), e.g. "You have view-only access". */
8063
+ readonly reason: import("@angular/core").InputSignal<string>;
8064
+ protected readonly _reasonId: string;
8065
+ protected readonly _showReason: import("@angular/core").Signal<boolean>;
8066
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReadonlyFieldsetComponent, never>;
8067
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReadonlyFieldsetComponent, "ui-readonly-fieldset", never, {
8068
+ "readOnly": {
8069
+ "alias": "readOnly";
8070
+ "required": false;
8071
+ "isSignal": true;
8072
+ };
8073
+ "gap": {
8074
+ "alias": "gap";
8075
+ "required": false;
8076
+ "isSignal": true;
8077
+ };
8078
+ "ariaLabel": {
8079
+ "alias": "ariaLabel";
8080
+ "required": false;
8081
+ "isSignal": true;
8082
+ };
8083
+ "reason": {
8084
+ "alias": "reason";
8085
+ "required": false;
8086
+ "isSignal": true;
8087
+ };
8088
+ }, {}, never, ["*"], true, never>;
8089
+ }
8090
+ /** A preset swatch offered under the field. `label` is its accessible name. */
8091
+ export interface ColorPreset {
8092
+ value: string;
8093
+ label: string;
8094
+ }
8095
+ /**
8096
+ * Normalises a CSS hex colour: `#fff` / `FFF` -> `#ffffff`, `#RRGGBB` -> lower case. With `allowAlpha`, `#rrggbbaa`
8097
+ * is accepted and kept at 8 digits (shorthand `#rgba` is never accepted). Returns null for anything else
8098
+ * (named colours, `rgb()`, wrong lengths, non-hex digits). The leading `#` is optional on input.
8099
+ */
8100
+ export declare function normalizeHexColor(value: string | null | undefined, allowAlpha?: boolean): string | null;
8101
+ /**
8102
+ * Colour input: ControlValueAccessor over a string holding a CSS hex colour. A swatch opens the operating system's
8103
+ * colour picker (native `<input type="color">`) and a text field next to it shows / edits the hex; both stay in sync.
8104
+ *
8105
+ * <ui-color-input label="Brand colour" [(ngModel)]="brand" />
8106
+ * <ui-color-input label="Accent" [presets]="presets" [allowAlpha]="true" [formControl]="accent" />
8107
+ *
8108
+ * Value contract
8109
+ * - A valid colour is emitted normalised to lower-case `#rrggbb` (`#FFF` -> `#ffffff`; 8-digit `#rrggbbaa` only with
8110
+ * `allowAlpha`, kept at 8 digits). The user may type with or without the leading `#`; the control prepends it.
8111
+ * - Text the user typed that is not a valid colour is emitted as typed (with `#` prepended, `''` when cleared) so the host
8112
+ * sees what the user entered; the control is then invalid ("Enter a hex colour like #3b82f6.") and the form control gets
8113
+ * the `color` error. While typing, the text is not rewritten (`#fff` is emitted as `#ffffff` but stays `#fff` on screen)
8114
+ * and is normalised on blur.
8115
+ * - A value WRITTEN BY THE HOST (`writeValue` / `[ngModel]` / `[formControl]`) is never flagged as an invalid colour, even
8116
+ * when it is not a hex (`red`, `#fff8`, a legacy value), until the user changes it, so legacy data never blocks Save.
8117
+ * (Required is still checked for an empty value.) The native picker gets `#000000` for a non-hex value so it never throws.
8118
+ * - Picking in the native picker with an 8-digit value and `allowAlpha` keeps the existing alpha digits.
8119
+ *
8120
+ * Validity API (same as the other ui inputs): `Validator` (error keys `required`, `color`), signals `invalid` /
8121
+ * `errorMessage`, `invalidChange` output, `UiFieldValidity` token. Messages show after blur or while
8122
+ * `[showErrors]="true"`; a host `[error]` always wins. Disabled controls are never invalid.
8123
+ *
8124
+ * Cross-browser: the native swatch is styled with `-webkit-appearance` and the `::-webkit-color-swatch` / `::-moz-color-swatch`
8125
+ * pseudo-elements and sits invisibly over our own preview square, so it looks the same in Chrome, Edge, Firefox and Safari.
8126
+ * Preset swatches are real `<button>`s (Enter / Space work natively, `aria-pressed` marks the selected one).
8127
+ */
8128
+ export declare class ColorInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
8129
+ readonly label: import("@angular/core").InputSignal<string>;
8130
+ /** Accessible name for a field with no visible label. */
8131
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
8132
+ readonly placeholder: import("@angular/core").InputSignal<string>;
8133
+ readonly required: import("@angular/core").InputSignal<boolean>;
8134
+ readonly hint: import("@angular/core").InputSignal<string>;
8135
+ /** Host error message; always wins over the built-in message. */
8136
+ readonly error: import("@angular/core").InputSignal<string>;
8137
+ /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
8138
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
8139
+ /** Accept (and keep) 8-digit `#rrggbbaa` values. */
8140
+ readonly allowAlpha: import("@angular/core").InputSignal<boolean>;
8141
+ /** Optional row of preset swatches. */
8142
+ readonly presets: import("@angular/core").InputSignal<ColorPreset[]>;
8143
+ /** Emits whenever the field becomes invalid / valid. */
8144
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
8145
+ protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
8146
+ private readonly _cvaDisabled;
8147
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
8148
+ /** Current model value (what the form control holds). */
8149
+ private readonly _model;
8150
+ /** Text shown in the text field. */
8151
+ protected readonly _text: import("@angular/core").WritableSignal<string>;
8152
+ /** True once the user changed the value; host-written values are not format-checked before that. */
8153
+ private readonly _edited;
8154
+ private readonly _reveal;
8155
+ private readonly _issue;
8156
+ readonly invalid: import("@angular/core").Signal<boolean>;
8157
+ readonly errorMessage: import("@angular/core").Signal<string>;
8158
+ protected readonly _activeError: import("@angular/core").Signal<string>;
8159
+ private readonly _valid;
8160
+ /** Colour of the preview square: the value when it is a usable hex, otherwise transparent. */
8161
+ protected readonly _swatchColor: import("@angular/core").Signal<string>;
8162
+ /** Value for the native picker: always `#rrggbb`. */
8163
+ protected readonly _nativeValue: import("@angular/core").Signal<string>;
8164
+ private readonly _uid;
8165
+ protected readonly _textId: string;
8166
+ protected readonly _nativeId: string;
8167
+ protected readonly _descId: string;
8168
+ private _onChange;
8169
+ private _onTouched;
8170
+ private _onValidatorChange;
8171
+ constructor();
8172
+ /** Re-run the form control's validation when a rule input (required, allowAlpha, ...) changes. */
8173
+ ngOnChanges(): void;
8174
+ writeValue(val: string | null): void;
8175
+ registerOnChange(fn: (v: string) => void): void;
8176
+ registerOnTouched(fn: () => void): void;
8177
+ registerOnValidatorChange(fn: () => void): void;
8178
+ setDisabledState(d: boolean): void;
8179
+ validate(control: AbstractControl): ValidationErrors | null;
8180
+ protected onTextInput(event: Event): void;
8181
+ protected onNativeInput(event: Event): void;
8182
+ protected selectPreset(p: ColorPreset): void;
8183
+ protected _isSelected(p: ColorPreset): boolean;
8184
+ protected _presetColor(p: ColorPreset): string;
8185
+ protected onTextBlur(): void;
8186
+ /** Blur of the native picker only marks the field touched; it never rewrites the text. */
8187
+ protected onNativeBlur(): void;
8188
+ private _touch;
8189
+ private _commit;
8190
+ private _check;
8191
+ static ɵfac: i0.ɵɵFactoryDeclaration<ColorInputComponent, never>;
8192
+ static ɵcmp: i0.ɵɵComponentDeclaration<ColorInputComponent, "ui-color-input", never, {
8193
+ "label": {
8194
+ "alias": "label";
8195
+ "required": false;
8196
+ "isSignal": true;
8197
+ };
8198
+ "ariaLabel": {
8199
+ "alias": "ariaLabel";
8200
+ "required": false;
8201
+ "isSignal": true;
8202
+ };
8203
+ "placeholder": {
8204
+ "alias": "placeholder";
8205
+ "required": false;
8206
+ "isSignal": true;
8207
+ };
8208
+ "required": {
8209
+ "alias": "required";
8210
+ "required": false;
8211
+ "isSignal": true;
8212
+ };
8213
+ "hint": {
8214
+ "alias": "hint";
8215
+ "required": false;
8216
+ "isSignal": true;
8217
+ };
8218
+ "error": {
8219
+ "alias": "error";
8220
+ "required": false;
8221
+ "isSignal": true;
8222
+ };
8223
+ "showErrors": {
8224
+ "alias": "showErrors";
8225
+ "required": false;
8226
+ "isSignal": true;
8227
+ };
8228
+ "allowAlpha": {
8229
+ "alias": "allowAlpha";
8230
+ "required": false;
8231
+ "isSignal": true;
8232
+ };
8233
+ "presets": {
8234
+ "alias": "presets";
8235
+ "required": false;
8236
+ "isSignal": true;
8237
+ };
8238
+ "_disabledInput": {
8239
+ "alias": "disabled";
8240
+ "required": false;
8241
+ "isSignal": true;
8242
+ };
8243
+ }, {
8244
+ "invalidChange": "invalidChange";
8245
+ }, never, never, true, never>;
8246
+ }
7281
8247
  export type { CreateDocumentRequestBody, DocuSignSendBody, DocumentSentInfo, DocumentSentMessage, DocumentsPayloadExtras, ExistingEnvelopeSendBody, SendDocumentsPayload, SendEmailPayload, SendTextPayload, VideoDefaults, VideoLinkOptions };