@radix-ng/primitives 1.0.0-beta.1 → 1.0.0-beta.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.
Files changed (107) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +76 -6
  3. package/fesm2022/radix-ng-primitives-accordion.mjs +2 -2
  4. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  5. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +30 -24
  6. package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs +1786 -0
  8. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -0
  9. package/fesm2022/radix-ng-primitives-calendar.mjs +14 -1
  10. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  11. package/fesm2022/radix-ng-primitives-checkbox.mjs +2 -2
  12. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  13. package/fesm2022/radix-ng-primitives-collapsible.mjs +1 -1
  14. package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
  15. package/fesm2022/radix-ng-primitives-combobox.mjs +1983 -0
  16. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -0
  17. package/fesm2022/radix-ng-primitives-context-menu.mjs +1 -1
  18. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  19. package/fesm2022/radix-ng-primitives-core.mjs +480 -469
  20. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  21. package/fesm2022/radix-ng-primitives-cropper.mjs +1 -1
  22. package/fesm2022/radix-ng-primitives-cropper.mjs.map +1 -1
  23. package/fesm2022/radix-ng-primitives-date-field.mjs +11 -0
  24. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  25. package/fesm2022/radix-ng-primitives-dialog.mjs +44 -46
  26. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  27. package/fesm2022/radix-ng-primitives-drawer.mjs +154 -64
  28. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  29. package/fesm2022/radix-ng-primitives-editable.mjs +1 -1
  30. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  31. package/fesm2022/radix-ng-primitives-field.mjs +86 -6
  32. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  33. package/fesm2022/radix-ng-primitives-fieldset.mjs +1 -1
  34. package/fesm2022/radix-ng-primitives-fieldset.mjs.map +1 -1
  35. package/fesm2022/radix-ng-primitives-focus-scope.mjs +1 -1
  36. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  37. package/fesm2022/radix-ng-primitives-form.mjs +207 -0
  38. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -0
  39. package/fesm2022/radix-ng-primitives-input.mjs +85 -4
  40. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  41. package/fesm2022/radix-ng-primitives-menu.mjs +44 -24
  42. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  43. package/fesm2022/radix-ng-primitives-menubar.mjs +1 -1
  44. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-meter.mjs +1 -1
  46. package/fesm2022/radix-ng-primitives-meter.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +39 -55
  48. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-number-field.mjs +2 -2
  50. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  51. package/fesm2022/radix-ng-primitives-popover.mjs +36 -51
  52. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  53. package/fesm2022/radix-ng-primitives-popper.mjs +12 -6
  54. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  55. package/fesm2022/radix-ng-primitives-portal.mjs +107 -17
  56. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  57. package/fesm2022/radix-ng-primitives-presence.mjs +262 -79
  58. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  59. package/fesm2022/radix-ng-primitives-preview-card.mjs +37 -51
  60. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  61. package/fesm2022/radix-ng-primitives-progress.mjs +1 -1
  62. package/fesm2022/radix-ng-primitives-progress.mjs.map +1 -1
  63. package/fesm2022/radix-ng-primitives-roving-focus.mjs +1 -1
  64. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  65. package/fesm2022/radix-ng-primitives-scroll-area.mjs +3 -3
  66. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  67. package/fesm2022/radix-ng-primitives-select.mjs +469 -258
  68. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  69. package/fesm2022/radix-ng-primitives-slider.mjs +1 -1
  70. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  71. package/fesm2022/radix-ng-primitives-switch.mjs +3 -2
  72. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  73. package/fesm2022/radix-ng-primitives-tabs.mjs +1 -1
  74. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  75. package/fesm2022/radix-ng-primitives-time-field.mjs +27 -3
  76. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  77. package/fesm2022/radix-ng-primitives-toast.mjs +1 -1
  78. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  79. package/fesm2022/radix-ng-primitives-toggle-group.mjs +1 -1
  80. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  81. package/fesm2022/radix-ng-primitives-toolbar.mjs +2 -2
  82. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  83. package/fesm2022/radix-ng-primitives-tooltip.mjs +39 -42
  84. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  85. package/package.json +13 -1
  86. package/schematics/ng-add/index.js +57 -0
  87. package/schematics/ng-add/index.js.map +1 -1
  88. package/schematics/ng-add/schema.d.ts +1 -0
  89. package/schematics/ng-add/schema.json +6 -0
  90. package/types/radix-ng-primitives-alert-dialog.d.ts +17 -11
  91. package/types/radix-ng-primitives-autocomplete.d.ts +596 -0
  92. package/types/radix-ng-primitives-combobox.d.ts +1310 -0
  93. package/types/radix-ng-primitives-core.d.ts +148 -56
  94. package/types/radix-ng-primitives-dialog.d.ts +32 -25
  95. package/types/radix-ng-primitives-drawer.d.ts +49 -22
  96. package/types/radix-ng-primitives-field.d.ts +71 -2
  97. package/types/radix-ng-primitives-form.d.ts +124 -0
  98. package/types/radix-ng-primitives-input.d.ts +75 -5
  99. package/types/radix-ng-primitives-menu.d.ts +19 -10
  100. package/types/radix-ng-primitives-navigation-menu.d.ts +24 -26
  101. package/types/radix-ng-primitives-popover.d.ts +23 -23
  102. package/types/radix-ng-primitives-popper.d.ts +7 -1
  103. package/types/radix-ng-primitives-portal.d.ts +53 -8
  104. package/types/radix-ng-primitives-presence.d.ts +98 -17
  105. package/types/radix-ng-primitives-preview-card.d.ts +24 -23
  106. package/types/radix-ng-primitives-select.d.ts +294 -137
  107. package/types/radix-ng-primitives-tooltip.d.ts +26 -19
@@ -166,11 +166,13 @@ interface InjectContext<T> {
166
166
  * Creates a context with injector and provider functions for a given type
167
167
  * @template T The type of the context value
168
168
  * @param description Descriptive string for the context (used in token creation)
169
+ * @param docs Documentation path for the owning primitive (e.g. `'components/accordion'`),
170
+ * appended to the missing-context error as a link to the required anatomy
169
171
  * @returns A tuple containing:
170
172
  * - injectContext: Function to retrieve the context value
171
173
  * - provideContext: Function to create a provider for the context
172
174
  */
173
- declare function createContext<T>(description: string): readonly [injectContext: InjectContext<T>, provideContext: (useFactory: () => T) => Provider];
175
+ declare function createContext<T>(description: string, docs?: string): readonly [injectContext: InjectContext<T>, provideContext: (useFactory: () => T) => Provider];
174
176
 
175
177
  declare const DATE_SEGMENT_PARTS: readonly ["day", "month", "year"];
176
178
  declare const TIME_SEGMENT_PARTS: readonly ["hour", "minute", "second", "dayPeriod"];
@@ -343,6 +345,12 @@ declare function areAllDaysBetweenValid(start: DateValue, end: DateValue, isUnav
343
345
  type TimeValue = Time | CalendarDateTime | ZonedDateTime;
344
346
  type Granularity = 'day' | 'hour' | 'minute' | 'second';
345
347
  type TimeGranularity = 'hour' | 'minute' | 'second';
348
+ /**
349
+ * The granularities that require a time component (and therefore a `CalendarDateTime`
350
+ * rather than a `CalendarDate`). Single source of truth — used by both the default-date
351
+ * builder and the segment-value initializer.
352
+ */
353
+ declare const TIME_GRANULARITIES: readonly Granularity[];
346
354
  type GetDefaultDateProps = {
347
355
  defaultValue?: DateValue | DateValue[] | undefined;
348
356
  defaultPlaceholder?: DateValue | undefined;
@@ -405,7 +413,7 @@ type SyncTimeSegmentValuesProps = {
405
413
  formatter: Formatter;
406
414
  };
407
415
  declare function syncTimeSegmentValues(props: SyncTimeSegmentValuesProps): SegmentValueObj;
408
- declare function initializeSegmentValues(granularity: Granularity): SegmentValueObj;
416
+ declare function initializeSegmentValues(granularity: Granularity, isTimeValue?: boolean): SegmentValueObj;
409
417
  type SharedContentProps = {
410
418
  granularity: Granularity;
411
419
  dateRef: DateValue;
@@ -462,54 +470,9 @@ type SegmentAttrProps = {
462
470
  placeholder: DateValue;
463
471
  formatter: Formatter;
464
472
  };
465
- declare function daySegmentAttrs(props: SegmentAttrProps): {
466
- 'aria-label': string;
467
- 'aria-valuemin': number;
468
- 'aria-valuemax': number;
469
- 'aria-valuenow': number;
470
- 'aria-valuetext': string;
471
- 'data-placeholder': string | undefined;
472
- role: string;
473
- contenteditable: boolean;
474
- tabindex: number | undefined;
475
- spellcheck: boolean;
476
- inputmode: string;
477
- autocorrect: string;
478
- enterkeyhint: string;
479
- style: string;
480
- };
481
- declare function monthSegmentAttrs(props: SegmentAttrProps): {
482
- 'aria-label': string;
483
- contenteditable: boolean;
484
- 'aria-valuemin': number;
485
- 'aria-valuemax': number;
486
- 'aria-valuenow': number;
487
- 'aria-valuetext': string;
488
- 'data-placeholder': string | undefined;
489
- role: string;
490
- tabindex: number | undefined;
491
- spellcheck: boolean;
492
- inputmode: string;
493
- autocorrect: string;
494
- enterkeyhint: string;
495
- style: string;
496
- };
497
- declare function yearSegmentAttrs(props: SegmentAttrProps): {
498
- 'aria-label': string;
499
- 'aria-valuemin': number;
500
- 'aria-valuemax': number;
501
- 'aria-valuenow': number;
502
- 'aria-valuetext': string;
503
- 'data-placeholder': string | undefined;
504
- role: string;
505
- contenteditable: boolean;
506
- tabindex: number | undefined;
507
- spellcheck: boolean;
508
- inputmode: string;
509
- autocorrect: string;
510
- enterkeyhint: string;
511
- style: string;
512
- };
473
+ declare function daySegmentAttrs(props: SegmentAttrProps): {};
474
+ declare function monthSegmentAttrs(props: SegmentAttrProps): {};
475
+ declare function yearSegmentAttrs(props: SegmentAttrProps): {};
513
476
  declare function hourSegmentAttrs(props: SegmentAttrProps): {};
514
477
  declare function minuteSegmentAttrs(props: SegmentAttrProps): {};
515
478
  declare function secondSegmentAttrs(props: SegmentAttrProps): {};
@@ -616,6 +579,36 @@ declare class RdxIdGenerator {
616
579
  */
617
580
  declare function injectId(prefix: string): string;
618
581
 
582
+ /**
583
+ * A comparator for list-item values, aligned with Base UI's `isItemEqualToValue` naming.
584
+ *
585
+ * - a **function** `(a, b) => boolean` — full control over equality;
586
+ * - a **string** — an object key whose values are compared with {@link isEqual} (Reka-style `by`);
587
+ * - omitted — structural deep equality via {@link isEqual}.
588
+ */
589
+ type ItemValueComparator<T = unknown> = ((a: T, b: T) => boolean) | string;
590
+ /**
591
+ * Converts an item value to the string shown to the user.
592
+ *
593
+ * Strings pass through unchanged; `null`/`undefined` become an empty string; everything else is
594
+ * coerced with `String()`. Primitives that hold object values (e.g. combobox) typically pass their
595
+ * own `itemToStringLabel` to render a field off the object instead.
596
+ */
597
+ declare function itemToStringLabel(value: unknown): string;
598
+ /**
599
+ * Converts an item value to the string used for form serialization. Defaults to the same rules as
600
+ * {@link itemToStringLabel}; kept as a separate export so a primitive can diverge label vs. value.
601
+ */
602
+ declare function itemToStringValue(value: unknown): string;
603
+ /**
604
+ * Compares two item values for equality using an optional {@link ItemValueComparator}.
605
+ *
606
+ * @example
607
+ * isItemEqualToValue({ id: 1 }, { id: 1 }, 'id'); // true — compares the `id` key
608
+ * isItemEqualToValue({ id: 1 }, { id: 1 }); // true — deep equality fallback
609
+ */
610
+ declare function isItemEqualToValue<T>(a: T, b: T, comparator?: ItemValueComparator<T>): boolean;
611
+
619
612
  declare const ALT = "Alt";
620
613
  declare const ARROW_DOWN = "ArrowDown";
621
614
  declare const ARROW_LEFT = "ArrowLeft";
@@ -756,15 +749,27 @@ interface RdxFormUiControl {
756
749
  readonly invalid?: RdxFormStateInput<boolean>;
757
750
  readonly hidden?: RdxFormStateInput<boolean>;
758
751
  readonly pending?: RdxFormStateInput<boolean>;
759
- readonly touched?: RdxFormStateInput<boolean>;
752
+ /**
753
+ * Touched status the form writes into the control.
754
+ *
755
+ * The two API generations disagree on the notification half: the 21.x
756
+ * experimental implementation listens to a `touched` **model**'s
757
+ * `touchedChange` output, while stable Angular 22 reverted to a plain
758
+ * `touched` input plus a separate {@link touch} output. A `model()` set on
759
+ * blur **plus** an emitted `touch` output satisfies both (`ModelSignal`
760
+ * extends `InputSignalWithTransform`, so it type-checks as the 22 input).
761
+ */
762
+ readonly touched?: ModelSignal<boolean> | RdxFormStateInput<boolean> | OutputRef<boolean>;
760
763
  readonly dirty?: RdxFormStateInput<boolean>;
761
764
  readonly name?: RdxFormStateInput<string | undefined>;
762
765
  readonly errors?: RdxFormStateInput<readonly RdxValidationError[]>;
763
766
  readonly minLength?: RdxFormStateInput<number | undefined>;
764
767
  readonly maxLength?: RdxFormStateInput<number | undefined>;
765
768
  readonly pattern?: RdxFormStateInput<readonly RegExp[]>;
766
- /** Notifies the form that the control was touched (mirror of Angular's `touch` output). */
769
+ /** Notifies the form the control was touched (stable Angular 22 contract; ignored by 21.x). */
767
770
  readonly touch?: OutputRef<void>;
771
+ /** Resets the control's UI state (optional method added in stable Angular 22). */
772
+ reset?(): void;
768
773
  }
769
774
  /**
770
775
  * Mirror of `FormValueControl<TValue>` — a control that edits a single value via
@@ -813,8 +818,13 @@ declare function resizeEffect(options: {
813
818
  }): EffectRef;
814
819
 
815
820
  /**
816
- * Locks `document.body` scrolling while `active()` is `true`, and restores the original overflow
817
- * when it becomes `false` or the calling context is destroyed.
821
+ * Locks page scrolling while `active()` is `true`, and restores the original state when it becomes
822
+ * `false` or the calling context is destroyed.
823
+ *
824
+ * Locks **both** `<body>` and `<html>`: a `body { overflow: hidden }` lock alone does *not* stop the
825
+ * page when `<html>` is the scroller (e.g. a global `overflow-y: scroll`, as Storybook sets), because
826
+ * body-overflow only propagates to the viewport when `<html>`'s overflow is `visible`. The width of
827
+ * the removed scrollbar is added as `padding-right` on `<html>` so the page doesn't shift.
818
828
  *
819
829
  * Lock ownership is shared across all callers via a single module-level counter, so nested or
820
830
  * concurrent overlays compose correctly. Must be called in an injection context.
@@ -885,6 +895,39 @@ interface ArrowNavigationOptions {
885
895
  */
886
896
  declare function useArrowNavigation(e: KeyboardEvent, currentElement: HTMLElement, parentElement: HTMLElement | undefined, options?: ArrowNavigationOptions): HTMLElement | null;
887
897
 
898
+ /**
899
+ * Locale-aware string matching backed by `Intl.Collator`, mirroring Base UI's `useFilter`.
900
+ *
901
+ * The collator defaults to `sensitivity: 'base'`, so matching is both case-insensitive and
902
+ * diacritic-insensitive (`"Äpfel"` matches `"ap"`, `"résumé"` matches `"resume"`). Pass `locale`
903
+ * and/or any `Intl.Collator` options to override.
904
+ */
905
+ interface UseFilterOptions extends Intl.CollatorOptions {
906
+ /** Locale(s) for the collator. Defaults to the runtime's default locale. */
907
+ locale?: Intl.LocalesArgument;
908
+ }
909
+ /** Predicates returned by {@link useFilter}. An empty `query` always matches. */
910
+ interface FilterPredicates {
911
+ /** Whether `text` contains `query`. */
912
+ contains: (text: string, query: string) => boolean;
913
+ /** Whether `text` starts with `query`. */
914
+ startsWith: (text: string, query: string) => boolean;
915
+ /** Whether `text` ends with `query`. */
916
+ endsWith: (text: string, query: string) => boolean;
917
+ }
918
+ /**
919
+ * Creates locale-aware `contains` / `startsWith` / `endsWith` predicates.
920
+ *
921
+ * Matching uses `Intl.Collator` with `sensitivity: 'base'` and `usage: 'search'` by default, so
922
+ * comparisons ignore case and diacritics. An empty (or whitespace-only) `query` matches everything,
923
+ * which is the natural "no filter applied" state for a combobox.
924
+ *
925
+ * @example
926
+ * const { contains } = useFilter();
927
+ * contains('Äpfel', 'ap'); // true
928
+ */
929
+ declare function useFilter(options?: UseFilterOptions): FilterPredicates;
930
+
888
931
  /**
889
932
  * Keeps hover content open while the pointer crosses the gap between a trigger and a popup.
890
933
  */
@@ -893,6 +936,55 @@ declare function useGraceArea(triggerEl: Signal<HTMLElement | null | undefined>,
893
936
  onPointerExit: (callback: (value: void) => void) => () => void;
894
937
  };
895
938
 
939
+ /** Options for {@link useListHighlight}. */
940
+ interface UseListHighlightOptions<T> {
941
+ /** All items in DOM order (e.g. a collection provider's `items()`). */
942
+ items: Signal<readonly T[]>;
943
+ /**
944
+ * Whether an item can be highlighted — must return `false` for hidden (filtered-out) and
945
+ * disabled items. Navigation and self-healing both consult this.
946
+ */
947
+ isNavigable: (item: T) => boolean;
948
+ /** Resolves the item's element id, exposed as {@link ListHighlight.activeId} for `aria-activedescendant`. */
949
+ getId: (item: T) => string | undefined;
950
+ /** Whether navigation wraps at the boundaries. Defaults to `true`. */
951
+ loop?: Signal<boolean>;
952
+ /** Injector to bind the self-healing effect to when not called in an injection context. */
953
+ injector?: Injector;
954
+ }
955
+ /** Highlight-model navigation API returned by {@link useListHighlight}. */
956
+ interface ListHighlight<T> {
957
+ /** The currently highlighted item, or `null`. DOM focus is never moved by this state. */
958
+ readonly highlightedItem: Signal<T | null>;
959
+ /** The highlighted item's element id, or `undefined`. Bind to `aria-activedescendant`. */
960
+ readonly activeId: Signal<string | undefined>;
961
+ /** Highlight the first navigable item. */
962
+ first(): void;
963
+ /** Highlight the last navigable item. */
964
+ last(): void;
965
+ /** Highlight the next navigable item (wraps when `loop`). */
966
+ next(): void;
967
+ /** Highlight the previous navigable item (wraps when `loop`). */
968
+ previous(): void;
969
+ /** Highlight a specific item (ignored if not navigable); pass `null` to clear. */
970
+ set(item: T | null): void;
971
+ /** Clear the highlight. */
972
+ clear(): void;
973
+ }
974
+ /**
975
+ * Highlight-model list navigation over a set of items, decoupled from DOM focus.
976
+ *
977
+ * Unlike roving `tabindex`, the highlight is pure state: callers move it with the keyboard while DOM
978
+ * focus stays on a single controlling element (e.g. a combobox `<input>`), which exposes
979
+ * {@link ListHighlight.activeId} as `aria-activedescendant`. Navigation only ever lands on items for
980
+ * which `isNavigable` returns `true`, so hidden (filtered-out) and disabled items are skipped. A
981
+ * self-healing effect clears the highlight if its item stops being navigable or leaves the list, so
982
+ * `activeId` never references a detached or hidden element.
983
+ *
984
+ * Must be called in an injection context, or given an `injector`.
985
+ */
986
+ declare function useListHighlight<T>(options: UseListHighlightOptions<T>): ListHighlight<T>;
987
+
896
988
  interface RdxPointerDragHandlers {
897
989
  /** Whether a press may begin a drag (e.g. enabled, not on an opt-out element, at a scroll edge). */
898
990
  canStart: (event: PointerEvent) => boolean;
@@ -1008,5 +1100,5 @@ declare enum RdxPositionAlign {
1008
1100
  End = "end"
1009
1101
  }
1010
1102
 
1011
- export { A, ALT, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, ASTERISK, BACKSPACE, CAPS_LOCK, CONTROL, CTRL, DELETE, END, ENTER, ESCAPE, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, HOME, META, P, PAGE_DOWN, PAGE_UP, RdxControlValueAccessor, RdxIdGenerator, RdxLiveAnnouncer, RdxPositionAlign, RdxPositionSide, SHIFT, SPACE, SPACE_CODE, TAB, a, areAllDaysBetweenValid, clamp, createContent, createContext, createFormatter, createMonth, createMonths, elementSize, getActiveElement, getDaysBetween, getDaysInMonth, getDefaultDate, getDefaultTime, getLastFirstDayOfWeek, getMaxTransitionDuration, getNextLastDayOfWeek, getOptsByGranularity, getPlaceholder, getSegmentElements, getWeekNumber, handleAndDispatchCustomEvent, handleCalendarInitialFocus, hasTime, initializeSegmentValues, injectControlValueAccessor, injectDocument, injectId, isAcceptableSegmentKey, isAfter, isAfterOrSame, isBefore, isBeforeOrSame, isBetween, isBetweenInclusive, isCalendarDateTime, isEqual, isNullish, isNumberString, isSegmentNavigationKey, isZonedDateTime, j, k, n, normalizeDateStep, normalizeHour12, normalizeHourCycle, p, provideToken, provideValueAccessor, resizeEffect, roundToStepPrecision, segmentBuilders, snapValueToStep, syncSegmentValues, syncTimeSegmentValues, toDate, useArrowNavigation, useDateField, useGraceArea, usePointerDrag, useScrollLock, useTransitionStatus, watch };
1012
- export type { AcceptableValue, AnyExceptLiteral, AriaLivePoliteness, BooleanInput, CreateMonthProps, DataOrientation, DateAndTimeSegmentObj, DateFormatterOptions, DateMatcher, DateRange, DateSegmentObj, DateSegmentPart, DateStep, DayPeriod, Direction, EditableSegmentPart, Formatter, Granularity, HourCycle, InjectContext, Month, NonEditableSegmentPart, Nullable, NumberInput, PlaceholderMap, RdxFormCheckboxControl, RdxFormStateInput, RdxFormUiControl, RdxFormValueControl, RdxPointerDragHandlers, RdxTransitionStatus, RdxTransitionStatusRef, RdxValidationError, SafeFunction, SegmentContentObj, SegmentPart, SegmentValueObj, TimeGranularity, TimeSegmentObj, TimeSegmentPart, TimeValue, UseDateFieldProps };
1103
+ export { A, ALT, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, ASTERISK, BACKSPACE, CAPS_LOCK, CONTROL, CTRL, DELETE, END, ENTER, ESCAPE, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, HOME, META, P, PAGE_DOWN, PAGE_UP, RdxControlValueAccessor, RdxIdGenerator, RdxLiveAnnouncer, RdxPositionAlign, RdxPositionSide, SHIFT, SPACE, SPACE_CODE, TAB, TIME_GRANULARITIES, a, areAllDaysBetweenValid, clamp, createContent, createContext, createFormatter, createMonth, createMonths, elementSize, getActiveElement, getDaysBetween, getDaysInMonth, getDefaultDate, getDefaultTime, getLastFirstDayOfWeek, getMaxTransitionDuration, getNextLastDayOfWeek, getOptsByGranularity, getPlaceholder, getSegmentElements, getWeekNumber, handleAndDispatchCustomEvent, handleCalendarInitialFocus, hasTime, initializeSegmentValues, injectControlValueAccessor, injectDocument, injectId, isAcceptableSegmentKey, isAfter, isAfterOrSame, isBefore, isBeforeOrSame, isBetween, isBetweenInclusive, isCalendarDateTime, isEqual, isItemEqualToValue, isNullish, isNumberString, isSegmentNavigationKey, isZonedDateTime, itemToStringLabel, itemToStringValue, j, k, n, normalizeDateStep, normalizeHour12, normalizeHourCycle, p, provideToken, provideValueAccessor, resizeEffect, roundToStepPrecision, segmentBuilders, snapValueToStep, syncSegmentValues, syncTimeSegmentValues, toDate, useArrowNavigation, useDateField, useFilter, useGraceArea, useListHighlight, usePointerDrag, useScrollLock, useTransitionStatus, watch };
1104
+ export type { AcceptableValue, AnyExceptLiteral, AriaLivePoliteness, BooleanInput, CreateMonthProps, DataOrientation, DateAndTimeSegmentObj, DateFormatterOptions, DateMatcher, DateRange, DateSegmentObj, DateSegmentPart, DateStep, DayPeriod, Direction, EditableSegmentPart, FilterPredicates, Formatter, Granularity, HourCycle, InjectContext, ItemValueComparator, ListHighlight, Month, NonEditableSegmentPart, Nullable, NumberInput, PlaceholderMap, RdxFormCheckboxControl, RdxFormStateInput, RdxFormUiControl, RdxFormValueControl, RdxPointerDragHandlers, RdxTransitionStatus, RdxTransitionStatusRef, RdxValidationError, SafeFunction, SegmentContentObj, SegmentPart, SegmentValueObj, TimeGranularity, TimeSegmentObj, TimeSegmentPart, TimeValue, UseDateFieldProps, UseFilterOptions, UseListHighlightOptions };
@@ -1,20 +1,40 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Provider, Signal, ElementRef } from '@angular/core';
3
- import * as i1 from '@radix-ng/primitives/presence';
3
+ import * as i1 from '@radix-ng/primitives/portal';
4
+ import { RdxPortalContainer } from '@radix-ng/primitives/portal';
4
5
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
5
6
  import { RdxTransitionStatus, BooleanInput } from '@radix-ng/primitives/core';
6
7
  import * as _radix_ng_primitives_dialog from '@radix-ng/primitives/dialog';
7
- import * as i1$1 from '@radix-ng/primitives/portal';
8
- import { RdxPortalContainer } from '@radix-ng/primitives/portal';
9
- import * as i1$2 from '@radix-ng/primitives/dismissable-layer';
8
+ import * as i1$1 from '@radix-ng/primitives/dismissable-layer';
10
9
  import * as i2 from '@radix-ng/primitives/focus-scope';
11
10
 
12
11
  /**
13
- * Mounts the portal while the dialog is open and waits for CSS exit keyframes before unmounting.
12
+ * Structural directive that teleports the dialog content (backdrop + popup) into a container (default
13
+ * `document.body`) while the dialog is open, and keeps it mounted until the CSS exit `@keyframes` on
14
+ * every root element finish.
15
+ *
16
+ * Dialog has two root nodes (backdrop + popup), so use the explicit `<ng-template rdxDialogPortal>`
17
+ * form. Pass `[container]` to portal into a different element.
18
+ */
19
+ declare class RdxDialogPortal {
20
+ /**
21
+ * Optional container to portal the content into. Defaults to `document.body`. Declared here (and
22
+ * forwarded to the composed {@link RdxPortalPresence}) so that the drawer and alert-dialog portals
23
+ * can re-expose it through their own `hostDirectives`.
24
+ */
25
+ readonly container: _angular_core.InputSignal<RdxPortalContainer | undefined>;
26
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxDialogPortal, never>;
27
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogPortal, "ng-template[rdxDialogPortal]", ["rdxDialogPortal"], { "container": { "alias": "container"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxPortalPresence; inputs: { "container": "container"; }; outputs: {}; }]>;
28
+ }
29
+ /**
30
+ * Dev-mode guard: `rdxDialogPortal` used to be an attribute directive on a `<div>`. It is now
31
+ * structural, so the old `<div rdxDialogPortal>` markup would silently stop portaling — fail loudly
32
+ * instead.
14
33
  */
15
- declare class RdxDialogPortalPresence {
16
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxDialogPortalPresence, never>;
17
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogPortalPresence, "ng-template[rdxDialogPortalPresence]", never, {}, {}, never, never, true, [{ directive: typeof i1.RdxPresenceDirective; inputs: {}; outputs: {}; }]>;
34
+ declare class RdxDialogPortalMisuseGuard {
35
+ constructor();
36
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxDialogPortalMisuseGuard, never>;
37
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogPortalMisuseGuard, "[rdxDialogPortal]:not(ng-template)", never, {}, {}, never, never, true, never>;
18
38
  }
19
39
 
20
40
  /**
@@ -210,19 +230,6 @@ declare class RdxDialogTrigger {
210
230
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogTrigger, "button[rdxDialogTrigger]", ["rdxDialogTrigger"], { "handle": { "alias": "handle"; "required": false; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
211
231
  }
212
232
 
213
- /**
214
- * Moves the dialog to a different part of the DOM.
215
- */
216
- declare class RdxDialogPortal {
217
- protected readonly rootContext: _radix_ng_primitives_dialog.RdxDialogRootContext;
218
- /**
219
- * Optional container to portal the content into. Defaults to `document.body`.
220
- */
221
- readonly container: _angular_core.InputSignal<RdxPortalContainer | undefined>;
222
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxDialogPortal, never>;
223
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogPortal, "[rdxDialogPortal]", ["rdxDialogPortal"], { "container": { "alias": "container"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1$1.RdxPortal; inputs: { "container": "container"; }; outputs: {}; }]>;
224
- }
225
-
226
233
  /**
227
234
  * An overlay displayed beneath the dialog popup.
228
235
  */
@@ -279,7 +286,7 @@ declare class RdxDialogPopup {
279
286
  constructor();
280
287
  private isEventOnTrigger;
281
288
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxDialogPopup, never>;
282
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogPopup, "[rdxDialogPopup]", ["rdxDialogPopup"], {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1$2.RdxDismissableLayer; inputs: {}; outputs: {}; }, { directive: typeof i2.RdxFocusScope; inputs: {}; outputs: {}; }]>;
289
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogPopup, "[rdxDialogPopup]", ["rdxDialogPopup"], {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1$1.RdxDismissableLayer; inputs: {}; outputs: {}; }, { directive: typeof i2.RdxFocusScope; inputs: {}; outputs: {}; }]>;
283
290
  }
284
291
 
285
292
  /**
@@ -313,12 +320,12 @@ declare class RdxDialogClose {
313
320
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxDialogClose, "button[rdxDialogClose]", ["rdxDialogClose"], {}, {}, never, never, true, never>;
314
321
  }
315
322
 
316
- declare const dialogImports: (typeof RdxDialogPortalPresence)[];
323
+ declare const dialogImports: (typeof RdxDialogPortalMisuseGuard)[];
317
324
  declare class RdxDialogModule {
318
325
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxDialogModule, never>;
319
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxDialogModule, never, [typeof RdxDialogRoot, typeof RdxDialogTrigger, typeof RdxDialogPortalPresence, typeof RdxDialogPortal, typeof RdxDialogBackdrop, typeof RdxDialogViewport, typeof RdxDialogPopup, typeof RdxDialogTitle, typeof RdxDialogDescription, typeof RdxDialogClose], [typeof RdxDialogRoot, typeof RdxDialogTrigger, typeof RdxDialogPortalPresence, typeof RdxDialogPortal, typeof RdxDialogBackdrop, typeof RdxDialogViewport, typeof RdxDialogPopup, typeof RdxDialogTitle, typeof RdxDialogDescription, typeof RdxDialogClose]>;
326
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxDialogModule, never, [typeof RdxDialogRoot, typeof RdxDialogTrigger, typeof RdxDialogPortal, typeof RdxDialogPortalMisuseGuard, typeof RdxDialogBackdrop, typeof RdxDialogViewport, typeof RdxDialogPopup, typeof RdxDialogTitle, typeof RdxDialogDescription, typeof RdxDialogClose], [typeof RdxDialogRoot, typeof RdxDialogTrigger, typeof RdxDialogPortal, typeof RdxDialogPortalMisuseGuard, typeof RdxDialogBackdrop, typeof RdxDialogViewport, typeof RdxDialogPopup, typeof RdxDialogTitle, typeof RdxDialogDescription, typeof RdxDialogClose]>;
320
327
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxDialogModule>;
321
328
  }
322
329
 
323
- export { RDX_DIALOG_VARIANT, RdxDialogBackdrop, RdxDialogClose, RdxDialogDescription, RdxDialogHandle, RdxDialogModule, RdxDialogPopup, RdxDialogPortal, RdxDialogPortalPresence, RdxDialogRoot, RdxDialogTitle, RdxDialogTrigger, RdxDialogViewport, createRdxDialogHandle, dialogImports, injectRdxDialogRootContext, provideRdxDialogRootContext, provideRdxDialogVariant };
330
+ export { RDX_DIALOG_VARIANT, RdxDialogBackdrop, RdxDialogClose, RdxDialogDescription, RdxDialogHandle, RdxDialogModule, RdxDialogPopup, RdxDialogPortal, RdxDialogPortalMisuseGuard, RdxDialogRoot, RdxDialogTitle, RdxDialogTrigger, RdxDialogViewport, createRdxDialogHandle, dialogImports, injectRdxDialogRootContext, provideRdxDialogRootContext, provideRdxDialogVariant };
324
331
  export type { RdxDialogModal, RdxDialogOpenChange, RdxDialogOpenChangeReason, RdxDialogRole, RdxDialogRootContext, RdxDialogVariant };
@@ -13,6 +13,8 @@ interface RdxDrawerRegistration {
13
13
  id: string;
14
14
  /** The drawer popup's measured size (px) along its dismiss axis. */
15
15
  height: Signal<number>;
16
+ /** 0..1 live dismiss progress of this drawer. */
17
+ swipeProgress: Signal<number>;
16
18
  }
17
19
  /**
18
20
  * App-level coordinator that tracks every open drawer so background content can react to them
@@ -30,6 +32,8 @@ declare class RdxDrawerProvider {
30
32
  readonly frontmost: Signal<RdxDrawerRegistration | null>;
31
33
  /** The frontmost drawer's measured size (px), or `0` when none is open. */
32
34
  readonly frontmostHeight: Signal<number>;
35
+ /** The frontmost drawer's live dismiss progress, or `0` when none is open. */
36
+ readonly swipeProgress: Signal<number>;
33
37
  /** Register an open drawer; returns a disposer that removes it. */
34
38
  register(registration: RdxDrawerRegistration): () => void;
35
39
  static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerProvider, never>;
@@ -62,6 +66,10 @@ type RdxDrawerRelease = {
62
66
  interface RdxDrawerSwipeConfig {
63
67
  /** The popup element the gesture lives on (CSS variables + data attributes are written here). */
64
68
  element: () => HTMLElement;
69
+ /** Gesture boundary used to discover scrollable ancestors around the popup. */
70
+ boundary?: () => HTMLElement;
71
+ /** Visible size along the dismiss axis, used to normalize live swipe progress. */
72
+ size?: () => number;
65
73
  /** Active swipe direction. */
66
74
  direction: Signal<RdxDrawerSwipeDirection>;
67
75
  /** Whether the gesture is currently armed (typically `open`). */
@@ -109,8 +117,8 @@ declare function useDrawerSwipe(config: RdxDrawerSwipeConfig): void;
109
117
  * - a string — `'148px'` (pixels), `'30rem'` (root-em), `'40%'` (fraction of size), or a bare number
110
118
  * as above.
111
119
  *
112
- * Order the `snapPoints` array ascending by openness; the last entry is treated as "most open" and
113
- * is the default the drawer opens to when `defaultSnapPoint` is not set.
120
+ * Order the `snapPoints` array ascending by openness; the first entry is the default the drawer opens
121
+ * to when `defaultSnapPoint` is not set.
114
122
  */
115
123
  type RdxDrawerSnapPoint = number | string;
116
124
  /**
@@ -166,6 +174,12 @@ interface RdxDrawerRootContext {
166
174
  swipeProgress: Signal<number>;
167
175
  /** Reports gesture progress from the popup's swipe engine. */
168
176
  setSwipeProgress: (value: number) => void;
177
+ /** Whether the drawer is currently being revealed from a SwipeArea. */
178
+ openingSwipeActive: Signal<boolean>;
179
+ /** Pointer travel (px) inward from the SwipeArea while revealing the drawer. */
180
+ openingSwipeDistance: Signal<number>;
181
+ /** Starts or updates the SwipeArea reveal gesture. */
182
+ setOpeningSwipe: (active: boolean, distance: number) => void;
169
183
  /** Configured snap points (empty when the drawer has none). */
170
184
  snapPoints: Signal<readonly RdxDrawerSnapPoint[]>;
171
185
  /** Whether the drawer rests at discrete snap points. */
@@ -208,12 +222,12 @@ declare class RdxDrawerRoot {
208
222
  readonly swipeDirection: i0.InputSignal<RdxDrawerSwipeDirection>;
209
223
  /**
210
224
  * Resting positions the drawer snaps to along the dismiss axis. Order ascending by openness; the
211
- * last entry is the default the drawer opens to. Omit for a plain open/closed drawer.
225
+ * first entry is the default the drawer opens to. Omit for a plain open/closed drawer.
212
226
  */
213
227
  readonly snapPoints: i0.InputSignal<readonly RdxDrawerSnapPoint[] | undefined>;
214
228
  /** The active snap point (controlled / uncontrolled with `[(snapPoint)]`). */
215
229
  readonly snapPoint: i0.ModelSignal<RdxDrawerSnapPoint | null>;
216
- /** The snap point the drawer opens to when uncontrolled; defaults to the most open point. */
230
+ /** The snap point the drawer opens to when uncontrolled; defaults to the first point. */
217
231
  readonly defaultSnapPoint: i0.InputSignal<RdxDrawerSnapPoint | undefined>;
218
232
  /** Step at most one snap point per release instead of letting velocity skip points. */
219
233
  readonly snapToSequentialPoints: i0.InputSignalWithTransform<boolean, BooleanInput>;
@@ -221,6 +235,9 @@ declare class RdxDrawerRoot {
221
235
  readonly onSnapPointChange: i0.OutputEmitterRef<RdxDrawerSnapPoint>;
222
236
  /** 0..1 progress of the active dismiss gesture, written by the popup's swipe engine. */
223
237
  readonly swipeProgress: i0.WritableSignal<number>;
238
+ /** Live SwipeArea reveal state; the popup converts distance into its measured-axis movement. */
239
+ readonly openingSwipeActive: i0.WritableSignal<boolean>;
240
+ readonly openingSwipeDistance: i0.WritableSignal<number>;
224
241
  readonly normalizedSnapPoints: Signal<readonly RdxDrawerSnapPoint[]>;
225
242
  readonly hasSnapPoints: Signal<boolean>;
226
243
  /** Whether a drawer nested inside this one is open (reuses the dialog's nesting detection). */
@@ -252,41 +269,47 @@ declare class RdxDrawerTrigger {
252
269
  /**
253
270
  * An off-canvas region (typically pinned to a screen edge) that opens the drawer when swiped inward.
254
271
  *
255
- * Phase 1 opens on a threshold crossing rather than following the pointer live (the popup is not
256
- * mounted while closed); the live-follow open will land with snap points. Shares the drawer's
257
- * pointer-drag lifecycle so capture/cancel handling stays consistent with the popup gesture.
272
+ * Opens the drawer at the start of a drag so its popup can follow the pointer live. Releasing past
273
+ * the threshold settles open; releasing before it or cancelling animates the drawer back out.
258
274
  */
259
275
  declare class RdxDrawerSwipeArea {
260
276
  private readonly drawerContext;
261
277
  private readonly dialogContext;
262
- /** Direction the swipe area opens from; defaults to the root's `swipeDirection`. */
278
+ /** Direction the opening gesture travels; defaults to the opposite of the root's dismiss direction. */
263
279
  readonly swipeDirection: i0.InputSignal<RdxDrawerSwipeDirection | undefined>;
264
280
  /** Whether the swipe area should ignore user interaction. */
265
281
  readonly disabled: i0.InputSignalWithTransform<boolean, BooleanInput>;
266
282
  protected readonly isOpen: i0.Signal<boolean>;
267
283
  protected readonly direction: i0.Signal<RdxDrawerSwipeDirection>;
284
+ protected readonly resolvedTouchAction: i0.Signal<"pan-y" | "pan-x">;
268
285
  protected readonly swiping: i0.WritableSignal<boolean>;
269
286
  private startX;
270
287
  private startY;
288
+ private distance;
271
289
  constructor();
272
290
  static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerSwipeArea, never>;
273
291
  static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerSwipeArea, "[rdxDrawerSwipeArea]", ["rdxDrawerSwipeArea"], { "swipeDirection": { "alias": "swipeDirection"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
274
292
  }
275
293
 
276
294
  /**
277
- * Mounts the portal while the drawer is open and waits for CSS exit keyframes before unmounting.
295
+ * Structural directive that teleports the drawer content (backdrop + popup) into a container (default
296
+ * `document.body`) while the drawer is open, keeping it mounted until its CSS exit `@keyframes`
297
+ * finish. It composes the structural {@link RdxDialogPortal}, inheriting the dialog presence context.
298
+ *
299
+ * Use the explicit `<ng-template rdxDrawerPortal>` form; pass `[container]` for a custom target.
278
300
  */
279
- declare class RdxDrawerPortalPresence {
280
- static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerPortalPresence, never>;
281
- static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerPortalPresence, "ng-template[rdxDrawerPortalPresence]", never, {}, {}, never, never, true, [{ directive: typeof i1.RdxDialogPortalPresence; inputs: {}; outputs: {}; }]>;
301
+ declare class RdxDrawerPortal {
302
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerPortal, never>;
303
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerPortal, "ng-template[rdxDrawerPortal]", ["rdxDrawerPortal"], {}, {}, never, never, true, [{ directive: typeof i1.RdxDialogPortal; inputs: { "container": "container"; }; outputs: {}; }]>;
282
304
  }
283
-
284
305
  /**
285
- * Moves the drawer to a different part of the DOM. Defaults to `document.body`.
306
+ * Dev-mode guard: `rdxDrawerPortal` is now structural, so the old `<div rdxDrawerPortal>` markup would
307
+ * silently stop portaling — fail loudly instead.
286
308
  */
287
- declare class RdxDrawerPortal {
288
- static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerPortal, never>;
289
- static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerPortal, "[rdxDrawerPortal]", ["rdxDrawerPortal"], {}, {}, never, never, true, [{ directive: typeof i1.RdxDialogPortal; inputs: { "container": "container"; }; outputs: {}; }]>;
309
+ declare class RdxDrawerPortalMisuseGuard {
310
+ constructor();
311
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerPortalMisuseGuard, never>;
312
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerPortalMisuseGuard, "[rdxDrawerPortal]:not(ng-template)", never, {}, {}, never, never, true, never>;
290
313
  }
291
314
 
292
315
  /**
@@ -336,6 +359,9 @@ declare class RdxDrawerPopup {
336
359
  protected readonly frontmostHeightPx: i0.Signal<string | null>;
337
360
  constructor();
338
361
  private axisSize;
362
+ private axisElementSize;
363
+ private swipeBoundary;
364
+ private visibleAxisSize;
339
365
  private resolveRelease;
340
366
  static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerPopup, never>;
341
367
  static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerPopup, "[rdxDrawerPopup]", ["rdxDrawerPopup"], {}, {}, never, never, true, [{ directive: typeof i1.RdxDialogPopup; inputs: {}; outputs: { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }; }]>;
@@ -384,6 +410,7 @@ declare class RdxDrawerClose {
384
410
  * Reads the nearest {@link RdxDrawerProvider} and exposes styling hooks; the visual transform is
385
411
  * consumer CSS (headless):
386
412
  * - `[data-active]` — present while at least one drawer is open.
413
+ * - `--drawer-swipe-progress` — 0..1 live dismiss progress of the frontmost drawer.
387
414
  * - `--nested-drawers` — the number of open drawers.
388
415
  * - `--drawer-frontmost-height` — the frontmost drawer's measured size, in pixels.
389
416
  */
@@ -396,9 +423,9 @@ declare class RdxDrawerIndent {
396
423
  /**
397
424
  * The page background layer that scales/indents while any drawer is open.
398
425
  *
399
- * Behaves like {@link RdxDrawerIndent} (same `[data-active]` / `--nested-drawers` /
400
- * `--drawer-frontmost-height` contract); kept as a distinct part so the page backdrop and the
401
- * indented content can be styled independently, mirroring Base UI.
426
+ * Behaves like {@link RdxDrawerIndent} (same `[data-active]` / `--drawer-swipe-progress` /
427
+ * `--nested-drawers` / `--drawer-frontmost-height` contract); kept as a distinct part so the page
428
+ * backdrop and the indented content can be styled independently, mirroring Base UI.
402
429
  */
403
430
  declare class RdxDrawerIndentBackground {
404
431
  protected readonly provider: RdxDrawerProvider | null;
@@ -418,9 +445,9 @@ declare function createRdxDrawerHandle<Payload = unknown>(): RdxDrawerHandle<Pay
418
445
  declare const drawerImports: (typeof RdxDrawerProviderDirective)[];
419
446
  declare class RdxDrawerModule {
420
447
  static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerModule, never>;
421
- static ɵmod: i0.ɵɵNgModuleDeclaration<RdxDrawerModule, never, [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortalPresence, typeof RdxDrawerPortal, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground], [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortalPresence, typeof RdxDrawerPortal, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground]>;
448
+ static ɵmod: i0.ɵɵNgModuleDeclaration<RdxDrawerModule, never, [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortal, typeof RdxDrawerPortalMisuseGuard, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground], [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortal, typeof RdxDrawerPortalMisuseGuard, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground]>;
422
449
  static ɵinj: i0.ɵɵInjectorDeclaration<RdxDrawerModule>;
423
450
  }
424
451
 
425
- export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalPresence, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
452
+ export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalMisuseGuard, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
426
453
  export type { RdxDrawerRegistration, RdxDrawerRelease, RdxDrawerRootContext, RdxDrawerSnapEntry, RdxDrawerSnapPoint, RdxDrawerSnapResolveOptions, RdxDrawerSnapTarget, RdxDrawerSwipeConfig, RdxDrawerSwipeDirection };