@underlayerdev/ui 0.0.1

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,1464 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { AfterViewInit, OnDestroy, ElementRef, PipeTransform } from '@angular/core';
3
+ import * as i1 from '@angular/cdk/accordion';
4
+ import { CdkAccordionItem } from '@angular/cdk/accordion';
5
+ import { FormValueControl, WithOptionalField, ValidationError, FormCheckboxControl } from '@angular/forms/signals';
6
+ import Splide, { Options } from '@splidejs/splide';
7
+ import { CurrencyPipe } from '@angular/common';
8
+
9
+ /**
10
+ * AccordionItemComponent is a standalone Angular component that extends CdkAccordionItem.
11
+ * It represents an item within an accordion, providing configurable expansion behavior
12
+ * and accessibility features.
13
+ */
14
+ declare class AccordionItemComponent {
15
+ cdkAccordionItem: CdkAccordionItem;
16
+ private readonly elementRef;
17
+ /**
18
+ * Stable ID for the content region, used for aria-controls linkage.
19
+ */
20
+ readonly contentId: string;
21
+ /**
22
+ * Stable ID for the trigger button, used for aria-labelledby linkage.
23
+ */
24
+ readonly triggerId: string;
25
+ onToggle(): void;
26
+ onKeydown(event: KeyboardEvent): void;
27
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionItemComponent, never>;
28
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionItemComponent, "pe-accordion-item", never, {}, {}, never, ["[pe-accordion-icon]", "[pe-accordion-label]", "[pe-accordion-status]", "[pe-accordion-content]"], true, [{ directive: typeof i1.CdkAccordionItem; inputs: { "expanded": "expanded"; "disabled": "disabled"; }; outputs: { "closed": "closed"; "opened": "opened"; "destroyed": "destroyed"; "expandedChange": "expandedChange"; }; }]>;
29
+ }
30
+ /**
31
+ * AccordionComponent is a standalone Angular component that acts as a container
32
+ * for multiple AccordionItemComponents. It provides configuration options for
33
+ * multi-expansion behavior and manages the state of its child accordion items.
34
+ */
35
+ declare class AccordionComponent implements AfterViewInit {
36
+ readonly showDivider: _angular_core.InputSignal<boolean>;
37
+ readonly multi: _angular_core.InputSignal<boolean>;
38
+ private readonly destroyRef;
39
+ private readonly accordionItems;
40
+ ngAfterViewInit(): void;
41
+ /**
42
+ * Sets up the single expansion logic to ensure only one item is expanded at a time
43
+ * when multi mode is disabled.
44
+ */
45
+ private setupSingleExpansionLogic;
46
+ /**
47
+ * Handles expansion changes and manages single-expansion behavior.
48
+ * @param changedItem - The accordion item that changed
49
+ * @param expanded - Whether the item is now expanded
50
+ * @param allItems - Array of all accordion items
51
+ */
52
+ private handleExpansionChange;
53
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionComponent, never>;
54
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionComponent, "pe-accordion", never, { "showDivider": { "alias": "showDivider"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; }, {}, ["accordionItems"], ["*"], true, never>;
55
+ }
56
+
57
+ /**
58
+ * A code display component that shows code with automatic line numbering.
59
+ * Features a clean two-column layout following PE design guidelines.
60
+ *
61
+ * @example
62
+ * <pe-area-code
63
+ * [content]="codeContent"
64
+ * [showLineNumbers]="true"
65
+ * />
66
+ */
67
+ declare class AreaCodeComponent {
68
+ readonly content: _angular_core.InputSignal<string>;
69
+ readonly showLineNumbers: _angular_core.InputSignal<boolean>;
70
+ readonly maxHeight: _angular_core.InputSignal<string | null>;
71
+ readonly lines: _angular_core.Signal<string[]>;
72
+ readonly lineCount: _angular_core.Signal<number>;
73
+ readonly lineNumbers: _angular_core.Signal<number[]>;
74
+ readonly codeId: string;
75
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AreaCodeComponent, never>;
76
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AreaCodeComponent, "pe-area-code", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "showLineNumbers": { "alias": "showLineNumbers"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
77
+ }
78
+
79
+ type UiSize = 'sm' | 'md' | 'lg' | 'xl';
80
+ type UiCheckboxSize = 'default' | 'sm';
81
+ type UiTheme = 'fill-purple' | 'fill-white' | 'fill-yellow' | 'fill-red' | 'transparent-purple' | 'transparent-white' | 'transparent-red' | 'transparent-black' | 'ghost-purple' | 'ghost-white' | 'ghost-red' | 'ghost-green' | 'outline-white' | 'outline-purple' | 'outline-red' | 'outline-green';
82
+
83
+ type IconSize$1 = '5' | '6' | '7' | '8';
84
+ /**
85
+ * A reusable avatar component that displays user images, initials, or icons.
86
+ * Supports multiple sizes and fallback options when an image is not available.
87
+ * @example
88
+ * <pe-avatar size="md" [src]="userImageUrl" [initials]="'JD'" />
89
+ */
90
+ declare class AvatarComponent {
91
+ /** The size of the avatar */
92
+ size: _angular_core.InputSignal<UiSize>;
93
+ /** The image source URL */
94
+ src: _angular_core.InputSignal<string | undefined>;
95
+ /** Fallback initials to display when image is not available */
96
+ initials: _angular_core.InputSignal<string | undefined>;
97
+ /** Fallback icon to display when image and initials are not available */
98
+ icon: _angular_core.InputSignal<string | undefined>;
99
+ /** Alt text for the avatar image */
100
+ alt: _angular_core.InputSignal<string>;
101
+ /** Show a skeleton placeholder instead of content while loading. */
102
+ loading: _angular_core.InputSignal<boolean>;
103
+ /** Internal signal to track image loading errors */
104
+ protected readonly imageError: _angular_core.WritableSignal<boolean>;
105
+ /** Computed icon size based on avatar size */
106
+ readonly iconSize: _angular_core.Signal<IconSize$1>;
107
+ constructor();
108
+ /** Handles image loading errors */
109
+ protected handleImageError(): void;
110
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarComponent, never>;
111
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarComponent, "pe-avatar", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
112
+ }
113
+
114
+ /** Icon size keys from design tokens (iconography.font.size). */
115
+ type IconSize = '4' | '5' | '6' | '7' | '8' | '10' | '12' | '16' | '24' | '32';
116
+ /** Icon weight keys from design tokens (iconography.font.weight). */
117
+ type IconWeight = 'medium' | 'bold';
118
+ /** Icon name / glyph key from design tokens (content['icon-glyph']). Valid values match token keys. */
119
+ type IconName = string;
120
+ declare class IconComponent {
121
+ size: _angular_core.InputSignal<IconSize>;
122
+ weight: _angular_core.InputSignal<IconWeight>;
123
+ icon: _angular_core.InputSignal<string>;
124
+ readonly hostClasses: _angular_core.Signal<string>;
125
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IconComponent, never>;
126
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<IconComponent, "pe-icon", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "weight": { "alias": "weight"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
127
+ }
128
+
129
+ interface AvatarData {
130
+ src?: string;
131
+ initials?: string;
132
+ icon?: IconName;
133
+ alt?: string;
134
+ }
135
+ /**
136
+ * A reusable avatar group component that displays multiple avatars with overflow handling.
137
+ * Supports maximum visible count and shows a "+X" indicator for remaining avatars.
138
+ * @example
139
+ * <pe-avatar-group [avatars]="userAvatars" [maxVisible]="3" size="md" />
140
+ */
141
+ declare class AvatarGroupComponent {
142
+ /** Array of avatar data to display */
143
+ avatars: _angular_core.InputSignal<AvatarData[]>;
144
+ /** The size of all avatars in the group */
145
+ size: _angular_core.InputSignal<UiSize>;
146
+ /** Maximum number of avatars to display before showing overflow indicator */
147
+ maxVisible: _angular_core.InputSignal<number | null>;
148
+ /** Whether avatars should overlap (stacked) or have spacing between them */
149
+ stacked: _angular_core.InputSignal<boolean>;
150
+ /** Computed list of visible avatars */
151
+ readonly visibleAvatars: _angular_core.Signal<AvatarData[]>;
152
+ /** Computed count of remaining avatars not shown */
153
+ readonly remainingCount: _angular_core.Signal<number>;
154
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarGroupComponent, never>;
155
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarGroupComponent, "pe-avatar-group", never, { "avatars": { "alias": "avatars"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "stacked": { "alias": "stacked"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
156
+ }
157
+
158
+ interface BreadcrumbItem {
159
+ label: string;
160
+ href?: string;
161
+ routerLink?: string | any[];
162
+ icon?: string;
163
+ }
164
+ type BreadcrumbSeparator = 'chevron_right' | 'slash' | 'dot';
165
+ /**
166
+ * Breadcrumb component for displaying navigation hierarchy.
167
+ * Supports responsive collapsing on mobile devices and customizable separators.
168
+ *
169
+ * @example
170
+ * ```html
171
+ * <pe-breadcrumb
172
+ * [items]="[
173
+ * { label: 'Home', href: '/' },
174
+ * { label: 'Products', href: '/products' },
175
+ * { label: 'Current Page' }
176
+ * ]"
177
+ * />
178
+ * ```
179
+ */
180
+ declare class BreadcrumbComponent {
181
+ /** Array of breadcrumb items to display */
182
+ items: _angular_core.InputSignal<BreadcrumbItem[]>;
183
+ /** Separator type between breadcrumb items */
184
+ separator: _angular_core.InputSignal<BreadcrumbSeparator>;
185
+ /** Maximum number of items to show before collapsing (for responsive behavior) */
186
+ maxItems: _angular_core.InputSignal<number | undefined>;
187
+ /** Check if an item is the last item */
188
+ isLastItem(index: number): boolean;
189
+ /** Check if an item should be shown on mobile (first, last, or within maxItems) */
190
+ shouldShowOnMobile(index: number): boolean;
191
+ /** Check if ellipsis should be shown on mobile */
192
+ shouldShowEllipsisOnMobile(): boolean;
193
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbComponent, never>;
194
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BreadcrumbComponent, "pe-breadcrumb", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
195
+ }
196
+
197
+ /**
198
+ * A reusable button component that supports various themes, sizes, and states.
199
+ * @example
200
+ * <uds-button size="md" theme="fill-purple">Click me</uds-button>
201
+ */
202
+ declare class ButtonComponent {
203
+ /** The size of the button */
204
+ size: _angular_core.InputSignal<UiSize>;
205
+ /** The visual theme of the button */
206
+ theme: _angular_core.InputSignal<UiTheme>;
207
+ /** Whether the button only contains an icon */
208
+ iconOnly: _angular_core.InputSignal<boolean>;
209
+ /** Whether the button content should be stacked vertically (only applies to lg size) */
210
+ vertical: _angular_core.InputSignal<boolean>;
211
+ /** Whether the button is disabled */
212
+ disabled: _angular_core.InputSignal<boolean>;
213
+ /** The button type attribute */
214
+ type: _angular_core.InputSignal<"button" | "submit" | "reset">;
215
+ /** Optional aria-label for accessibility */
216
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
217
+ /** Click event emitter with proper type safety */
218
+ buttonClick: _angular_core.OutputEmitterRef<MouseEvent>;
219
+ /** Handles the click event and prevents it if button is disabled */
220
+ protected handleClick(event: MouseEvent): void;
221
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
222
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "pe-button", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "vertical": { "alias": "vertical"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "buttonClick": "buttonClick"; }, never, ["*"], true, never>;
223
+ }
224
+
225
+ type CalendarMode = 'date' | 'time' | 'datetime';
226
+ interface CalendarDay {
227
+ date: Date;
228
+ isCurrentMonth: boolean;
229
+ isToday: boolean;
230
+ isSelected: boolean;
231
+ isDisabled: boolean;
232
+ }
233
+ interface TimeSelection {
234
+ hour: number;
235
+ minute: number;
236
+ }
237
+ /**
238
+ * Calendar component. Implements FormValueControl&lt;Date | null&gt; for Signal Forms [formField].
239
+ * Use [(value)] or [formField]="myForm().date". Form model field should be Date | null.
240
+ */
241
+ declare class CalendarComponent implements FormValueControl<Date | null> {
242
+ readonly mode: _angular_core.InputSignal<CalendarMode>;
243
+ readonly value: _angular_core.ModelSignal<Date | null>;
244
+ readonly size: _angular_core.InputSignal<UiSize>;
245
+ readonly error: _angular_core.InputSignal<boolean>;
246
+ readonly disabled: _angular_core.InputSignal<boolean>;
247
+ readonly readOnly: _angular_core.InputSignal<boolean>;
248
+ readonly required: _angular_core.InputSignal<boolean>;
249
+ readonly placeholder: _angular_core.InputSignal<string>;
250
+ readonly label: _angular_core.InputSignal<string | null>;
251
+ readonly helperText: _angular_core.InputSignal<string | null>;
252
+ readonly errorText: _angular_core.InputSignal<string | null>;
253
+ readonly minDate: _angular_core.InputSignal<Date | null>;
254
+ readonly maxDate: _angular_core.InputSignal<Date | null>;
255
+ readonly minTime: _angular_core.InputSignal<Date | null>;
256
+ readonly maxTime: _angular_core.InputSignal<Date | null>;
257
+ readonly locale: _angular_core.InputSignal<string>;
258
+ readonly showCalendarIcon: _angular_core.InputSignal<boolean>;
259
+ readonly invalid: _angular_core.InputSignal<boolean>;
260
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
261
+ protected readonly ids: {
262
+ controlId: string;
263
+ helperId: string;
264
+ errorId: string;
265
+ };
266
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
267
+ readonly currentMonth: _angular_core.WritableSignal<Date>;
268
+ readonly selectedTime: _angular_core.WritableSignal<TimeSelection | null>;
269
+ readonly buttonSize: _angular_core.Signal<UiSize>;
270
+ readonly iconSize: _angular_core.Signal<IconSize>;
271
+ readonly defaultPlaceholder: _angular_core.Signal<string>;
272
+ readonly displayValue: _angular_core.Signal<string>;
273
+ protected readonly hasError: _angular_core.Signal<boolean>;
274
+ protected readonly resolvedErrorText: _angular_core.Signal<string | null>;
275
+ readonly describedBy: _angular_core.Signal<string | undefined>;
276
+ readonly calendarDays: _angular_core.Signal<CalendarDay[]>;
277
+ readonly monthYearLabel: _angular_core.Signal<string>;
278
+ readonly hourOptions: _angular_core.Signal<number[]>;
279
+ readonly minuteOptions: _angular_core.Signal<number[]>;
280
+ readonly selectedHour: _angular_core.Signal<number>;
281
+ readonly selectedMinute: _angular_core.Signal<number>;
282
+ readonly valueChange: _angular_core.OutputEmitterRef<Date | null>;
283
+ readonly opened: _angular_core.OutputEmitterRef<void>;
284
+ readonly closed: _angular_core.OutputEmitterRef<void>;
285
+ constructor();
286
+ /**
287
+ * Closes the CDK menu by simulating an Escape key press.
288
+ * This lets the CDK handle all focus and cleanup logic.
289
+ */
290
+ private closeMenuViaEscape;
291
+ isDateDisabled(date: Date): boolean;
292
+ isTimeDisabled(hour: number, minute: number): boolean;
293
+ selectDate(date: Date): void;
294
+ selectTime(hour: number, minute: number): void;
295
+ previousMonth(): void;
296
+ nextMonth(): void;
297
+ selectToday(): void;
298
+ clear(): void;
299
+ open(): void;
300
+ close(): void;
301
+ onMenuOpened(): void;
302
+ onMenuClosed(): void;
303
+ focus(): void;
304
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarComponent, never>;
305
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarComponent, "pe-calendar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "showCalendarIcon": { "alias": "showCalendarIcon"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
306
+ }
307
+
308
+ type CardDirection = 'horizontal' | 'vertical';
309
+ type CardCaptionSize = 'default' | 'sm';
310
+ type ActionsDistribution = 'default' | 'equal';
311
+ type MediaAspectRatio = 'default' | 'square' | 'portrait';
312
+ declare class CardComponent {
313
+ focused: _angular_core.InputSignalWithTransform<boolean, boolean>;
314
+ disabled: _angular_core.InputSignalWithTransform<boolean, boolean>;
315
+ cardDirection: _angular_core.InputSignal<CardDirection>;
316
+ cardCaptionSize: _angular_core.InputSignal<CardCaptionSize>;
317
+ footerDist: _angular_core.InputSignal<ActionsDistribution>;
318
+ mediaAspectRatio: _angular_core.InputSignal<MediaAspectRatio>;
319
+ mediaBlur: _angular_core.InputSignalWithTransform<boolean, boolean>;
320
+ mediaGrayscale: _angular_core.InputSignalWithTransform<boolean, boolean>;
321
+ cardCaption: _angular_core.InputSignal<string>;
322
+ cardTitle: _angular_core.InputSignal<string>;
323
+ cardTitleSingleLine: _angular_core.InputSignalWithTransform<boolean, boolean>;
324
+ cardSubtitle: _angular_core.InputSignal<string>;
325
+ cardSubtitleSingleLine: _angular_core.InputSignalWithTransform<boolean, boolean>;
326
+ loading: _angular_core.InputSignalWithTransform<boolean, boolean>;
327
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardComponent, never>;
328
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "pe-card", never, { "focused": { "alias": "focused"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "cardDirection": { "alias": "cardDirection"; "required": false; "isSignal": true; }; "cardCaptionSize": { "alias": "cardCaptionSize"; "required": false; "isSignal": true; }; "footerDist": { "alias": "footerDist"; "required": false; "isSignal": true; }; "mediaAspectRatio": { "alias": "mediaAspectRatio"; "required": false; "isSignal": true; }; "mediaBlur": { "alias": "mediaBlur"; "required": false; "isSignal": true; }; "mediaGrayscale": { "alias": "mediaGrayscale"; "required": false; "isSignal": true; }; "cardCaption": { "alias": "cardCaption"; "required": false; "isSignal": true; }; "cardTitle": { "alias": "cardTitle"; "required": false; "isSignal": true; }; "cardTitleSingleLine": { "alias": "cardTitleSingleLine"; "required": false; "isSignal": true; }; "cardSubtitle": { "alias": "cardSubtitle"; "required": false; "isSignal": true; }; "cardSubtitleSingleLine": { "alias": "cardSubtitleSingleLine"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, ["[udsCardMedia]", "[udsCardMediaOverlay]", "[udsCardMediaAction]", "[udsCardFooter]"], true, never>;
329
+ }
330
+
331
+ declare class CarouselItemComponent {
332
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselItemComponent, never>;
333
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CarouselItemComponent, "pe-carousel-item", never, {}, {}, never, ["*"], true, never>;
334
+ }
335
+ declare class CarouselComponent implements AfterViewInit, OnDestroy {
336
+ options: _angular_core.InputSignal<Options>;
337
+ autoMount: _angular_core.InputSignal<boolean>;
338
+ mounted: _angular_core.OutputEmitterRef<Splide>;
339
+ private carousel;
340
+ private items;
341
+ private instance;
342
+ constructor();
343
+ ngAfterViewInit(): void;
344
+ ngOnDestroy(): void;
345
+ getInstance(): Splide | null;
346
+ goNext(): void;
347
+ goPrev(): void;
348
+ goTo(index: number): void;
349
+ mount(): void;
350
+ private init;
351
+ private updateCarouselOnItemsChange;
352
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselComponent, never>;
353
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CarouselComponent, "pe-carousel", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "autoMount": { "alias": "autoMount"; "required": false; "isSignal": true; }; }, { "mounted": "mounted"; }, ["items"], ["*"], true, never>;
354
+ }
355
+
356
+ type CheckboxZoneType = 'none' | 'accessible' | 'visible' | 'checked-visible';
357
+ /**
358
+ * Checkbox component. Implements FormCheckboxControl for Signal Forms [formField].
359
+ * Use [(checked)] or [formField]="myForm().acceptTerms". No value property.
360
+ * Uses shared form field label and helper for alignment with input, textarea, radio-group.
361
+ */
362
+ declare class CheckboxComponent implements FormCheckboxControl {
363
+ checked: _angular_core.ModelSignal<boolean>;
364
+ disabled: _angular_core.ModelSignal<boolean>;
365
+ indeterminate: _angular_core.ModelSignal<boolean>;
366
+ zone: _angular_core.InputSignal<CheckboxZoneType>;
367
+ size: _angular_core.InputSignal<UiCheckboxSize>;
368
+ label: _angular_core.InputSignal<string | null>;
369
+ helperText: _angular_core.InputSignal<string | null>;
370
+ required: _angular_core.InputSignal<boolean>;
371
+ error: _angular_core.InputSignal<boolean>;
372
+ errorText: _angular_core.InputSignal<string | null>;
373
+ invalid: _angular_core.InputSignal<boolean>;
374
+ errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
375
+ protected readonly ids: {
376
+ controlId: string;
377
+ helperId: string;
378
+ errorId: string;
379
+ };
380
+ protected readonly hasError: _angular_core.Signal<boolean>;
381
+ protected readonly resolvedErrorText: _angular_core.Signal<string | null>;
382
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
383
+ onChange(event: Event): void;
384
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
385
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "pe-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "zone": { "alias": "zone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "disabled": "disabledChange"; "indeterminate": "indeterminateChange"; }, never, ["*"], true, never>;
386
+ }
387
+
388
+ type CollapseVariant = 'text' | 'icon';
389
+ /**
390
+ * A collapsible content component that supports both text and icon variants.
391
+ * Uses CSS transitions for smooth animations and provides accessibility features.
392
+ *
393
+ * @example
394
+ * ```html
395
+ * <pe-collapse [maxHeight]="300" variant="text">
396
+ * <div>Collapsible content here</div>
397
+ * </pe-collapse>
398
+ * ```
399
+ */
400
+ declare class CollapseComponent implements AfterViewInit {
401
+ private readonly destroyRef;
402
+ content: ElementRef<HTMLDivElement>;
403
+ /**
404
+ * The visual variant of the collapse toggle.
405
+ * @default 'text'
406
+ */
407
+ variant: _angular_core.InputSignal<CollapseVariant>;
408
+ /**
409
+ * Controls the collapsed state of the component.
410
+ * @default true
411
+ */
412
+ collapsed: _angular_core.ModelSignal<boolean>;
413
+ /**
414
+ * Maximum height of the content when collapsed.
415
+ * @default 200
416
+ */
417
+ maxHeight: _angular_core.InputSignal<number>;
418
+ /**
419
+ * Custom label for the expand action.
420
+ * @default 'See more'
421
+ */
422
+ expandLabel: _angular_core.InputSignal<string>;
423
+ /**
424
+ * Custom label for the collapse action.
425
+ * @default 'See less'
426
+ */
427
+ collapseLabel: _angular_core.InputSignal<string>;
428
+ /** Current full height of the content */
429
+ fullHeight: _angular_core.WritableSignal<number>;
430
+ /** Whether the content is collapsible based on its height */
431
+ isCollapsible: _angular_core.Signal<boolean>;
432
+ ngAfterViewInit(): void;
433
+ /** Updates the full height of the content */
434
+ private updateFullHeight;
435
+ /** Toggles the collapsed state */
436
+ toggle(): void;
437
+ onToggleKeydown(event: KeyboardEvent): void;
438
+ computedClasses: _angular_core.Signal<{
439
+ 'pe-collapse': boolean;
440
+ 'pe-collapse--collapsed': boolean;
441
+ }>;
442
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapseComponent, never>;
443
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapseComponent, "pe-collapse", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": true; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, ["*"], true, never>;
444
+ }
445
+
446
+ type ListItemTheme = 'ghost-white' | 'transparent-white' | 'outline-white' | 'outline-purple';
447
+ declare class ListItemComponent {
448
+ checkbox: _angular_core.Signal<CheckboxComponent | undefined>;
449
+ theme: _angular_core.InputSignal<ListItemTheme>;
450
+ disabled: _angular_core.InputSignal<boolean>;
451
+ hideFocusOutline: _angular_core.InputSignal<boolean>;
452
+ selected: _angular_core.InputSignal<boolean>;
453
+ loading: _angular_core.InputSignal<boolean>;
454
+ clickHandler(): void;
455
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListItemComponent, never>;
456
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ListItemComponent, "pe-list-item", never, { "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hideFocusOutline": { "alias": "hideFocusOutline"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, ["checkbox"], ["[pe-list-item-before-label]", "[pe-list-item-label]", "[pe-list-item-after-label]"], true, never>;
457
+ }
458
+
459
+ /**
460
+ * Represents a single item in the dropdown menu.
461
+ */
462
+ type DropdownItem = {
463
+ /** Display text for the dropdown item */
464
+ label: string;
465
+ /** Optional value associated with the item */
466
+ value?: string;
467
+ /** Icons to display on the left side of the item */
468
+ leftIcons?: IconName[];
469
+ /** Icons to display on the right side of the item */
470
+ rightIcons?: IconName[];
471
+ /** Whether the item is disabled and cannot be selected */
472
+ disabled?: boolean;
473
+ };
474
+ /**
475
+ * A customizable dropdown component that displays a list of selectable items.
476
+ *
477
+ * Features:
478
+ * - Configurable themes (ghost-white, transparent-white)
479
+ * - Icon support for items and trigger button
480
+ * - Customizable trigger appearance
481
+ * - Disabled item support
482
+ * - Two-way binding for selected item
483
+ *
484
+ * @example
485
+ * ```html
486
+ * <!-- Basic usage -->
487
+ * <uds-dropdown
488
+ * [items]="dropdownItems"
489
+ * [theme]="'transparent-white'"
490
+ * (selectedItemChange)="onItemSelected($event)">
491
+ * </uds-dropdown>
492
+ *
493
+ * <!-- More options menu -->
494
+ * <uds-dropdown
495
+ * [items]="actionItems"
496
+ * [onlyMenuTriggerIcon]="'more_options'">
497
+ * </uds-dropdown>
498
+ * ```
499
+ */
500
+ declare class DropdownComponent {
501
+ /**
502
+ * The visual theme for the dropdown.
503
+ * @default 'ghost-white'
504
+ */
505
+ theme: _angular_core.InputSignal<ListItemTheme>;
506
+ /**
507
+ * Array of items to display in the dropdown menu.
508
+ * @default []
509
+ */
510
+ items: _angular_core.InputSignal<DropdownItem[]>;
511
+ /**
512
+ * Whether the dropdown is disabled.
513
+ * @default false
514
+ */
515
+ disabled: _angular_core.InputSignal<boolean>;
516
+ /**
517
+ * Overrides the icons of the selected item in the trigger button.
518
+ * Can override leftIcons, rightIcons, or both.
519
+ * @default {}
520
+ *
521
+ * @example
522
+ * ```typescript
523
+ * menuTriggerIcons = {
524
+ * chevron_down
525
+ * }
526
+ * ```
527
+ */
528
+ menuTriggerIcons: _angular_core.InputSignal<Pick<DropdownItem, "leftIcons" | "rightIcons">>;
529
+ /**
530
+ * Shows only a single icon in the trigger button, hiding the selected item's label and icons.
531
+ * Commonly used with 'more_options' for action menus.
532
+ * @default undefined
533
+ *
534
+ * @example
535
+ * ```typescript
536
+ * triggerIconOnly = 'more_options'
537
+ * ```
538
+ */
539
+ triggerIconOnly: _angular_core.InputSignal<string | undefined>;
540
+ /**
541
+ * Accessible label for the icon-only trigger button.
542
+ * @default 'Open menu'
543
+ */
544
+ iconOnlyLabel: _angular_core.InputSignal<string>;
545
+ /**
546
+ * The index of the currently selected item.
547
+ * Supports two-way binding with [(selectedIndex)].
548
+ * @default 0
549
+ */
550
+ selectedIndex: _angular_core.ModelSignal<number>;
551
+ /**
552
+ * The currently selected item with any trigger icon overrides applied.
553
+ */
554
+ selectedItem: _angular_core.Signal<{
555
+ leftIcons?: IconName[];
556
+ rightIcons?: IconName[];
557
+ /** Display text for the dropdown item */
558
+ label: string;
559
+ /** Optional value associated with the item */
560
+ value?: string;
561
+ /** Whether the item is disabled and cannot be selected */
562
+ disabled?: boolean;
563
+ }>;
564
+ /**
565
+ * Right icons for the trigger: when default is chevron_down, shows chevron_down when closed
566
+ * and chevron_up when open. Otherwise uses selectedItem().rightIcons as-is.
567
+ */
568
+ triggerRightIcons: _angular_core.Signal<string[]>;
569
+ /**
570
+ * Tracks whether the menu is currently open for ARIA.
571
+ */
572
+ isOpen: _angular_core.WritableSignal<boolean>;
573
+ /**
574
+ * Stable id used to link the trigger to the menu container.
575
+ */
576
+ readonly menuId: string;
577
+ /**
578
+ * Emitted when a new item is selected from the dropdown.
579
+ */
580
+ selectedItemChange: _angular_core.OutputEmitterRef<DropdownItem>;
581
+ /**
582
+ * Handles the selection of a dropdown item.
583
+ * @param index - The index of the selected item
584
+ */
585
+ handleItemTriggered(index: number): void;
586
+ onMenuOpened(): void;
587
+ onMenuClosed(): void;
588
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownComponent, never>;
589
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "pe-dropdown", never, { "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "menuTriggerIcons": { "alias": "menuTriggerIcons"; "required": false; "isSignal": true; }; "triggerIconOnly": { "alias": "triggerIconOnly"; "required": false; "isSignal": true; }; "iconOnlyLabel": { "alias": "iconOnlyLabel"; "required": false; "isSignal": true; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; }, { "selectedIndex": "selectedIndexChange"; "selectedItemChange": "selectedItemChange"; }, never, never, true, never>;
590
+ }
591
+
592
+ /** Border and hover style: border-only (hover = border only), subtle-tint (hover = border + 5% fill). */
593
+ type FileInputAppearance = 'border-only' | 'subtle-tint';
594
+ /**
595
+ * File input component with label, helper/error text, and optional slots.
596
+ * Implements FormValueControl<FileList | null> for use with Signal Forms [formField].
597
+ *
598
+ * Uses hidden native file input + visible trigger + selected file label.
599
+ * Content projection: [pe-file-input-left-elements], [pe-file-input-right-elements].
600
+ */
601
+ declare class FileInputComponent implements FormValueControl<FileList | null> {
602
+ readonly size: _angular_core.InputSignal<UiSize>;
603
+ readonly appearance: _angular_core.InputSignal<FileInputAppearance>;
604
+ readonly accept: _angular_core.InputSignal<string>;
605
+ readonly multiple: _angular_core.InputSignal<boolean>;
606
+ readonly disabled: _angular_core.InputSignal<boolean>;
607
+ readonly required: _angular_core.InputSignal<boolean>;
608
+ readonly label: _angular_core.InputSignal<string | null>;
609
+ readonly helperText: _angular_core.InputSignal<string | null>;
610
+ readonly errorText: _angular_core.InputSignal<string | null>;
611
+ /** Placeholder when no file is selected (e.g. "Choose file" or "No file chosen"). */
612
+ readonly placeholderText: _angular_core.InputSignal<string>;
613
+ readonly controlId: _angular_core.InputSignal<string | undefined>;
614
+ readonly invalid: _angular_core.InputSignal<boolean>;
615
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
616
+ readonly touched: _angular_core.ModelSignal<boolean>;
617
+ readonly error: _angular_core.InputSignal<boolean>;
618
+ readonly value: _angular_core.ModelSignal<FileList | null>;
619
+ protected readonly fileInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
620
+ protected readonly ids: {
621
+ controlId: string;
622
+ helperId: string;
623
+ errorId: string;
624
+ };
625
+ protected readonly effectiveControlId: _angular_core.Signal<string>;
626
+ protected readonly effectiveHelperId: _angular_core.Signal<string>;
627
+ protected readonly effectiveErrorId: _angular_core.Signal<string>;
628
+ protected readonly isFocused: _angular_core.WritableSignal<boolean>;
629
+ protected readonly hasError: _angular_core.Signal<boolean>;
630
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
631
+ /** Display text for selected file(s). */
632
+ protected readonly selectedLabel: _angular_core.Signal<string>;
633
+ readonly inputBlur: _angular_core.OutputEmitterRef<FocusEvent>;
634
+ readonly inputFocus: _angular_core.OutputEmitterRef<FocusEvent>;
635
+ readonly valueChange: _angular_core.OutputEmitterRef<FileList | null>;
636
+ constructor();
637
+ onFileChange(event: Event): void;
638
+ onBlur(event: FocusEvent): void;
639
+ onFocus(event: FocusEvent): void;
640
+ triggerClick(): void;
641
+ focus(): void;
642
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileInputComponent, never>;
643
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileInputComponent, "pe-file-input", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "placeholderText": { "alias": "placeholderText"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "value": "valueChange"; "inputBlur": "inputBlur"; "inputFocus": "inputFocus"; "valueChange": "valueChange"; }, never, ["[pe-file-input-left-elements]", "[pe-file-input-right-elements]"], true, never>;
644
+ }
645
+
646
+ declare class FooterComponent {
647
+ copyrightText: _angular_core.InputSignal<string>;
648
+ socialLinks: _angular_core.InputSignal<{
649
+ url: string;
650
+ icon: IconName;
651
+ }[]>;
652
+ links: _angular_core.InputSignal<{
653
+ url: string;
654
+ text: string;
655
+ }[]>;
656
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FooterComponent, never>;
657
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FooterComponent, "pe-footer", never, { "copyrightText": { "alias": "copyrightText"; "required": false; "isSignal": true; }; "socialLinks": { "alias": "socialLinks"; "required": false; "isSignal": true; }; "links": { "alias": "links"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
658
+ }
659
+
660
+ /** Place on the element projected into [pe-hero-badges] so the hero can detect custom badges content. */
661
+ declare class PeHeroBadgesSlotDirective {
662
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PeHeroBadgesSlotDirective, never>;
663
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PeHeroBadgesSlotDirective, "[pe-hero-badges]", never, {}, {}, never, never, true, never>;
664
+ }
665
+ /** Place on the element projected into [pe-hero-title] so the hero can detect custom title content. */
666
+ declare class PeHeroTitleSlotDirective {
667
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PeHeroTitleSlotDirective, never>;
668
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PeHeroTitleSlotDirective, "[pe-hero-title]", never, {}, {}, never, never, true, never>;
669
+ }
670
+ /** Place on the element projected into [pe-hero-subtitle] so the hero can detect custom subtitle content. */
671
+ declare class PeHeroSubtitleSlotDirective {
672
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PeHeroSubtitleSlotDirective, never>;
673
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PeHeroSubtitleSlotDirective, "[pe-hero-subtitle]", never, {}, {}, never, never, true, never>;
674
+ }
675
+ /** Place on the element projected into [pe-hero-actions] so the hero can detect custom actions content. */
676
+ declare class PeHeroActionsSlotDirective {
677
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PeHeroActionsSlotDirective, never>;
678
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PeHeroActionsSlotDirective, "[pe-hero-actions]", never, {}, {}, never, never, true, never>;
679
+ }
680
+ /** Place on the element projected into [pe-hero-content] for optional extra content (e.g. between subtitle and actions). */
681
+ declare class PeHeroContentSlotDirective {
682
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PeHeroContentSlotDirective, never>;
683
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PeHeroContentSlotDirective, "[pe-hero-content]", never, {}, {}, never, never, true, never>;
684
+ }
685
+
686
+ interface HeroAction {
687
+ label: string;
688
+ href?: string;
689
+ routerLink?: string | string[];
690
+ icon?: string;
691
+ theme?: UiTheme;
692
+ size?: UiSize;
693
+ }
694
+ type HeroAlignment = 'left' | 'center' | 'right';
695
+ type HeroSize = 'sm' | 'md' | 'lg';
696
+ /**
697
+ * Hero component for displaying prominent hero sections with title, description,
698
+ * call-to-action buttons, optional badges, and background image support.
699
+ * Fully responsive across mobile, tablet, and desktop.
700
+ *
701
+ * When slots are not projected, inputs are used (title, subtitle, badges, primaryAction, secondaryAction).
702
+ * Content projection slots: pe-hero-badges, pe-hero-title, pe-hero-subtitle, pe-hero-actions, pe-hero-content.
703
+ *
704
+ * @example
705
+ * ```html
706
+ * <pe-hero
707
+ * title="Welcome"
708
+ * subtitle="Build amazing experiences"
709
+ * [primaryAction]="{ label: 'Get Started', href: '/signup' }"
710
+ * [badges]="['New', 'Featured']"
711
+ * />
712
+ * ```
713
+ */
714
+ declare class HeroComponent {
715
+ /** Main headline text */
716
+ title: _angular_core.InputSignal<string>;
717
+ /** Supporting description text */
718
+ subtitle: _angular_core.InputSignal<string | undefined>;
719
+ /** Primary call-to-action button */
720
+ primaryAction: _angular_core.InputSignal<HeroAction | undefined>;
721
+ /** Secondary call-to-action button */
722
+ secondaryAction: _angular_core.InputSignal<HeroAction | undefined>;
723
+ /** Badge/pill labels to display above the title */
724
+ badges: _angular_core.InputSignal<string[]>;
725
+ /** Background image URL */
726
+ backgroundImage: _angular_core.InputSignal<string | undefined>;
727
+ /**
728
+ * CSS gradient or color for the overlay on top of the background image.
729
+ * E.g. "linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.7) 100%)" or "rgba(0,0,0,0.5)".
730
+ * When unset, a default dark overlay is used when a background image is present.
731
+ */
732
+ backgroundOverlayGradient: _angular_core.InputSignal<string | undefined>;
733
+ /**
734
+ * CSS filter applied to the background image (e.g. "brightness(0.8)", "blur(2px)", "grayscale(0.3)").
735
+ * Combine multiple: "brightness(0.7) contrast(1.1)".
736
+ */
737
+ backgroundFilter: _angular_core.InputSignal<string | undefined>;
738
+ /** Text and content alignment */
739
+ alignment: _angular_core.InputSignal<HeroAlignment>;
740
+ /** Hero section size variant */
741
+ size: _angular_core.InputSignal<HeroSize>;
742
+ /** Whether hero takes full viewport height */
743
+ fullHeight: _angular_core.InputSignal<boolean>;
744
+ readonly badgesSlot: _angular_core.Signal<PeHeroBadgesSlotDirective | undefined>;
745
+ readonly titleSlot: _angular_core.Signal<PeHeroTitleSlotDirective | undefined>;
746
+ readonly subtitleSlot: _angular_core.Signal<PeHeroSubtitleSlotDirective | undefined>;
747
+ readonly actionsSlot: _angular_core.Signal<PeHeroActionsSlotDirective | undefined>;
748
+ readonly contentSlot: _angular_core.Signal<PeHeroContentSlotDirective | undefined>;
749
+ readonly hasBadgesSlot: _angular_core.Signal<boolean>;
750
+ readonly hasTitleSlot: _angular_core.Signal<boolean>;
751
+ readonly hasSubtitleSlot: _angular_core.Signal<boolean>;
752
+ readonly hasActionsSlot: _angular_core.Signal<boolean>;
753
+ readonly hasContentSlot: _angular_core.Signal<boolean>;
754
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeroComponent, never>;
755
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeroComponent, "pe-hero", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "primaryAction": { "alias": "primaryAction"; "required": false; "isSignal": true; }; "secondaryAction": { "alias": "secondaryAction"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; "backgroundImage": { "alias": "backgroundImage"; "required": false; "isSignal": true; }; "backgroundOverlayGradient": { "alias": "backgroundOverlayGradient"; "required": false; "isSignal": true; }; "backgroundFilter": { "alias": "backgroundFilter"; "required": false; "isSignal": true; }; "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "fullHeight": { "alias": "fullHeight"; "required": false; "isSignal": true; }; }, {}, ["badgesSlot", "titleSlot", "subtitleSlot", "actionsSlot", "contentSlot"], ["[pe-hero-badges]", "[pe-hero-title]", "[pe-hero-subtitle]", "[pe-hero-content]", "[pe-hero-actions]"], true, never>;
756
+ }
757
+
758
+ /**
759
+ * Directive to handle image loading errors and display placeholders
760
+ */
761
+ declare class ImageNotFoundDirective {
762
+ showPlaceholder: _angular_core.InputSignal<boolean>;
763
+ imageNotFound: _angular_core.WritableSignal<boolean>;
764
+ visibility: _angular_core.WritableSignal<string>;
765
+ /**
766
+ * Handles image loading errors
767
+ * Hides the image and optionally shows placeholder
768
+ */
769
+ handleError(): void;
770
+ /**
771
+ * Handles successful image load
772
+ * Shows the image and removes placeholder
773
+ */
774
+ handleLoad(): void;
775
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ImageNotFoundDirective, never>;
776
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ImageNotFoundDirective, "[peCatchImageNotFound]", never, { "showPlaceholder": { "alias": "showPlaceholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
777
+ }
778
+
779
+ type InputType = 'text' | 'password' | 'email' | 'number' | 'tel' | 'url';
780
+ /** Border and hover style: border-only (hover = border only), subtle-tint (hover = border + 5% fill). */
781
+ type InputAppearance = 'border-only' | 'subtle-tint';
782
+ /**
783
+ * A reusable input component that follows UDS design system guidelines.
784
+ * Implements FormValueControl for use with Signal Forms [formField] directive.
785
+ *
786
+ * Use [(value)] for two-way binding, or bind with [formField]="myForm().email" for Signal Forms.
787
+ *
788
+ * Content projection: [pe-input-left-elements], [pe-input-right-elements].
789
+ */
790
+ declare class InputComponent implements FormValueControl<string> {
791
+ readonly type: _angular_core.InputSignal<InputType>;
792
+ readonly size: _angular_core.InputSignal<UiSize>;
793
+ /** Border/hover style: border-only (hover = border only), subtle-tint (hover = border + 5% fill). */
794
+ readonly appearance: _angular_core.InputSignal<InputAppearance>;
795
+ readonly error: _angular_core.InputSignal<boolean>;
796
+ readonly disabled: _angular_core.InputSignal<boolean>;
797
+ readonly readOnly: _angular_core.InputSignal<boolean>;
798
+ readonly required: _angular_core.InputSignal<boolean>;
799
+ readonly placeholder: _angular_core.InputSignal<string>;
800
+ readonly label: _angular_core.InputSignal<string | null>;
801
+ readonly helperText: _angular_core.InputSignal<string | null>;
802
+ readonly errorText: _angular_core.InputSignal<string | null>;
803
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
804
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
805
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
806
+ readonly autocomplete: _angular_core.InputSignal<string>;
807
+ /** When provided (e.g. by a parent form field), the input element uses this id instead of the internal one. */
808
+ readonly controlId: _angular_core.InputSignal<string | undefined>;
809
+ /** FormUiControl optional: bound by [formField] when invalid */
810
+ readonly invalid: _angular_core.InputSignal<boolean>;
811
+ /** FormUiControl optional: bound by [formField] for validation errors */
812
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
813
+ /** FormUiControl optional: control sets on blur */
814
+ readonly touched: _angular_core.ModelSignal<boolean>;
815
+ readonly value: _angular_core.ModelSignal<string>;
816
+ protected readonly ids: {
817
+ controlId: string;
818
+ helperId: string;
819
+ errorId: string;
820
+ };
821
+ protected readonly effectiveControlId: _angular_core.Signal<string>;
822
+ protected readonly effectiveHelperId: _angular_core.Signal<string>;
823
+ protected readonly effectiveErrorId: _angular_core.Signal<string>;
824
+ protected readonly isFocused: _angular_core.WritableSignal<boolean>;
825
+ protected readonly isDirty: _angular_core.WritableSignal<boolean>;
826
+ protected readonly hasError: _angular_core.Signal<boolean>;
827
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
828
+ readonly inputBlur: _angular_core.OutputEmitterRef<FocusEvent>;
829
+ readonly inputFocus: _angular_core.OutputEmitterRef<FocusEvent>;
830
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
831
+ constructor();
832
+ onInput(event: Event): void;
833
+ onBlur(event: FocusEvent): void;
834
+ onFocus(event: FocusEvent): void;
835
+ /**
836
+ * Programmatically focuses the input element
837
+ */
838
+ focus(): void;
839
+ select(): void;
840
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
841
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "pe-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "value": "valueChange"; "inputBlur": "inputBlur"; "inputFocus": "inputFocus"; "valueChange": "valueChange"; }, never, ["[pe-input-left-elements]", "[pe-input-right-elements]"], true, never>;
842
+ }
843
+
844
+ type ModalVariant = 'default' | 'success' | 'error' | 'custom' | 'bottom-sheet' | 'confirmation';
845
+ declare class ModalComponent {
846
+ /** Whether the modal is open. Supports two-way binding with [(open)]. */
847
+ open: _angular_core.ModelSignal<boolean>;
848
+ /** Visual variant: default, success, error, custom, or bottom-sheet (mobile-only layout). */
849
+ variant: _angular_core.InputSignal<ModalVariant>;
850
+ /** Optional title shown in the header. */
851
+ title: _angular_core.InputSignal<string | undefined>;
852
+ /** Whether clicking the backdrop closes the modal. */
853
+ closeOnBackdropClick: _angular_core.InputSignal<boolean>;
854
+ /** Whether to show the close button in the header. */
855
+ showCloseButton: _angular_core.InputSignal<boolean>;
856
+ /** Label for the primary confirm action in the confirmation variant. */
857
+ confirmLabel: _angular_core.InputSignal<string>;
858
+ /** Label for the secondary cancel action in the confirmation variant. */
859
+ cancelLabel: _angular_core.InputSignal<string>;
860
+ /** Optional CSS class for the panel (e.g. for custom variant). */
861
+ customClass: _angular_core.InputSignal<string | undefined>;
862
+ /** Emitted when the modal is closed (button, backdrop, or escape). */
863
+ closed: _angular_core.OutputEmitterRef<void>;
864
+ /** Emitted when the user confirms in the confirmation variant. */
865
+ confirmed: _angular_core.OutputEmitterRef<void>;
866
+ /** Emitted when the user cancels in the confirmation variant. */
867
+ cancelled: _angular_core.OutputEmitterRef<void>;
868
+ readonly panelClass: _angular_core.Signal<string>;
869
+ readonly isConfirmation: _angular_core.Signal<boolean>;
870
+ readonly isSuccess: _angular_core.Signal<boolean>;
871
+ readonly isError: _angular_core.Signal<boolean>;
872
+ modalTitle: _angular_core.Signal<string | undefined>;
873
+ readonly titleId: string;
874
+ readonly bodyId: string;
875
+ close(): void;
876
+ onConfirm(): void;
877
+ onCancel(): void;
878
+ onBackdropClick(event: MouseEvent): void;
879
+ onEscape(): void;
880
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalComponent, never>;
881
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalComponent, "pe-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; "isSignal": true; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; "isSignal": true; }; "customClass": { "alias": "customClass"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; "confirmed": "confirmed"; "cancelled": "cancelled"; }, never, ["*", "[pe-modal-footer]"], true, never>;
882
+ }
883
+
884
+ /** Place on the element projected into [pe-navbar-logo] so the navbar can detect logo content. */
885
+ declare class NavbarLogoSlotDirective {
886
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavbarLogoSlotDirective, never>;
887
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NavbarLogoSlotDirective, "[pe-navbar-logo]", never, {}, {}, never, never, true, never>;
888
+ }
889
+ /** Place on the element projected into [pe-navbar-search] so the navbar can show the mobile search toggle. */
890
+ declare class NavbarSearchSlotDirective {
891
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavbarSearchSlotDirective, never>;
892
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NavbarSearchSlotDirective, "[pe-navbar-search]", never, {}, {}, never, never, true, never>;
893
+ }
894
+ /** Place on the element projected into [pe-navbar-avatar] so the navbar can detect avatar content. */
895
+ declare class NavbarAvatarSlotDirective {
896
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavbarAvatarSlotDirective, never>;
897
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NavbarAvatarSlotDirective, "[pe-navbar-avatar]", never, {}, {}, never, never, true, never>;
898
+ }
899
+
900
+ declare class NavbarComponent {
901
+ /** Default logo link href when logo slot is not projected. */
902
+ logoHref: _angular_core.InputSignal<string>;
903
+ /** Default logo image src when logo slot is not projected. */
904
+ logoSrc: _angular_core.InputSignal<string | undefined>;
905
+ /** Default logo image alt when logo slot is not projected. */
906
+ logoAlt: _angular_core.InputSignal<string>;
907
+ /** Default avatar image src when avatar slot is not projected. */
908
+ avatarSrc: _angular_core.InputSignal<string | undefined>;
909
+ /** Default avatar initials when avatar slot is not projected and no image. */
910
+ avatarInitials: _angular_core.InputSignal<string | undefined>;
911
+ /** Default avatar image alt when avatar slot is not projected. */
912
+ avatarAlt: _angular_core.InputSignal<string>;
913
+ /** For aria-expanded on the toggle button */
914
+ sidebarOpen: _angular_core.InputSignal<boolean>;
915
+ /** When true, show the sidebar toggle button even when a logo slot is projected. */
916
+ showSidebarToggle: _angular_core.InputSignal<boolean>;
917
+ /** Emitted when the user clicks the sidebar toggle. Parent should flip the open state. */
918
+ sidebarToggle: _angular_core.OutputEmitterRef<void>;
919
+ readonly logoSlot: _angular_core.Signal<NavbarLogoSlotDirective | undefined>;
920
+ readonly searchSlot: _angular_core.Signal<NavbarSearchSlotDirective | undefined>;
921
+ readonly avatarSlot: _angular_core.Signal<NavbarAvatarSlotDirective | undefined>;
922
+ readonly hasLogoSlot: _angular_core.Signal<boolean>;
923
+ readonly hasSearchSlot: _angular_core.Signal<boolean>;
924
+ readonly hasAvatarSlot: _angular_core.Signal<boolean>;
925
+ readonly showToggle: _angular_core.Signal<boolean>;
926
+ readonly searchExpanded: _angular_core.WritableSignal<boolean>;
927
+ toggleSearch(): void;
928
+ toggleSidebar(): void;
929
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavbarComponent, never>;
930
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NavbarComponent, "pe-navbar", never, { "logoHref": { "alias": "logoHref"; "required": false; "isSignal": true; }; "logoSrc": { "alias": "logoSrc"; "required": false; "isSignal": true; }; "logoAlt": { "alias": "logoAlt"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarAlt": { "alias": "avatarAlt"; "required": false; "isSignal": true; }; "sidebarOpen": { "alias": "sidebarOpen"; "required": false; "isSignal": true; }; "showSidebarToggle": { "alias": "showSidebarToggle"; "required": false; "isSignal": true; }; }, { "sidebarToggle": "sidebarToggle"; }, ["logoSlot", "searchSlot", "avatarSlot"], ["[pe-navbar-logo]", "[pe-navbar-search]", "[pe-navbar-avatar]"], true, never>;
931
+ }
932
+
933
+ type PillSize = 'md' | 'lg';
934
+ type PillVariant = 'interactive' | 'interactive-rounded' | 'read-only' | 'dismissible' | 'selectable';
935
+ type PillTheme = 'fill-white' | 'fill-black' | 'fill-purple' | 'fill-red' | 'fill-green' | 'transparent-white' | 'transparent-purple' | 'transparent-red' | 'transparent-green' | 'stroke-white' | 'outline-white' | 'outline-purple' | 'outline-red' | 'outline-green';
936
+ declare class PillComponent {
937
+ variant: _angular_core.InputSignal<PillVariant>;
938
+ theme: _angular_core.InputSignal<PillTheme>;
939
+ size: _angular_core.InputSignal<PillSize>;
940
+ disabled: _angular_core.InputSignal<boolean>;
941
+ dismiss: _angular_core.OutputEmitterRef<void>;
942
+ dismissibleButtonTheme: _angular_core.Signal<"ghost-purple" | "ghost-white" | "ghost-red" | "ghost-green">;
943
+ modifierClass: _angular_core.Signal<string[]>;
944
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PillComponent, never>;
945
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PillComponent, "pe-pill", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, ["*"], true, never>;
946
+ }
947
+
948
+ type SalePosition = 'left' | 'right';
949
+ type Currency = 'UOS' | string;
950
+ declare class PriceButtonComponent {
951
+ readonly label: _angular_core.InputSignal<string>;
952
+ readonly size: _angular_core.InputSignal<UiSize>;
953
+ readonly theme: _angular_core.InputSignal<UiTheme>;
954
+ readonly disabled: _angular_core.InputSignal<boolean>;
955
+ readonly salePosition: _angular_core.InputSignal<SalePosition>;
956
+ readonly price: _angular_core.InputSignal<number>;
957
+ readonly originalPrice: _angular_core.InputSignal<number>;
958
+ readonly discountBasis: _angular_core.InputSignal<number>;
959
+ readonly currency: _angular_core.InputSignal<string>;
960
+ readonly buttonClick: _angular_core.OutputEmitterRef<MouseEvent>;
961
+ protected handleClick(event: MouseEvent): void;
962
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PriceButtonComponent, never>;
963
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PriceButtonComponent, "pe-price-button", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "salePosition": { "alias": "salePosition"; "required": false; "isSignal": true; }; "price": { "alias": "price"; "required": false; "isSignal": true; }; "originalPrice": { "alias": "originalPrice"; "required": false; "isSignal": true; }; "discountBasis": { "alias": "discountBasis"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; }, { "buttonClick": "buttonClick"; }, never, never, true, never>;
964
+ }
965
+
966
+ /**
967
+ * Extends Angular's CurrencyPipe to use the custom symbol 'ᕫ' for 'UOS' currency code.
968
+ * For all other codes, behaves exactly like CurrencyPipe.
969
+ */
970
+ declare class CustomCurrencyPipe extends CurrencyPipe implements PipeTransform {
971
+ private static readonly UOS_SYMBOL;
972
+ transform(value: number | string, currencyCode?: string, display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean, digitsInfo?: string, locale?: string): string | null;
973
+ transform(value: null | undefined, currencyCode?: string, display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean, digitsInfo?: string, locale?: string): null;
974
+ private separateCurrencyAndPrice;
975
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CustomCurrencyPipe, never>;
976
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<CustomCurrencyPipe, "peCurrency", true>;
977
+ }
978
+
979
+ /**
980
+ * Radio button for use inside a group. For Signal Forms use pe-radio-group with [formField].
981
+ * Use [(checked)] when controlling each radio manually, or place inside pe-radio-group for [formField] binding.
982
+ *
983
+ * @example
984
+ * <pe-radio value="option1" name="my-group" [checked]="isSelected">Option 1</pe-radio>
985
+ */
986
+ declare class RadioComponent {
987
+ /**
988
+ * The value associated with this radio button.
989
+ * This value identifies the radio button within its group.
990
+ */
991
+ value: _angular_core.InputSignal<string>;
992
+ /**
993
+ * The name attribute for the radio button group.
994
+ * All radio buttons in the same group should share the same name.
995
+ */
996
+ name: _angular_core.InputSignal<string>;
997
+ /**
998
+ * Whether the radio button is disabled.
999
+ * @default false
1000
+ */
1001
+ disabled: _angular_core.InputSignalWithTransform<boolean, boolean>;
1002
+ /**
1003
+ * Whether the radio button is currently checked/selected.
1004
+ * This is a two-way binding that can be used with [(checked)].
1005
+ */
1006
+ checked: _angular_core.ModelSignal<boolean>;
1007
+ /**
1008
+ * Unique identifier for the radio button.
1009
+ * If not provided, one will be auto-generated.
1010
+ */
1011
+ id: _angular_core.InputSignal<string | undefined>;
1012
+ /**
1013
+ * Event emitted when the radio button is clicked.
1014
+ * Useful for additional click handling beyond the default radio behavior.
1015
+ */
1016
+ click: _angular_core.OutputEmitterRef<MouseEvent>;
1017
+ /**
1018
+ * Emitted when this radio is selected (checked becomes true).
1019
+ * Used by pe-radio-group to sync the group value.
1020
+ */
1021
+ selected: _angular_core.OutputEmitterRef<string>;
1022
+ /**
1023
+ * Internal signal for the unique ID
1024
+ */
1025
+ private readonly uniqueId;
1026
+ /**
1027
+ * Computed ID that uses provided ID or falls back to generated unique ID
1028
+ */
1029
+ readonly radioId: _angular_core.Signal<string>;
1030
+ /**
1031
+ * Computed ARIA attributes for accessibility
1032
+ */
1033
+ readonly ariaAttributes: _angular_core.Signal<{
1034
+ 'aria-checked': boolean;
1035
+ 'aria-disabled': boolean;
1036
+ role: "radio";
1037
+ }>;
1038
+ /**
1039
+ * Handles the radio button change event.
1040
+ * Updates the checked state.
1041
+ *
1042
+ * @param event - The change event from the input element
1043
+ */
1044
+ onRadioChange(event: Event): void;
1045
+ /**
1046
+ * Handles click events on the radio button.
1047
+ * Useful for additional click handling beyond the default radio behavior.
1048
+ *
1049
+ * @param event - The click event
1050
+ */
1051
+ onRadioClick(event: MouseEvent): void;
1052
+ /**
1053
+ * Handles keyboard events for accessibility.
1054
+ * Supports Space and Enter keys for selection.
1055
+ *
1056
+ * @param event - The keyboard event
1057
+ */
1058
+ onKeyDown(event: KeyboardEvent): void;
1059
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioComponent, never>;
1060
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioComponent, "pe-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "name": { "alias": "name"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "click": "click"; "selected": "selected"; }, never, ["*"], true, never>;
1061
+ }
1062
+
1063
+ interface RadioGroupOption {
1064
+ value: string;
1065
+ label: string;
1066
+ }
1067
+ /**
1068
+ * Radio group that holds the selected option value. Implements FormValueControl for Signal Forms [formField].
1069
+ * Use [(value)] or [formField]="myForm().choice". Renders pe-radio per option; value is the selected option's value.
1070
+ */
1071
+ declare class RadioGroupComponent implements FormValueControl<string | null> {
1072
+ readonly name: _angular_core.InputSignal<string>;
1073
+ readonly options: _angular_core.InputSignal<RadioGroupOption[]>;
1074
+ readonly label: _angular_core.InputSignal<string | null>;
1075
+ readonly helperText: _angular_core.InputSignal<string | null>;
1076
+ readonly errorText: _angular_core.InputSignal<string | null>;
1077
+ readonly error: _angular_core.InputSignal<boolean>;
1078
+ readonly disabled: _angular_core.InputSignal<boolean>;
1079
+ readonly required: _angular_core.InputSignal<boolean>;
1080
+ readonly invalid: _angular_core.InputSignal<boolean>;
1081
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
1082
+ readonly value: _angular_core.ModelSignal<string | null>;
1083
+ protected readonly ids: {
1084
+ controlId: string;
1085
+ helperId: string;
1086
+ errorId: string;
1087
+ };
1088
+ protected readonly hasError: _angular_core.Signal<boolean>;
1089
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
1090
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioGroupComponent, never>;
1091
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioGroupComponent, "pe-radio-group", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1092
+ }
1093
+
1094
+ type RadialSize = 96 | 64 | 48 | 32 | 24 | 20 | 16;
1095
+ declare class RadialComponent {
1096
+ readonly size: _angular_core.InputSignal<RadialSize>;
1097
+ readonly infinite: _angular_core.InputSignalWithTransform<boolean, boolean>;
1098
+ readonly percentage: _angular_core.InputSignal<number>;
1099
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
1100
+ readonly lineWidth: _angular_core.Signal<number>;
1101
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadialComponent, never>;
1102
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadialComponent, "pe-radial", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "infinite": { "alias": "infinite"; "required": false; "isSignal": true; }; "percentage": { "alias": "percentage"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1103
+ }
1104
+
1105
+ type RichTextTone = 'default' | 'muted' | 'inverse';
1106
+ type RichTextSize = 'body-m' | 'body-l';
1107
+ /**
1108
+ * Display-only rich text component. Renders sanitized HTML from the API (or from
1109
+ * pe-rich-text-editor) with no Quill dependency. HTML is sanitized before rendering.
1110
+ *
1111
+ * Use [content] for HTML strings (e.g. from API or editor), or project markup via
1112
+ * ng-content when content is empty.
1113
+ */
1114
+ declare class RichTextComponent {
1115
+ readonly content: _angular_core.InputSignal<string | null>;
1116
+ readonly size: _angular_core.InputSignal<RichTextSize>;
1117
+ private readonly domSanitizer;
1118
+ protected readonly sanitizedContent: _angular_core.Signal<string>;
1119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RichTextComponent, never>;
1120
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RichTextComponent, "pe-rich-text", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1121
+ }
1122
+
1123
+ type SkeletonVariant = 'rect' | 'text';
1124
+ type SkeletonBorderRadius = 'xs' | 'sm' | 'md' | 'lg' | 'full';
1125
+ declare class SkeletonComponent {
1126
+ readonly variant: _angular_core.InputSignal<SkeletonVariant>;
1127
+ readonly width: _angular_core.InputSignal<string | null>;
1128
+ readonly height: _angular_core.InputSignal<string | null>;
1129
+ readonly lines: _angular_core.InputSignal<number>;
1130
+ readonly borderRadius: _angular_core.InputSignal<SkeletonBorderRadius | null>;
1131
+ readonly show: _angular_core.InputSignal<boolean>;
1132
+ readonly hostStyles: _angular_core.Signal<{
1133
+ readonly width: string | null;
1134
+ readonly height: string | null;
1135
+ }>;
1136
+ readonly lineWidths: _angular_core.Signal<string[]>;
1137
+ readonly radiusClass: _angular_core.Signal<string | null>;
1138
+ trackByIndex(index: number): number;
1139
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonComponent, never>;
1140
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonComponent, "pe-skeleton", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "show": { "alias": "show"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1141
+ }
1142
+
1143
+ type ToastKind = 'info' | 'success' | 'warning' | 'error';
1144
+ type ToastWithRole = {
1145
+ readonly id: string;
1146
+ readonly title?: string;
1147
+ readonly message: string;
1148
+ readonly kind: ToastKind;
1149
+ readonly dismissible: boolean;
1150
+ readonly role: 'status' | 'alert';
1151
+ readonly icon: string;
1152
+ readonly showIcon: boolean;
1153
+ };
1154
+
1155
+ declare class ToastContainerComponent {
1156
+ private readonly toastService;
1157
+ readonly toasts: _angular_core.Signal<ToastWithRole[]>;
1158
+ trackById(_: number, toast: ToastWithRole): string;
1159
+ dismiss(id: string): void;
1160
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastContainerComponent, never>;
1161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ToastContainerComponent, "pe-toast-container", never, {}, {}, never, never, true, never>;
1162
+ }
1163
+
1164
+ type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';
1165
+ declare class TooltipComponent {
1166
+ text: _angular_core.InputSignal<string>;
1167
+ position: _angular_core.InputSignal<TooltipPosition>;
1168
+ disabled: _angular_core.InputSignal<boolean>;
1169
+ showDelay: _angular_core.InputSignal<number>;
1170
+ hideDelay: _angular_core.InputSignal<number>;
1171
+ private readonly visible;
1172
+ private showTimeoutId;
1173
+ private hideTimeoutId;
1174
+ readonly tooltipId: string;
1175
+ get ariaDescribedBy(): string | null;
1176
+ handlePointerEnter(): void;
1177
+ handlePointerLeave(): void;
1178
+ readonly isVisible: _angular_core.Signal<boolean>;
1179
+ private scheduleShow;
1180
+ private scheduleHide;
1181
+ private cancelShow;
1182
+ private cancelHide;
1183
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipComponent, never>;
1184
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipComponent, "pe-tooltip", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showDelay": { "alias": "showDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "hideDelay"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1185
+ }
1186
+
1187
+ interface SearchSelectOption {
1188
+ label: string;
1189
+ value: string;
1190
+ }
1191
+ /**
1192
+ * Combobox: search input with filterable dropdown. User types to filter options and selects a result.
1193
+ * Implements FormValueControl for use with Signal Forms [formField]. Use [(value)] for two-way binding.
1194
+ */
1195
+ declare class SearchSelectComponent implements FormValueControl<string | null> {
1196
+ readonly size: _angular_core.InputSignal<UiSize>;
1197
+ readonly label: _angular_core.InputSignal<string | null>;
1198
+ readonly helperText: _angular_core.InputSignal<string | null>;
1199
+ readonly errorText: _angular_core.InputSignal<string | null>;
1200
+ readonly error: _angular_core.InputSignal<boolean>;
1201
+ readonly disabled: _angular_core.InputSignal<boolean>;
1202
+ readonly required: _angular_core.InputSignal<boolean>;
1203
+ readonly placeholder: _angular_core.InputSignal<string>;
1204
+ readonly options: _angular_core.InputSignal<SearchSelectOption[]>;
1205
+ readonly minCharsToOpen: _angular_core.InputSignal<number>;
1206
+ readonly invalid: _angular_core.InputSignal<boolean>;
1207
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
1208
+ readonly value: _angular_core.ModelSignal<string | null>;
1209
+ readonly valueChange: _angular_core.OutputEmitterRef<string | null>;
1210
+ protected readonly ids: {
1211
+ controlId: string;
1212
+ helperId: string;
1213
+ errorId: string;
1214
+ };
1215
+ protected readonly query: _angular_core.WritableSignal<string>;
1216
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
1217
+ protected readonly isFocused: _angular_core.WritableSignal<boolean>;
1218
+ protected readonly highlightedIndex: _angular_core.WritableSignal<number>;
1219
+ protected blurCloseTimeout: ReturnType<typeof setTimeout> | null;
1220
+ protected readonly listId: string;
1221
+ protected readonly hasError: _angular_core.Signal<boolean>;
1222
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
1223
+ protected readonly selectedOption: _angular_core.Signal<SearchSelectOption | null>;
1224
+ protected readonly selectedLabel: _angular_core.Signal<string>;
1225
+ protected readonly filteredOptions: _angular_core.Signal<SearchSelectOption[]>;
1226
+ protected readonly displayText: _angular_core.Signal<string>;
1227
+ protected readonly shouldShowPanel: _angular_core.Signal<boolean>;
1228
+ protected readonly hasNoResults: _angular_core.Signal<boolean>;
1229
+ protected readonly optionId: (index: number) => string;
1230
+ protected readonly activeDescendantId: _angular_core.Signal<string | undefined>;
1231
+ onInputValueChange(text: string): void;
1232
+ onInputFocus(): void;
1233
+ onInputBlur(): void;
1234
+ onKeydown(event: KeyboardEvent): void;
1235
+ selectOption(opt: SearchSelectOption): void;
1236
+ private cancelBlurClose;
1237
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchSelectComponent, never>;
1238
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchSelectComponent, "pe-search-select", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "minCharsToOpen": { "alias": "minCharsToOpen"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, never, never, true, never>;
1239
+ }
1240
+
1241
+ interface SelectOption extends DropdownItem {
1242
+ /** Required value associated with the option */
1243
+ value: string;
1244
+ }
1245
+ /**
1246
+ * Form-friendly select built on the dropdown. Implements FormValueControl for Signal Forms [formField].
1247
+ * Use [(value)] or [formField]="myForm().country".
1248
+ *
1249
+ * @example
1250
+ * <pe-select label="Sort by" [options]="options" [(value)]="selected" />
1251
+ */
1252
+ declare class SelectComponent implements FormValueControl<string | null> {
1253
+ readonly size: _angular_core.InputSignal<UiSize>;
1254
+ readonly theme: _angular_core.InputSignal<ListItemTheme>;
1255
+ readonly label: _angular_core.InputSignal<string | null>;
1256
+ readonly helperText: _angular_core.InputSignal<string | null>;
1257
+ readonly errorText: _angular_core.InputSignal<string | null>;
1258
+ readonly error: _angular_core.InputSignal<boolean>;
1259
+ readonly disabled: _angular_core.InputSignal<boolean>;
1260
+ readonly required: _angular_core.InputSignal<boolean>;
1261
+ readonly placeholder: _angular_core.InputSignal<string>;
1262
+ readonly options: _angular_core.InputSignal<SelectOption[]>;
1263
+ readonly invalid: _angular_core.InputSignal<boolean>;
1264
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
1265
+ readonly value: _angular_core.ModelSignal<string | null>;
1266
+ protected readonly selectedIndex: _angular_core.ModelSignal<number>;
1267
+ protected readonly ids: {
1268
+ controlId: string;
1269
+ helperId: string;
1270
+ errorId: string;
1271
+ };
1272
+ protected readonly items: _angular_core.Signal<DropdownItem[]>;
1273
+ protected readonly hasError: _angular_core.Signal<boolean>;
1274
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
1275
+ constructor();
1276
+ /** Handles index changes coming from the dropdown */
1277
+ protected onSelectedIndexChange(index: number): void;
1278
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent, never>;
1279
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent, "pe-select", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "selectedIndex": "selectedIndexChange"; }, never, never, true, never>;
1280
+ }
1281
+
1282
+ /**
1283
+ * Generates unique IDs for form field elements (control, helper, error).
1284
+ * Use this so label `for`, helper `id`, and `aria-describedby` stay in sync.
1285
+ */
1286
+ declare function createFormFieldIds(prefix: string): {
1287
+ controlId: string;
1288
+ helperId: string;
1289
+ errorId: string;
1290
+ };
1291
+ /**
1292
+ * Builds the value for `aria-describedby` from helper and error IDs.
1293
+ */
1294
+ declare function getFormFieldDescribedBy(helperId: string, errorId: string, hasHelperText: boolean, hasError: boolean, hasErrorText: boolean): string | undefined;
1295
+
1296
+ /**
1297
+ * Shared label for form fields (input, select, textarea).
1298
+ * Renders label text and optional required indicator.
1299
+ */
1300
+ declare class FormFieldLabelComponent {
1301
+ readonly label: _angular_core.InputSignal<string | null>;
1302
+ readonly required: _angular_core.InputSignal<boolean>;
1303
+ readonly for: _angular_core.InputSignal<string>;
1304
+ readonly size: _angular_core.InputSignal<UiSize>;
1305
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldLabelComponent, never>;
1306
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormFieldLabelComponent, "pe-form-field-label", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1307
+ }
1308
+
1309
+ /**
1310
+ * Shared helper/error text for form fields (input, select, textarea).
1311
+ * Shows error text when in error state, otherwise helper text.
1312
+ */
1313
+ declare class FormFieldHelperComponent {
1314
+ readonly id: _angular_core.InputSignal<string>;
1315
+ readonly helperText: _angular_core.InputSignal<string | null>;
1316
+ readonly errorText: _angular_core.InputSignal<string | null>;
1317
+ readonly error: _angular_core.InputSignal<boolean>;
1318
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormFieldHelperComponent, never>;
1319
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormFieldHelperComponent, "pe-form-field-helper", never, { "id": { "alias": "id"; "required": true; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1320
+ }
1321
+
1322
+ type SidebarItem = {
1323
+ label: string;
1324
+ value?: string;
1325
+ leftIcons?: IconName[];
1326
+ rightIcons?: IconName[];
1327
+ disabled?: boolean;
1328
+ };
1329
+ declare class SidebarComponent {
1330
+ items: _angular_core.InputSignal<SidebarItem[]>;
1331
+ theme: _angular_core.InputSignal<ListItemTheme>;
1332
+ selectedIndex: _angular_core.ModelSignal<number>;
1333
+ open: _angular_core.ModelSignal<boolean>;
1334
+ closeOnBackdropClick: _angular_core.InputSignal<boolean>;
1335
+ hideItemFocusOutline: _angular_core.InputSignal<boolean>;
1336
+ itemSelected: _angular_core.OutputEmitterRef<SidebarItem>;
1337
+ close(): void;
1338
+ onOverlayClick(): void;
1339
+ onItemClick(item: SidebarItem, index: number): void;
1340
+ onEscape(): void;
1341
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarComponent, never>;
1342
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidebarComponent, "pe-sidebar", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "hideItemFocusOutline": { "alias": "hideItemFocusOutline"; "required": false; "isSignal": true; }; }, { "selectedIndex": "selectedIndexChange"; "open": "openChange"; "itemSelected": "itemSelected"; }, never, ["[pe-sidebar-header]", "[pe-sidebar-nav]", "[pe-sidebar-footer]"], true, never>;
1343
+ }
1344
+
1345
+ type Status = 'confirm' | 'alert' | 'error' | 'pending' | 'info';
1346
+ declare class StatusComponent {
1347
+ status: _angular_core.InputSignal<Status>;
1348
+ customIcon: _angular_core.InputSignal<string | undefined>;
1349
+ loadingAnimation: _angular_core.InputSignal<boolean>;
1350
+ get icon(): IconName;
1351
+ computedClasses: _angular_core.Signal<{
1352
+ 'pe-status': boolean;
1353
+ 'pe-status--confirm': boolean;
1354
+ 'pe-status--alert': boolean;
1355
+ 'pe-status--error': boolean;
1356
+ 'pe-status--pending': boolean;
1357
+ 'pe-status--info': boolean;
1358
+ }>;
1359
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusComponent, never>;
1360
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusComponent, "pe-status", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "customIcon": { "alias": "customIcon"; "required": false; "isSignal": true; }; "loadingAnimation": { "alias": "loadingAnimation"; "required": false; "isSignal": true; }; }, {}, never, ["[pe-status-title]", "[pe-status-subtitle]", "[pe-status-description]"], true, never>;
1361
+ }
1362
+
1363
+ interface TableColumn {
1364
+ id: string;
1365
+ label: string;
1366
+ sortable?: boolean;
1367
+ filterable?: boolean;
1368
+ }
1369
+ type SortDirection = 'asc' | 'desc';
1370
+ /**
1371
+ * Table component for tabular data with optional sort (per-column) and global filter.
1372
+ * Uses semantic table markup; responsive with horizontal scroll on small viewports.
1373
+ */
1374
+ declare class TableComponent {
1375
+ readonly columns: _angular_core.InputSignal<TableColumn[]>;
1376
+ readonly data: _angular_core.InputSignal<Record<string, unknown>[]>;
1377
+ readonly sortColumn: _angular_core.ModelSignal<string | null>;
1378
+ readonly sortDirection: _angular_core.ModelSignal<SortDirection>;
1379
+ readonly filterPlaceholder: _angular_core.InputSignal<string>;
1380
+ readonly filterLabel: _angular_core.InputSignal<string>;
1381
+ readonly showGlobalFilter: _angular_core.InputSignal<boolean>;
1382
+ readonly emptyMessage: _angular_core.InputSignal<string>;
1383
+ readonly loading: _angular_core.InputSignal<boolean>;
1384
+ readonly sortColumnChange: _angular_core.OutputEmitterRef<{
1385
+ column: string | null;
1386
+ direction: SortDirection;
1387
+ }>;
1388
+ readonly filterChange: _angular_core.OutputEmitterRef<string>;
1389
+ protected readonly filterQuery: _angular_core.WritableSignal<string>;
1390
+ protected readonly hasSortableColumn: _angular_core.Signal<boolean>;
1391
+ protected readonly filteredData: _angular_core.Signal<Record<string, unknown>[]>;
1392
+ protected readonly sortedData: _angular_core.Signal<Record<string, unknown>[]>;
1393
+ protected readonly filterId: string;
1394
+ getCellValue(row: Record<string, unknown>, columnId: string): unknown;
1395
+ onFilterInput(value: string): void;
1396
+ toggleSort(columnId: string): void;
1397
+ getSortAriaSort(columnId: string): 'ascending' | 'descending' | 'none';
1398
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableComponent, never>;
1399
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableComponent, "pe-table", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "sortColumn": { "alias": "sortColumn"; "required": false; "isSignal": true; }; "sortDirection": { "alias": "sortDirection"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "showGlobalFilter": { "alias": "showGlobalFilter"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "sortColumn": "sortColumnChange"; "sortDirection": "sortDirectionChange"; "sortColumnChange": "sortColumnChange"; "filterChange": "filterChange"; }, never, never, true, never>;
1400
+ }
1401
+
1402
+ /**
1403
+ * When projected into pe-textarea, replaces the native textarea with custom content (e.g. Quill).
1404
+ * Use with [pe-textarea-field] on the element to project.
1405
+ */
1406
+ declare class TextareaFieldDirective {
1407
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextareaFieldDirective, never>;
1408
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TextareaFieldDirective, "[pe-textarea-field]", never, {}, {}, never, never, true, never>;
1409
+ }
1410
+
1411
+ type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
1412
+ /**
1413
+ * Reusable textarea. Implements FormValueControl for Signal Forms [formField].
1414
+ * Use [(value)] for two-way binding or [formField]="myForm().message".
1415
+ *
1416
+ * Content projection: [pe-textarea-field] (replaces native textarea), [pe-textarea-left-elements], [pe-textarea-right-elements].
1417
+ */
1418
+ declare class TextareaComponent implements FormValueControl<string> {
1419
+ readonly size: _angular_core.InputSignal<UiSize>;
1420
+ readonly error: _angular_core.InputSignal<boolean>;
1421
+ readonly disabled: _angular_core.InputSignal<boolean>;
1422
+ readonly readOnly: _angular_core.InputSignal<boolean>;
1423
+ readonly required: _angular_core.InputSignal<boolean>;
1424
+ readonly placeholder: _angular_core.InputSignal<string>;
1425
+ readonly label: _angular_core.InputSignal<string | null>;
1426
+ readonly helperText: _angular_core.InputSignal<string | null>;
1427
+ readonly errorText: _angular_core.InputSignal<string | null>;
1428
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
1429
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
1430
+ readonly autocomplete: _angular_core.InputSignal<string>;
1431
+ readonly rows: _angular_core.InputSignal<number>;
1432
+ readonly resize: _angular_core.InputSignal<TextareaResize>;
1433
+ /** When using [pe-textarea-field], pass focus state so the group border reflects it. */
1434
+ readonly groupFocused: _angular_core.InputSignal<boolean | null>;
1435
+ readonly invalid: _angular_core.InputSignal<boolean>;
1436
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalField<ValidationError>[]>;
1437
+ readonly touched: _angular_core.ModelSignal<boolean>;
1438
+ readonly value: _angular_core.ModelSignal<string>;
1439
+ protected readonly customField: _angular_core.Signal<TextareaFieldDirective | undefined>;
1440
+ protected readonly ids: {
1441
+ controlId: string;
1442
+ helperId: string;
1443
+ errorId: string;
1444
+ };
1445
+ protected readonly isFocused: _angular_core.WritableSignal<boolean>;
1446
+ protected readonly isDirty: _angular_core.WritableSignal<boolean>;
1447
+ protected readonly groupFocusedState: _angular_core.Signal<boolean>;
1448
+ protected readonly hasError: _angular_core.Signal<boolean>;
1449
+ protected readonly describedBy: _angular_core.Signal<string | undefined>;
1450
+ readonly inputBlur: _angular_core.OutputEmitterRef<FocusEvent>;
1451
+ readonly inputFocus: _angular_core.OutputEmitterRef<FocusEvent>;
1452
+ readonly valueChange: _angular_core.OutputEmitterRef<string>;
1453
+ constructor();
1454
+ onInput(event: Event): void;
1455
+ onBlur(event: FocusEvent): void;
1456
+ onFocus(event: FocusEvent): void;
1457
+ focus(): void;
1458
+ select(): void;
1459
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextareaComponent, never>;
1460
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "pe-textarea", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "groupFocused": { "alias": "groupFocused"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "value": "valueChange"; "inputBlur": "inputBlur"; "inputFocus": "inputFocus"; "valueChange": "valueChange"; }, ["customField"], ["[pe-textarea-left-elements]", "[pe-textarea-field]", "[pe-textarea-right-elements]"], true, never>;
1461
+ }
1462
+
1463
+ export { AccordionComponent, AccordionItemComponent, AreaCodeComponent, AvatarComponent, AvatarGroupComponent, BreadcrumbComponent, ButtonComponent, CalendarComponent, CardComponent, CarouselComponent, CarouselItemComponent, CheckboxComponent, CollapseComponent, CustomCurrencyPipe, DropdownComponent, FileInputComponent, FooterComponent, FormFieldHelperComponent, FormFieldLabelComponent, HeroComponent, IconComponent, ImageNotFoundDirective, InputComponent, ListItemComponent, ModalComponent, NavbarAvatarSlotDirective, NavbarComponent, NavbarLogoSlotDirective, NavbarSearchSlotDirective, PeHeroActionsSlotDirective, PeHeroBadgesSlotDirective, PeHeroContentSlotDirective, PeHeroSubtitleSlotDirective, PeHeroTitleSlotDirective, PillComponent, PriceButtonComponent, RadialComponent, RadioComponent, RadioGroupComponent, RichTextComponent, SearchSelectComponent, SelectComponent, SidebarComponent, SkeletonComponent, StatusComponent, TableComponent, TextareaComponent, TextareaFieldDirective, ToastContainerComponent, TooltipComponent, createFormFieldIds, getFormFieldDescribedBy };
1464
+ export type { ActionsDistribution, AvatarData, BreadcrumbItem, BreadcrumbSeparator, CalendarDay, CalendarMode, CardCaptionSize, CardDirection, CheckboxZoneType, CollapseVariant, Currency, DropdownItem, FileInputAppearance, HeroAction, HeroAlignment, HeroSize, IconName, IconSize, IconWeight, InputAppearance, InputType, ListItemTheme, MediaAspectRatio, ModalVariant, PillSize, PillTheme, PillVariant, RadioGroupOption, RichTextSize, RichTextTone, SalePosition, SearchSelectOption, SelectOption, SidebarItem, SkeletonBorderRadius, SkeletonVariant, SortDirection, Status, TableColumn, TextareaResize, TimeSelection, TooltipPosition };