ngx-com 0.1.1 → 0.1.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-com",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "license": "MIT",
5
5
  "description": "A modern Angular component library built with signals, Tailwind CSS, and semantic design tokens",
6
6
  "keywords": [
@@ -504,8 +504,8 @@ declare class ComCalendar<D> {
504
504
  private readonly monthViews;
505
505
  /** The date to display and navigate from */
506
506
  readonly activeDate: InputSignal<D | undefined>;
507
- /** The currently selected date or date range */
508
- readonly selected: InputSignal<D | DateRange<D> | null>;
507
+ /** The currently selected date, date range, or array of dates (multi-selection) */
508
+ readonly selected: InputSignal<D | D[] | DateRange<D> | null>;
509
509
  /** Minimum selectable date */
510
510
  readonly minDate: InputSignal<D | null>;
511
511
  /** Maximum selectable date */
@@ -635,8 +635,8 @@ declare abstract class CalendarViewBase<D> {
635
635
  protected readonly dateAdapter: DateAdapter<D>;
636
636
  /** The date to display and navigate from */
637
637
  readonly activeDate: InputSignal<D>;
638
- /** The currently selected date or date range */
639
- readonly selected: InputSignal<D | DateRange<D> | null>;
638
+ /** The currently selected date, date range, or array of dates (multi-selection) */
639
+ readonly selected: InputSignal<D | D[] | DateRange<D> | null>;
640
640
  /** Minimum selectable date */
641
641
  readonly minDate: InputSignal<D | null>;
642
642
  /** Maximum selectable date */
@@ -711,7 +711,7 @@ declare abstract class CalendarViewBase<D> {
711
711
  /**
712
712
  * Type guard to check if a value is a DateRange.
713
713
  */
714
- protected isDateRange(value: D | DateRange<D>): value is DateRange<D>;
714
+ protected isDateRange(value: D | D[] | DateRange<D>): value is DateRange<D>;
715
715
  /**
716
716
  * Handles cell selection events.
717
717
  */
@@ -236,6 +236,16 @@ declare class ComDatepicker<D> implements ControlValueAccessor, FormFieldControl
236
236
  readonly showSeconds: InputSignal<boolean>;
237
237
  /** Step interval for minutes in the time picker. */
238
238
  readonly minuteStep: InputSignal<number>;
239
+ /**
240
+ * When true, date/time selections while the panel is open update only the visual state.
241
+ * The value is committed (emitted via `dateChange`, propagated to forms) only when
242
+ * the user presses "Done". Closing via Escape or backdrop click reverts to the
243
+ * pre-open value without emitting.
244
+ *
245
+ * All in-panel actions (date selection, time change, today, footer clear) are buffered.
246
+ * The trigger clear button (panel closed) always commits immediately.
247
+ */
248
+ readonly commitOnClose: InputSignal<boolean>;
239
249
  /** Emitted when a date is selected. */
240
250
  readonly dateChange: OutputEmitterRef<D | null>;
241
251
  /** Emitted when the panel opens. */
@@ -248,6 +258,11 @@ declare class ComDatepicker<D> implements ControlValueAccessor, FormFieldControl
248
258
  readonly internalValue: WritableSignal<D | null>;
249
259
  /** Calendar active date for navigation. Recomputes when value or startAt changes; user navigation overrides via .set(). */
250
260
  readonly calendarActiveDate: WritableSignal<D>;
261
+ /**
262
+ * Snapshot of the value when the panel was opened.
263
+ * Used by `commitOnClose` to revert on Escape/backdrop close.
264
+ */
265
+ private readonly committedValue;
251
266
  /** Live announcements for screen readers. */
252
267
  readonly liveAnnouncement: WritableSignal<string>;
253
268
  /** Whether the input is focused (not panel). */
@@ -305,7 +320,7 @@ declare class ComDatepicker<D> implements ControlValueAccessor, FormFieldControl
305
320
  readonly timeValue: Signal<ComTimeValue | null>;
306
321
  /** Effective display format — switches to dateTime when time picker is shown. */
307
322
  readonly effectiveDateFormat: Signal<DateFormatPreset>;
308
- /** Whether the panel should stay open (keepOpen or time picker shown). */
323
+ /** Whether the panel should stay open (keepOpen, time picker shown, or commitOnClose). */
309
324
  readonly effectiveKeepOpen: Signal<boolean>;
310
325
  private onChange;
311
326
  private onTouched;
@@ -320,13 +335,15 @@ declare class ComDatepicker<D> implements ControlValueAccessor, FormFieldControl
320
335
  registerOnValidatorChange(fn: () => void): void;
321
336
  /** Opens the datepicker panel. */
322
337
  open(): void;
323
- /** Closes the datepicker panel. */
338
+ /** Closes the datepicker panel. Reverts buffered changes when `commitOnClose` is active. */
324
339
  close(): void;
340
+ /** Commits the buffered value and closes the panel. Called by the Done button. */
341
+ protected commitAndClose(): void;
325
342
  /** Toggles the datepicker panel. */
326
343
  toggle(): void;
327
- /** Clears the selected date. */
344
+ /** Clears the selected date. Buffered when commitOnClose is active and panel is open. */
328
345
  clear(event?: Event): void;
329
- /** Selects today's date. */
346
+ /** Selects today's date. Buffered when commitOnClose is active and panel is open. */
330
347
  selectToday(): void;
331
348
  protected onInputFocus(): void;
332
349
  protected onTriggerClick(): void;
@@ -360,7 +377,7 @@ declare class ComDatepicker<D> implements ControlValueAccessor, FormFieldControl
360
377
  private isDateValid;
361
378
  private announce;
362
379
  static ɵfac: i0.ɵɵFactoryDeclaration<ComDatepicker<any>, never>;
363
- static ɵcmp: i0.ɵɵComponentDeclaration<ComDatepicker<any>, "com-datepicker", ["comDatepicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "dateChange": "dateChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
380
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComDatepicker<any>, "com-datepicker", ["comDatepicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "commitOnClose": { "alias": "commitOnClose"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "dateChange": "dateChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
364
381
  }
365
382
 
366
383
  /**
@@ -473,6 +490,16 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, FormFieldCo
473
490
  readonly showSeconds: InputSignal<boolean>;
474
491
  /** Step interval for minutes in the time pickers. */
475
492
  readonly minuteStep: InputSignal<number>;
493
+ /**
494
+ * When true, range/time selections while the panel is open update only the visual state.
495
+ * The value is committed (emitted via `rangeChange`, propagated to forms) only when
496
+ * the user presses "Done". Closing via Escape or backdrop click reverts to the
497
+ * pre-open value without emitting.
498
+ *
499
+ * All in-panel actions (range selection, time change, today, footer clear) are buffered.
500
+ * The trigger clear button (panel closed) always commits immediately.
501
+ */
502
+ readonly commitOnClose: InputSignal<boolean>;
476
503
  /** Emitted when a complete range is selected. */
477
504
  readonly rangeChange: OutputEmitterRef<DateRangeValue<D> | null>;
478
505
  /** Emitted when the panel opens. */
@@ -487,6 +514,11 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, FormFieldCo
487
514
  readonly internalValue: WritableSignal<DateRangeValue<D> | null>;
488
515
  /** Calendar active date for navigation. Recomputes when value or startAt changes; user navigation overrides via .set(). */
489
516
  readonly calendarActiveDate: WritableSignal<D>;
517
+ /**
518
+ * Snapshot of the value when the panel was opened.
519
+ * Used by `commitOnClose` to revert on Escape/backdrop close.
520
+ */
521
+ private readonly committedValue;
490
522
  /** Live announcements for screen readers. */
491
523
  readonly liveAnnouncement: WritableSignal<string>;
492
524
  /** Whether any input is focused. */
@@ -555,7 +587,7 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, FormFieldCo
555
587
  readonly endTimeValue: Signal<ComTimeValue | null>;
556
588
  /** Effective display format — switches to dateTime when time picker is shown. */
557
589
  readonly effectiveDateFormat: Signal<DateFormatPreset>;
558
- /** Whether the panel should stay open (keepOpen or time picker shown). */
590
+ /** Whether the panel should stay open (keepOpen, time picker shown, or commitOnClose). */
559
591
  readonly effectiveKeepOpen: Signal<boolean>;
560
592
  private onChange;
561
593
  private onTouched;
@@ -570,13 +602,15 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, FormFieldCo
570
602
  registerOnValidatorChange(fn: () => void): void;
571
603
  /** Opens the datepicker panel. */
572
604
  open(): void;
573
- /** Closes the datepicker panel. */
605
+ /** Closes the datepicker panel. Reverts buffered changes when `commitOnClose` is active. */
574
606
  close(): void;
607
+ /** Commits the buffered value and closes the panel. Called by the Done button. */
608
+ protected commitAndClose(): void;
575
609
  /** Toggles the datepicker panel. */
576
610
  toggle(): void;
577
- /** Clears the selected date range. */
611
+ /** Clears the selected date range. Buffered when commitOnClose is active and panel is open. */
578
612
  clear(event?: Event): void;
579
- /** Selects today's date as the start date. */
613
+ /** Selects today's date as the start date. Buffered when commitOnClose is active and panel is open. */
580
614
  selectToday(): void;
581
615
  protected onTriggerClick(): void;
582
616
  protected onTriggerKeydown(event: KeyboardEvent): void;
@@ -616,7 +650,7 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, FormFieldCo
616
650
  private formatDate;
617
651
  private announce;
618
652
  static ɵfac: i0.ɵɵFactoryDeclaration<ComDateRangePicker<any>, never>;
619
- static ɵcmp: i0.ɵɵComponentDeclaration<ComDateRangePicker<any>, "com-date-range-picker", ["comDateRangePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "startAriaLabel": { "alias": "startAriaLabel"; "required": false; "isSignal": true; }; "endAriaLabel": { "alias": "endAriaLabel"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "rangeChange": "rangeChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
653
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComDateRangePicker<any>, "com-date-range-picker", ["comDateRangePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "startAriaLabel": { "alias": "startAriaLabel"; "required": false; "isSignal": true; }; "endAriaLabel": { "alias": "endAriaLabel"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "commitOnClose": { "alias": "commitOnClose"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "rangeChange": "rangeChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
620
654
  }
621
655
 
622
656
  export { ComDateRangePicker, ComDatepicker, createDateRangeValue, datepickerClearVariants, datepickerDisabledVariants, datepickerFooterButtonVariants, datepickerFooterVariants, datepickerIconVariants, datepickerInputVariants, datepickerPanelVariants, datepickerRangeSeparatorVariants, datepickerTriggerVariants, generateDatepickerId };
@@ -294,6 +294,30 @@ declare class ComDropdownTagTpl<T> {
294
294
  static ɵdir: i0.ɵɵDirectiveDeclaration<ComDropdownTagTpl<any>, "ng-template[comDropdownTag]", never, {}, {}, never, never, true, never>;
295
295
  }
296
296
 
297
+ /**
298
+ * Directive to mark a template as the custom loading indicator template.
299
+ *
300
+ * @tokens none
301
+ *
302
+ * @example
303
+ * ```html
304
+ * <com-dropdown [options]="users()" [loading]="isLoading()">
305
+ * <ng-template comDropdownLoading>
306
+ * <div class="flex items-center gap-2 p-3">
307
+ * <com-spinner size="xs" color="primary" />
308
+ * <span class="text-sm text-muted-foreground">Fetching more results...</span>
309
+ * </div>
310
+ * </ng-template>
311
+ * </com-dropdown>
312
+ * ```
313
+ */
314
+ declare class ComDropdownLoadingTpl {
315
+ /** Reference to the template. */
316
+ readonly templateRef: TemplateRef<void>;
317
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComDropdownLoadingTpl, never>;
318
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ComDropdownLoadingTpl, "ng-template[comDropdownLoading]", never, {}, {}, never, never, true, never>;
319
+ }
320
+
297
321
  /**
298
322
  * Variant type for dropdown trigger appearance.
299
323
  */
@@ -424,6 +448,15 @@ declare const dropdownChevronVariants: (props?: {
424
448
  open?: boolean;
425
449
  }) => string;
426
450
  type DropdownChevronVariants = VariantProps<typeof dropdownChevronVariants>;
451
+ /**
452
+ * CVA variants for the loading indicator container.
453
+ *
454
+ * @tokens `--color-muted-foreground`
455
+ */
456
+ declare const dropdownLoadingVariants: (props?: {
457
+ size?: DropdownSize;
458
+ }) => string;
459
+ type DropdownLoadingVariants = VariantProps<typeof dropdownLoadingVariants>;
427
460
 
428
461
  /**
429
462
  * Reusable dropdown/select component with full accessibility support.
@@ -478,6 +511,8 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
478
511
  protected readonly groupTemplate: Signal<ComDropdownGroupTpl | undefined>;
479
512
  /** Content query for custom tag template. */
480
513
  protected readonly tagTemplate: Signal<ComDropdownTagTpl<T> | undefined>;
514
+ /** Content query for custom loading template. */
515
+ protected readonly loadingTemplate: Signal<ComDropdownLoadingTpl | undefined>;
481
516
  /** Overlay reference. */
482
517
  private overlayRef;
483
518
  /** Unique ID for the dropdown. */
@@ -532,6 +567,8 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
532
567
  readonly maxVisibleTags: InputSignal<number | null>;
533
568
  /** Custom error state matcher for determining when to show errors. */
534
569
  readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined>;
570
+ /** Whether the dropdown is currently loading data. */
571
+ readonly loading: InputSignal<boolean>;
535
572
  readonly touched: ModelSignal<boolean>;
536
573
  readonly invalid: InputSignal<boolean>;
537
574
  readonly sfErrors: InputSignal<readonly unknown[]>;
@@ -541,6 +578,8 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
541
578
  readonly opened: OutputEmitterRef<void>;
542
579
  /** Emitted when panel closes. */
543
580
  readonly closed: OutputEmitterRef<void>;
581
+ /** Emitted when user scrolls near the bottom of the option list. */
582
+ readonly loadMore: OutputEmitterRef<void>;
544
583
  /** Whether the panel is open. */
545
584
  readonly isOpen: WritableSignal<boolean>;
546
585
  /** Whether the trigger button is focused. */
@@ -553,6 +592,12 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
553
592
  readonly internalValue: WritableSignal<T | T[] | null>;
554
593
  /** Live announcements for screen readers. */
555
594
  readonly liveAnnouncement: WritableSignal<string>;
595
+ /** Flag to prevent duplicate loadMore emissions per scroll-to-bottom. */
596
+ private loadMoreEmitted;
597
+ /** Subscription for virtual scroll elementScrolled. */
598
+ private scrollSubscription;
599
+ /** Throttled handler for standard scroll events. */
600
+ private throttledScrollHandler;
556
601
  /** IDs for aria-describedby (set by form-field). */
557
602
  private readonly _describedByIds;
558
603
  /** Form field appearance (set by form-field). */
@@ -612,6 +657,8 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
612
657
  readonly clearClasses: Signal<string>;
613
658
  /** Computed overflow badge classes. */
614
659
  readonly overflowBadgeClasses: Signal<string>;
660
+ /** Computed loading container classes. */
661
+ readonly loadingContainerClasses: Signal<string>;
615
662
  private onChange;
616
663
  private onTouched;
617
664
  constructor();
@@ -679,8 +726,12 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
679
726
  private flattenGroupedOptions;
680
727
  private typeAhead;
681
728
  private announce;
729
+ /** Sets up scroll detection for the loadMore output. SSR-safe: only called from user interaction. */
730
+ private setupScrollDetection;
731
+ /** Cleans up scroll detection listeners. */
732
+ private cleanupScrollDetection;
682
733
  static ɵfac: i0.ɵɵFactoryDeclaration<ComDropdown<any>, never>;
683
- static ɵcmp: i0.ɵɵComponentDeclaration<ComDropdown<any>, "com-dropdown", ["comDropdown"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "filterWith": { "alias": "filterWith"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "searchDebounceMs": { "alias": "searchDebounceMs"; "required": false; "isSignal": true; }; "virtualScrollThreshold": { "alias": "virtualScrollThreshold"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "maxVisibleTags": { "alias": "maxVisibleTags"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; }, ["optionTemplate", "selectedTemplate", "emptyTemplate", "groupTemplate", "tagTemplate"], never, true, never>;
734
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComDropdown<any>, "com-dropdown", ["comDropdown"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "filterWith": { "alias": "filterWith"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "searchDebounceMs": { "alias": "searchDebounceMs"; "required": false; "isSignal": true; }; "virtualScrollThreshold": { "alias": "virtualScrollThreshold"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "maxVisibleTags": { "alias": "maxVisibleTags"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; "loadMore": "loadMore"; }, ["optionTemplate", "selectedTemplate", "emptyTemplate", "groupTemplate", "tagTemplate", "loadingTemplate"], never, true, never>;
684
735
  }
685
736
 
686
737
  /**
@@ -957,5 +1008,5 @@ declare class ComDropdownGroup {
957
1008
  static ɵcmp: i0.ɵɵComponentDeclaration<ComDropdownGroup, "com-dropdown-group", ["comDropdownGroup"], { "label": { "alias": "label"; "required": true; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "showCount": { "alias": "showCount"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "groupTemplate": { "alias": "groupTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
958
1009
  }
959
1010
 
960
- export { ComDropdown, ComDropdownEmptyTpl, ComDropdownGroup, ComDropdownGroupTpl, ComDropdownOption, ComDropdownOptionTpl, ComDropdownPanel, ComDropdownSearch, ComDropdownSelectedTpl, ComDropdownTag, ComDropdownTagTpl, defaultCompareWith, defaultDisplayWith, defaultFilterWith, dropdownChevronVariants, dropdownClearVariants, dropdownEmptyVariants, dropdownGroupVariants, dropdownOptionVariants, dropdownOverflowBadgeVariants, dropdownPanelVariants, dropdownSearchVariants, dropdownTagRemoveVariants, dropdownTagVariants, dropdownTriggerVariants, generateDropdownId };
961
- export type { ComDropdownEmptyContext, ComDropdownGroupContext, ComDropdownGroup$1 as ComDropdownGroupData, ComDropdownOptionContext, ComDropdownPanelWidth, ComDropdownPosition, ComDropdownProcessedOption, ComDropdownSelectedContext, ComDropdownTagContext, DropdownChevronVariants, DropdownClearVariants, DropdownEmptyVariants, DropdownGroupVariants, DropdownOptionVariants, DropdownOverflowBadgeVariants, DropdownPanelVariants, DropdownSearchVariants, DropdownSize, DropdownState, DropdownTagRemoveVariants, DropdownTagVariants, DropdownTriggerVariants, DropdownVariant };
1011
+ export { ComDropdown, ComDropdownEmptyTpl, ComDropdownGroup, ComDropdownGroupTpl, ComDropdownLoadingTpl, ComDropdownOption, ComDropdownOptionTpl, ComDropdownPanel, ComDropdownSearch, ComDropdownSelectedTpl, ComDropdownTag, ComDropdownTagTpl, defaultCompareWith, defaultDisplayWith, defaultFilterWith, dropdownChevronVariants, dropdownClearVariants, dropdownEmptyVariants, dropdownGroupVariants, dropdownLoadingVariants, dropdownOptionVariants, dropdownOverflowBadgeVariants, dropdownPanelVariants, dropdownSearchVariants, dropdownTagRemoveVariants, dropdownTagVariants, dropdownTriggerVariants, generateDropdownId };
1012
+ export type { ComDropdownEmptyContext, ComDropdownGroupContext, ComDropdownGroup$1 as ComDropdownGroupData, ComDropdownOptionContext, ComDropdownPanelWidth, ComDropdownPosition, ComDropdownProcessedOption, ComDropdownSelectedContext, ComDropdownTagContext, DropdownChevronVariants, DropdownClearVariants, DropdownEmptyVariants, DropdownGroupVariants, DropdownLoadingVariants, DropdownOptionVariants, DropdownOverflowBadgeVariants, DropdownPanelVariants, DropdownSearchVariants, DropdownSize, DropdownState, DropdownTagRemoveVariants, DropdownTagVariants, DropdownTriggerVariants, DropdownVariant };
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { TemplateRef, InputSignal, Signal, InputSignalWithTransform, TrackByFunction } from '@angular/core';
2
+ import { TemplateRef, InputSignal, Signal, InputSignalWithTransform, TrackByFunction, InjectionToken, OutputEmitterRef } from '@angular/core';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  /**
@@ -259,39 +259,45 @@ declare const tableHeaderVariants: (props?: {
259
259
  }) => string;
260
260
  type TableHeaderVariants = VariantProps<typeof tableHeaderVariants>;
261
261
  /**
262
- * CVA variants for `<th>` header cells.
262
+ * CVA variants for the header `<tr>` — applies base styles to child `<th>` cells via child selectors.
263
263
  *
264
264
  * @tokens `--color-muted-foreground`
265
265
  */
266
- declare const tableHeaderCellVariants: (props?: {
266
+ declare const tableHeaderRowVariants: (props?: {
267
267
  density?: TableDensity;
268
268
  }) => string;
269
- type TableHeaderCellVariants = VariantProps<typeof tableHeaderCellVariants>;
269
+ type TableHeaderRowVariants = VariantProps<typeof tableHeaderRowVariants>;
270
270
  /**
271
- * CVA variants for `<tbody> <tr>` rows.
271
+ * CVA variants for `<tbody> <tr>` rows — includes row-level styles and child `<td>` cell styles.
272
272
  *
273
273
  * @tokens `--color-border-subtle`, `--color-muted`, `--color-muted-hover`
274
274
  */
275
275
  declare const tableRowVariants: (props?: {
276
276
  variant?: TableVariant;
277
- }) => string;
278
- type TableRowVariants = VariantProps<typeof tableRowVariants>;
279
- /**
280
- * CVA variants for `<td>` body cells.
281
- */
282
- declare const tableBodyCellVariants: (props?: {
283
277
  density?: TableDensity;
284
278
  }) => string;
285
- type TableBodyCellVariants = VariantProps<typeof tableBodyCellVariants>;
279
+ type TableRowVariants = VariantProps<typeof tableRowVariants>;
286
280
  /**
287
- * CVA variants for `<tfoot> <td>` footer cells.
281
+ * CVA variants for the footer `<tr>` — applies base styles to child `<td>` cells via child selectors.
288
282
  *
289
283
  * @tokens `--color-foreground`, `--color-border`
290
284
  */
291
- declare const tableFooterCellVariants: (props?: {
285
+ declare const tableFooterRowVariants: (props?: {
292
286
  density?: TableDensity;
293
287
  }) => string;
294
- type TableFooterCellVariants = VariantProps<typeof tableFooterCellVariants>;
288
+ type TableFooterRowVariants = VariantProps<typeof tableFooterRowVariants>;
289
+ /** @deprecated Use `tableHeaderRowVariants` instead. */
290
+ declare const tableHeaderCellVariants: typeof tableHeaderRowVariants;
291
+ /** @deprecated Use `tableHeaderRowVariants` instead. */
292
+ type TableHeaderCellVariants = TableHeaderRowVariants;
293
+ /** @deprecated Body cell styles are now part of `tableRowVariants`. */
294
+ declare const tableBodyCellVariants: typeof tableRowVariants;
295
+ /** @deprecated Body cell styles are now part of `tableRowVariants`. */
296
+ type TableBodyCellVariants = TableRowVariants;
297
+ /** @deprecated Use `tableFooterRowVariants` instead. */
298
+ declare const tableFooterCellVariants: typeof tableFooterRowVariants;
299
+ /** @deprecated Use `tableFooterRowVariants` instead. */
300
+ type TableFooterCellVariants = TableFooterRowVariants;
295
301
 
296
302
  /**
297
303
  * Declarative data table component using native HTML `<table>` semantics.
@@ -339,6 +345,7 @@ type TableFooterCellVariants = VariantProps<typeof tableFooterCellVariants>;
339
345
  */
340
346
  declare class ComTable<T> {
341
347
  private readonly destroyRef;
348
+ private readonly rowClickRef;
342
349
  /** The data to render — accepts a plain array or a ComDataSource. */
343
350
  readonly dataSource: InputSignal<ComTableDataSourceInput<T>>;
344
351
  /** Track function for `@for`. Defaults to tracking by index. */
@@ -369,23 +376,92 @@ declare class ComTable<T> {
369
376
  readonly renderData: Signal<readonly T[]>;
370
377
  /** @internal Header column names. */
371
378
  protected readonly headerColumns: Signal<string[]>;
372
- /** @internal Body column names. */
373
- protected readonly bodyColumns: Signal<string[]>;
379
+ /** @internal Body column names — public for ComRowClick event delegation. */
380
+ readonly bodyColumns: Signal<string[]>;
374
381
  /** @internal Footer column names. */
375
382
  protected readonly footerColumns: Signal<string[]>;
376
383
  /** @internal Whether the header should be sticky. */
377
384
  private readonly isSticky;
385
+ /** @internal Whether body rows are clickable (ComRowClick directive is active). */
386
+ protected readonly isRowClickable: Signal<boolean>;
378
387
  protected readonly containerClasses: Signal<string>;
379
388
  protected readonly tableClasses: Signal<string>;
380
389
  protected readonly theadClasses: Signal<string>;
381
- protected readonly thClasses: Signal<string>;
390
+ protected readonly headerTrClasses: Signal<string>;
382
391
  protected readonly trClasses: Signal<string>;
383
- protected readonly tdClasses: Signal<string>;
384
- protected readonly tfootTdClasses: Signal<string>;
392
+ protected readonly footerTrClasses: Signal<string>;
385
393
  constructor();
386
394
  static ɵfac: i0.ɵɵFactoryDeclaration<ComTable<any>, never>;
387
395
  static ɵcmp: i0.ɵɵComponentDeclaration<ComTable<any>, "com-table", ["comTable"], { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, ["columnDefs", "headerRowDef", "rowDef", "footerRowDef", "noDataRow"], never, true, never>;
388
396
  }
389
397
 
390
- export { ComArrayDataSource, ComCellDef, ComColumnDef, ComDataSource, ComFooterCellDef, ComFooterRowDef, ComHeaderCellDef, ComHeaderRowDef, ComNoDataRow, ComRowDef, ComTable, isDataSource, tableBodyCellVariants, tableContainerVariants, tableFooterCellVariants, tableHeaderCellVariants, tableHeaderVariants, tableRowVariants, tableVariants };
391
- export type { CellDefContext, ComTableDataSourceInput, TableBodyCellVariants, TableContainerVariants, TableDensity, TableFooterCellVariants, TableHeaderCellVariants, TableHeaderVariants, TableRowVariants, TableVariant, TableVariants };
398
+ /** Data context that ComTable pushes to ComRowClick to avoid circular DI. */
399
+ interface ComRowClickContext<T = unknown> {
400
+ readonly renderData: Signal<readonly T[]>;
401
+ readonly bodyColumns: Signal<string[]>;
402
+ }
403
+ /** Minimal interface that ComTable reads to detect an active row-click directive. */
404
+ interface ComRowClickRef<T = unknown> {
405
+ /** Whether row-click behavior is currently active (exists and not disabled). */
406
+ readonly isActive: Signal<boolean>;
407
+ /** Called by ComTable to provide data context — avoids circular injection. */
408
+ _setContext(ctx: ComRowClickContext<T>): void;
409
+ }
410
+ /**
411
+ * Injection token used by ComTable to optionally detect a ComRowClick directive.
412
+ * Breaks the circular dependency between ComTable and ComRowClick.
413
+ */
414
+ declare const COM_ROW_CLICK: InjectionToken<ComRowClickRef>;
415
+
416
+ /**
417
+ * Attribute directive that enables click-to-act on `<com-table>` body rows.
418
+ *
419
+ * Uses event delegation — a single click/keydown listener on the `<table>` element —
420
+ * rather than per-row bindings. When a user clicks or presses Enter/Space on a body row,
421
+ * the directive resolves the row data and emits it, unless the click originated from an
422
+ * excluded column's cell.
423
+ *
424
+ * @tokens `--color-ring`
425
+ *
426
+ * @example Basic
427
+ * ```html
428
+ * <com-table [dataSource]="users()" comRowClick (comRowClick)="openDetail($event)">
429
+ * ...
430
+ * </com-table>
431
+ * ```
432
+ *
433
+ * @example With column exclusion
434
+ * ```html
435
+ * <com-table [dataSource]="users()" comRowClick
436
+ * [comRowClickExclude]="['select', 'actions']"
437
+ * (comRowClick)="openDetail($event)">
438
+ * ...
439
+ * </com-table>
440
+ * ```
441
+ */
442
+ declare class ComRowClick<T = unknown> implements ComRowClickRef<T> {
443
+ private readonly elementRef;
444
+ private readonly renderer;
445
+ private readonly destroyRef;
446
+ private readonly document;
447
+ /** @internal Context pushed by ComTable — avoids circular DI. */
448
+ private context;
449
+ /** Column names whose cells do NOT trigger the row click output. */
450
+ readonly comRowClickExclude: InputSignal<string[]>;
451
+ /** Disables all row click behavior — removes cursor, tabindex, and event handling. */
452
+ readonly comRowClickDisabled: InputSignalWithTransform<boolean, unknown>;
453
+ /** Emits the row data object when a non-excluded cell is clicked or activated via keyboard. */
454
+ readonly comRowClick: OutputEmitterRef<T>;
455
+ /** Whether row-click behavior is currently active. */
456
+ readonly isActive: Signal<boolean>;
457
+ /** @internal Called by ComTable to provide data context. */
458
+ _setContext(ctx: ComRowClickContext<T>): void;
459
+ constructor();
460
+ private handleEvent;
461
+ private emitRow;
462
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComRowClick<any>, never>;
463
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ComRowClick<any>, "com-table[comRowClick]", ["comRowClick"], { "comRowClickExclude": { "alias": "comRowClickExclude"; "required": false; "isSignal": true; }; "comRowClickDisabled": { "alias": "comRowClickDisabled"; "required": false; "isSignal": true; }; }, { "comRowClick": "comRowClick"; }, never, never, true, never>;
464
+ }
465
+
466
+ export { COM_ROW_CLICK, ComArrayDataSource, ComCellDef, ComColumnDef, ComDataSource, ComFooterCellDef, ComFooterRowDef, ComHeaderCellDef, ComHeaderRowDef, ComNoDataRow, ComRowClick, ComRowDef, ComTable, isDataSource, tableBodyCellVariants, tableContainerVariants, tableFooterCellVariants, tableFooterRowVariants, tableHeaderCellVariants, tableHeaderRowVariants, tableHeaderVariants, tableRowVariants, tableVariants };
467
+ export type { CellDefContext, ComRowClickRef, ComTableDataSourceInput, TableBodyCellVariants, TableContainerVariants, TableDensity, TableFooterCellVariants, TableFooterRowVariants, TableHeaderCellVariants, TableHeaderRowVariants, TableHeaderVariants, TableRowVariants, TableVariant, TableVariants };