@ngneers/controls 0.0.1-next.0

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 (186) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +234 -0
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
  3. package/fesm2022/ngneers-controls-api-ng.mjs +959 -0
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
  5. package/fesm2022/ngneers-controls-api-resize.mjs +712 -0
  6. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-api.mjs +347 -0
  8. package/fesm2022/ngneers-controls-api.mjs.map +1 -0
  9. package/fesm2022/ngneers-controls-avatar.mjs +77 -0
  10. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
  11. package/fesm2022/ngneers-controls-base.mjs +620 -0
  12. package/fesm2022/ngneers-controls-base.mjs.map +1 -0
  13. package/fesm2022/ngneers-controls-breadcrumb.mjs +100 -0
  14. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
  15. package/fesm2022/ngneers-controls-button-group.mjs +110 -0
  16. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
  17. package/fesm2022/ngneers-controls-button.mjs +83 -0
  18. package/fesm2022/ngneers-controls-button.mjs.map +1 -0
  19. package/fesm2022/ngneers-controls-calendar-time-CJT5AFlA.mjs +74 -0
  20. package/fesm2022/ngneers-controls-calendar-time-CJT5AFlA.mjs.map +1 -0
  21. package/fesm2022/ngneers-controls-calendar.mjs +801 -0
  22. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
  23. package/fesm2022/ngneers-controls-checkbox.mjs +63 -0
  24. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
  25. package/fesm2022/ngneers-controls-chip.mjs +55 -0
  26. package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
  27. package/fesm2022/ngneers-controls-default-icons.mjs +82 -0
  28. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
  29. package/fesm2022/ngneers-controls-defer.mjs +72 -0
  30. package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
  31. package/fesm2022/ngneers-controls-dialog.mjs +407 -0
  32. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -0
  33. package/fesm2022/ngneers-controls-directives.mjs +498 -0
  34. package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
  35. package/fesm2022/ngneers-controls-drawer.mjs +271 -0
  36. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
  37. package/fesm2022/ngneers-controls-edit-inplace.mjs +127 -0
  38. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
  39. package/fesm2022/ngneers-controls-errors.mjs +329 -0
  40. package/fesm2022/ngneers-controls-errors.mjs.map +1 -0
  41. package/fesm2022/ngneers-controls-filter.mjs +708 -0
  42. package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
  43. package/fesm2022/ngneers-controls-hint.mjs +153 -0
  44. package/fesm2022/ngneers-controls-hint.mjs.map +1 -0
  45. package/fesm2022/ngneers-controls-i18n-translations-de.mjs +170 -0
  46. package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -0
  47. package/fesm2022/ngneers-controls-i18n-translations-en.mjs +170 -0
  48. package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -0
  49. package/fesm2022/ngneers-controls-i18n.mjs +57 -0
  50. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
  51. package/fesm2022/ngneers-controls-icon.mjs +195 -0
  52. package/fesm2022/ngneers-controls-icon.mjs.map +1 -0
  53. package/fesm2022/ngneers-controls-inplace.mjs +150 -0
  54. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
  55. package/fesm2022/ngneers-controls-input-field.mjs +165 -0
  56. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
  57. package/fesm2022/ngneers-controls-input.mjs +72 -0
  58. package/fesm2022/ngneers-controls-input.mjs.map +1 -0
  59. package/fesm2022/ngneers-controls-item-view.mjs +473 -0
  60. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
  61. package/fesm2022/ngneers-controls-list-box.mjs +281 -0
  62. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -0
  63. package/fesm2022/ngneers-controls-mask-input.mjs +888 -0
  64. package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -0
  65. package/fesm2022/ngneers-controls-menu.mjs +371 -0
  66. package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
  67. package/fesm2022/ngneers-controls-message.mjs +30 -0
  68. package/fesm2022/ngneers-controls-message.mjs.map +1 -0
  69. package/fesm2022/ngneers-controls-number-input.mjs +366 -0
  70. package/fesm2022/ngneers-controls-number-input.mjs.map +1 -0
  71. package/fesm2022/ngneers-controls-paginator.mjs +129 -0
  72. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
  73. package/fesm2022/ngneers-controls-popover.mjs +215 -0
  74. package/fesm2022/ngneers-controls-popover.mjs.map +1 -0
  75. package/fesm2022/ngneers-controls-progress.mjs +98 -0
  76. package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
  77. package/fesm2022/ngneers-controls-radio.mjs +152 -0
  78. package/fesm2022/ngneers-controls-radio.mjs.map +1 -0
  79. package/fesm2022/ngneers-controls-roving-focus.mjs +323 -0
  80. package/fesm2022/ngneers-controls-roving-focus.mjs.map +1 -0
  81. package/fesm2022/ngneers-controls-scroll-shadow.mjs +65 -0
  82. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
  83. package/fesm2022/ngneers-controls-scroller.mjs +308 -0
  84. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -0
  85. package/fesm2022/ngneers-controls-select-button.mjs +58 -0
  86. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
  87. package/fesm2022/ngneers-controls-select.mjs +417 -0
  88. package/fesm2022/ngneers-controls-select.mjs.map +1 -0
  89. package/fesm2022/ngneers-controls-slider.mjs +167 -0
  90. package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
  91. package/fesm2022/ngneers-controls-snackbar.mjs +414 -0
  92. package/fesm2022/ngneers-controls-snackbar.mjs.map +1 -0
  93. package/fesm2022/ngneers-controls-spin-buttons.mjs +126 -0
  94. package/fesm2022/ngneers-controls-spin-buttons.mjs.map +1 -0
  95. package/fesm2022/ngneers-controls-spinner.mjs +184 -0
  96. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
  97. package/fesm2022/ngneers-controls-splitter.mjs +604 -0
  98. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
  99. package/fesm2022/ngneers-controls-state.mjs +185 -0
  100. package/fesm2022/ngneers-controls-state.mjs.map +1 -0
  101. package/fesm2022/ngneers-controls-switch.mjs +39 -0
  102. package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
  103. package/fesm2022/ngneers-controls-table.mjs +2634 -0
  104. package/fesm2022/ngneers-controls-table.mjs.map +1 -0
  105. package/fesm2022/ngneers-controls-tabs.mjs +336 -0
  106. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
  107. package/fesm2022/ngneers-controls-tag.mjs +30 -0
  108. package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
  109. package/fesm2022/ngneers-controls-toast.mjs +350 -0
  110. package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
  111. package/fesm2022/ngneers-controls-toggle-button.mjs +70 -0
  112. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
  113. package/fesm2022/ngneers-controls-tooltip.mjs +506 -0
  114. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
  115. package/fesm2022/ngneers-controls-tree.mjs +599 -0
  116. package/fesm2022/ngneers-controls-tree.mjs.map +1 -0
  117. package/fesm2022/ngneers-controls-upload.mjs +377 -0
  118. package/fesm2022/ngneers-controls-upload.mjs.map +1 -0
  119. package/fesm2022/ngneers-controls-utils-ng.mjs +411 -0
  120. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
  121. package/fesm2022/ngneers-controls-utils.mjs +261 -0
  122. package/fesm2022/ngneers-controls-utils.mjs.map +1 -0
  123. package/fesm2022/ngneers-controls.mjs +6 -0
  124. package/fesm2022/ngneers-controls.mjs.map +1 -0
  125. package/package.json +302 -0
  126. package/types/ngneers-controls-accordion.d.ts +139 -0
  127. package/types/ngneers-controls-api-ng.d.ts +364 -0
  128. package/types/ngneers-controls-api-resize.d.ts +318 -0
  129. package/types/ngneers-controls-api.d.ts +145 -0
  130. package/types/ngneers-controls-avatar.d.ts +54 -0
  131. package/types/ngneers-controls-base.d.ts +277 -0
  132. package/types/ngneers-controls-breadcrumb.d.ts +272 -0
  133. package/types/ngneers-controls-button-group.d.ts +46 -0
  134. package/types/ngneers-controls-button.d.ts +48 -0
  135. package/types/ngneers-controls-calendar.d.ts +466 -0
  136. package/types/ngneers-controls-checkbox.d.ts +40 -0
  137. package/types/ngneers-controls-chip.d.ts +202 -0
  138. package/types/ngneers-controls-default-icons.d.ts +5 -0
  139. package/types/ngneers-controls-defer.d.ts +48 -0
  140. package/types/ngneers-controls-dialog.d.ts +399 -0
  141. package/types/ngneers-controls-directives.d.ts +171 -0
  142. package/types/ngneers-controls-drawer.d.ts +308 -0
  143. package/types/ngneers-controls-edit-inplace.d.ts +263 -0
  144. package/types/ngneers-controls-errors.d.ts +155 -0
  145. package/types/ngneers-controls-filter.d.ts +609 -0
  146. package/types/ngneers-controls-hint.d.ts +88 -0
  147. package/types/ngneers-controls-i18n-translations-de.d.ts +164 -0
  148. package/types/ngneers-controls-i18n-translations-en.d.ts +164 -0
  149. package/types/ngneers-controls-i18n.d.ts +186 -0
  150. package/types/ngneers-controls-icon.d.ts +68 -0
  151. package/types/ngneers-controls-inplace.d.ts +98 -0
  152. package/types/ngneers-controls-input-field.d.ts +248 -0
  153. package/types/ngneers-controls-input.d.ts +30 -0
  154. package/types/ngneers-controls-item-view.d.ts +215 -0
  155. package/types/ngneers-controls-list-box.d.ts +334 -0
  156. package/types/ngneers-controls-mask-input.d.ts +434 -0
  157. package/types/ngneers-controls-menu.d.ts +192 -0
  158. package/types/ngneers-controls-message.d.ts +21 -0
  159. package/types/ngneers-controls-number-input.d.ts +146 -0
  160. package/types/ngneers-controls-paginator.d.ts +255 -0
  161. package/types/ngneers-controls-popover.d.ts +116 -0
  162. package/types/ngneers-controls-progress.d.ts +49 -0
  163. package/types/ngneers-controls-radio.d.ts +91 -0
  164. package/types/ngneers-controls-roving-focus.d.ts +107 -0
  165. package/types/ngneers-controls-scroll-shadow.d.ts +25 -0
  166. package/types/ngneers-controls-scroller.d.ts +151 -0
  167. package/types/ngneers-controls-select-button.d.ts +51 -0
  168. package/types/ngneers-controls-select.d.ts +409 -0
  169. package/types/ngneers-controls-slider.d.ts +57 -0
  170. package/types/ngneers-controls-snackbar.d.ts +330 -0
  171. package/types/ngneers-controls-spin-buttons.d.ts +69 -0
  172. package/types/ngneers-controls-spinner.d.ts +117 -0
  173. package/types/ngneers-controls-splitter.d.ts +465 -0
  174. package/types/ngneers-controls-state.d.ts +102 -0
  175. package/types/ngneers-controls-switch.d.ts +18 -0
  176. package/types/ngneers-controls-table.d.ts +3127 -0
  177. package/types/ngneers-controls-tabs.d.ts +118 -0
  178. package/types/ngneers-controls-tag.d.ts +21 -0
  179. package/types/ngneers-controls-toast.d.ts +298 -0
  180. package/types/ngneers-controls-toggle-button.d.ts +48 -0
  181. package/types/ngneers-controls-tooltip.d.ts +189 -0
  182. package/types/ngneers-controls-tree.d.ts +409 -0
  183. package/types/ngneers-controls-upload.d.ts +347 -0
  184. package/types/ngneers-controls-utils-ng.d.ts +129 -0
  185. package/types/ngneers-controls-utils.d.ts +130 -0
  186. package/types/ngneers-controls.d.ts +2 -0
@@ -0,0 +1,277 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ElementRef, Injector, InputSignal, Signal, InjectionToken, Type, Provider } from '@angular/core';
3
+ import { ControlTemplateInfo, AppliedThemeClassCfg } from '@ngneers/controls/api/ng';
4
+ import { CustomKind } from '@ngneers/controls-custom-types';
5
+ import { ControlTemplate, ControlName as ControlName$1, ThemeTemplate as ThemeTemplate$1, ThemeClasses } from '@ngneers/controls-themes';
6
+ import { ControlName, ThemeTemplate } from '@ngneers/controls-themes/templates';
7
+ import { FormValueControl } from '@angular/forms/signals';
8
+
9
+ declare const NGN_CONTROL: InjectionToken<NgnBase<never>>;
10
+ type AnyNgnBase = NgnBaseSafe<any>;
11
+ type NgnBaseSafe<T extends ControlName | null> = Omit<NgnBase<T>, 'kind' | 'appliedKind' | 'pt'>;
12
+ type FullAnyNgnBase = Omit<NgnBase<any>, 'kind' | 'appliedKind' | 'pt'> & {
13
+ kind: InputSignal<CustomKind<any> | undefined>;
14
+ appliedKind: InputSignal<CustomKind<any> | undefined>;
15
+ pt: InputSignal<NgnPassthrough<any> | undefined>;
16
+ };
17
+ /**
18
+ * @internal
19
+ * Provides the control itself for dependency injection.
20
+ * @param control - The control class to provide.
21
+ * @returns A provider for the control itself.
22
+ */
23
+ declare function provideSelf(control: Type<unknown>): Provider;
24
+ declare abstract class NgnBase<T extends ControlName | null> {
25
+ protected abstract theme: ControlTemplateInfo<never> | null;
26
+ private readonly _defaultKind;
27
+ private readonly _defaultColor;
28
+ private readonly _kindOverride;
29
+ /**
30
+ * The element reference for the host element.
31
+ */
32
+ readonly element: ElementRef<HTMLElement>;
33
+ /**
34
+ * The injector for the component.
35
+ */
36
+ readonly injector: Injector;
37
+ /**
38
+ * If true, the control will not apply any theme styles.
39
+ * The base styles of the control will still be applied.
40
+ * @default false
41
+ */
42
+ readonly unstyled: _angular_core.InputSignalWithTransform<boolean, unknown>;
43
+ /**
44
+ * Some controls support custom kinds for styling purposes.
45
+ * The available kinds depend on the control and the theme used.
46
+ *
47
+ * TODO: link to custom types documentation
48
+ */
49
+ readonly kind: InputSignal<CustomKind<T> | undefined>;
50
+ readonly color: InputSignal<unknown>;
51
+ readonly appliedKind: Signal<CustomKind<T> | undefined>;
52
+ readonly appliedColor: Signal<unknown>;
53
+ /**
54
+ * Custom passthrough attributes to apply to the control's theme classes and its dependencies.
55
+ * This allows for fine-grained customization of attributes, styles and more.
56
+ */
57
+ readonly pt: InputSignal<(T extends string ? NgnPassthrough<T> : never) | undefined>;
58
+ /**
59
+ * Marks a control as the primary value control of a surrounding field
60
+ * (e.g. `ngn-input-field`). Fields resolve their projected control by
61
+ * filtering for this flag, so auxiliary controls placed inside the field
62
+ * (buttons, icons, spin buttons, …) never shadow the actual input.
63
+ * Overridden with `true` by input, mask-input, calendar, select, ….
64
+ */
65
+ readonly isFieldControl: boolean;
66
+ /**
67
+ * Hook for placing focus/selection from a pointer event that originated in the
68
+ * surrounding field (or the control itself). The default does nothing and
69
+ * returns `false`, signalling the surrounding field should fall back to its
70
+ * primitive focusing. Controls that own internal focus placement (e.g.
71
+ * mask-input) override this, act on the pointer location, and return `true`.
72
+ */
73
+ focusFromPointer(_event: MouseEvent): boolean;
74
+ /**
75
+ * Hook for stepping the control's value (e.g. from `ngn-spin-buttons` or
76
+ * other external steppers). The default does nothing and returns `false`.
77
+ * Controls with a steppable value (e.g. number-input) override this, apply
78
+ * the step and return `true`.
79
+ * @param _direction - `1` to increment, `-1` to decrement.
80
+ * @param _big - Whether to apply the control's big step (e.g. Shift+Arrow).
81
+ */
82
+ stepValue(_direction: 1 | -1, _big?: boolean): boolean;
83
+ /**
84
+ * Hook telling external steppers (e.g. `ngn-spin-buttons`) whether the value
85
+ * can currently be stepped in the given direction. The default returns
86
+ * `false`; controls overriding {@link stepValue} override this as well
87
+ * (typically `false` at a min/max bound or while disabled/readonly).
88
+ */
89
+ canStepValue(_direction: 1 | -1): boolean;
90
+ /**
91
+ * Hook for clearing the control's own value/state (e.g. from a surrounding
92
+ * field's clear button). The default does nothing and returns `false`, so the
93
+ * caller falls back to clearing the underlying DOM input. Controls that manage
94
+ * their own value (e.g. mask-input) override this to reset and return `true`.
95
+ */
96
+ clearValue(): boolean;
97
+ /**
98
+ * Temporarily overrides the authored kind without mutating the public input.
99
+ * Intended for derived control states such as validation-driven hints.
100
+ */
101
+ protected setKindOverride(kind: CustomKind<T> | undefined): void;
102
+ private readonly _childNgnControls;
103
+ private readonly _afterLeaveCbs;
104
+ constructor();
105
+ /**
106
+ * Prepares the after leave hook to be called when the control is destroyed
107
+ * and its leave animation has finished.
108
+ */
109
+ private prepareAfterLeaveHook;
110
+ private static _leaveQueue;
111
+ private static _leaveRafScheduled;
112
+ private static _enqueueLeaveCheck;
113
+ private static _processLeaveQueue;
114
+ /**
115
+ * Recursively searches for a leave animation on the element and its parents.
116
+ */
117
+ private static _findLeaveAnimation;
118
+ private afterLeaveInternal;
119
+ /**
120
+ * Lifecycle hook that is called after the control has left (been removed from) the DOM.
121
+ * Can be overridden by subclasses to perform custom actions after the leave animation.
122
+ */
123
+ protected afterLeave(): void;
124
+ /**
125
+ * @internal
126
+ */
127
+ protected injectThemeTemplate<External extends boolean = false>(template: External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never, hostClass?: null extends T ? never : AppliedThemeClassCfg<T & string>): ControlTemplateInfo<External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never>;
128
+ /**
129
+ * Toggles the kind and color theme classes based on the current values of the kind and color inputs.
130
+ */
131
+ private initializeKindAndColorClasses;
132
+ /**
133
+ * Initializes automatic theme class toggling for a given prefix based on the provided string signal.
134
+ *
135
+ * ⚠️ Caution: This method assumes that the control's theme supports classes with the given prefix.
136
+ *
137
+ * ⚠️ Caution: Make sure the signal provides only string or nullish values.
138
+ *
139
+ * @param prefix The prefix for the theme class (e.g., 'kind' or 'color').
140
+ * @param signal The signal that provides the current string value for the theme class.
141
+ */
142
+ protected initializeAutoThemeClasses(prefix: string, signal: Signal<unknown | undefined>): void;
143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgnBase<any>, never>;
144
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgnBase<any>, never, never, { "unstyled": { "alias": "unstyled"; "required": false; "isSignal": true; }; "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "pt": { "alias": "pt"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
145
+ }
146
+
147
+ /** The control name backing a parent `NgnBaseSafe`, or `never` for a nameless base. */
148
+ type ParentName<T> = T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never;
149
+ /**
150
+ * Union of the NON-projected dependency-slot class tokens declared on a control's
151
+ * theme template — i.e. the valid `[ptDep]` targets for parent control `Name`.
152
+ * Projected slots are excluded — they have no host element to bind `[ptDep]` to,
153
+ * so accepting them would type-check a no-op.
154
+ */
155
+ type DepClass<Name extends ControlName$1> = ThemeTemplate$1[Name] extends ControlTemplate ? Exclude<ThemeTemplate$1[Name]['dependencies'][number], {
156
+ projected: true;
157
+ }>['class'] : never;
158
+ declare class NgnPt<T extends NgnBaseSafe<Name>, Name extends ControlName$1> {
159
+ /** The parent control whose theme/passthrough this element pulls from. */
160
+ readonly ptInt: _angular_core.InputSignal<T>;
161
+ /**
162
+ * Parent-scope class token(s) applied to this element, along with the parent's
163
+ * `pt` slice for those classes. Use for flat theme parts of the parent.
164
+ */
165
+ readonly ptClass: _angular_core.InputSignal<AppliedThemeClassCfg<ParentName<T>> | undefined>;
166
+ /**
167
+ * Dependency-slot class on the parent. Applies the parent's marker class
168
+ * (`{parentScope}-{ptDep}`) to this element and forwards the parent's
169
+ * `pt[ptDep]` slice into the nested control that lives on this element, so the
170
+ * nested control resolves it against its own theme.
171
+ */
172
+ readonly ptDep: _angular_core.InputSignal<DepClass<ParentName<T>> | undefined>;
173
+ /**
174
+ * The nested control hosted on THIS element (present when `ptDep` targets a
175
+ * control). `self: true` is essential: without it the injection climbs to an
176
+ * ancestor control (e.g. the parent that owns `[ptInt]`), and the forwarding
177
+ * effect would then overwrite the ancestor's `pt` instead of the child's.
178
+ */
179
+ private readonly _self;
180
+ /**
181
+ * Flat class engine for `ptClass`: applies the parent's scope class(es) and the
182
+ * matching `pt` slice to this element. A missing `ptClass` resolves to a no-op.
183
+ */
184
+ private readonly _classEngine;
185
+ /**
186
+ * Marker engine for `ptDep`: applies ONLY the parent's `{parentScope}-{ptDep}`
187
+ * class to this element (`applyPassthrough: false`). The forwarded slice is
188
+ * applied separately, through the nested control's own engine.
189
+ */
190
+ private readonly _markerEngine;
191
+ /** The parent's `pt` slice for the current `ptDep` slot, or `undefined`. */
192
+ private readonly _depSlice;
193
+ constructor();
194
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgnPt<any, any>, never>;
195
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgnPt<any, any>, "[ptInt]", never, { "ptInt": { "alias": "ptInt"; "required": true; "isSignal": true; }; "ptClass": { "alias": "ptClass"; "required": false; "isSignal": true; }; "ptDep": { "alias": "ptDep"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
196
+ }
197
+
198
+ declare class NgnPtEngine<T extends NgnBaseSafe<Name>, Name extends ControlName$1> {
199
+ private readonly pt;
200
+ private readonly ptClass;
201
+ private readonly _elementRef;
202
+ private readonly _destroyRef;
203
+ /** The passthrough values currently applied to the element, for teardown on destroy. */
204
+ private _currentAppliedPts;
205
+ private readonly classes;
206
+ private readonly _appliedPts;
207
+ constructor(pt: Signal<T> | T, ptClass: Signal<AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>> | AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>, options?: {
208
+ /**
209
+ * When `false`, the engine only toggles the resolved theme class(es) on the
210
+ * element and does NOT apply the control's `pt` slice (styles/attributes/
211
+ * classes/listeners) for those classes. Used for dependency-slot markers,
212
+ * where the forwarded passthrough is applied through the nested control's
213
+ * own engine rather than flatly on the host. Defaults to `true`.
214
+ */
215
+ applyPassthrough?: boolean;
216
+ });
217
+ private setNewPtValues;
218
+ private removePreviousPtValues;
219
+ }
220
+
221
+ type EventListenerMap = {
222
+ [K in keyof GlobalEventHandlersEventMap]: (event: GlobalEventHandlersEventMap[K]) => void;
223
+ };
224
+ type PassthroughValue = {
225
+ $attributes?: Record<string, string>;
226
+ $styles?: Partial<CSSStyleDeclaration>;
227
+ $classes?: string | string[];
228
+ $listeners?: Partial<EventListenerMap>;
229
+ };
230
+ type ThemeClassToPassthrough<T> = {
231
+ [K in keyof T]?: T[K] extends string ? PassthroughValue : ThemeClassToPassthrough<T[K]> & PassthroughValue;
232
+ };
233
+ type NgnPassthrough<T extends ControlName$1> = T extends null ? never : ThemeTemplate$1[T] extends ControlTemplate ? ThemeClassToPassthrough<ThemeClasses<ThemeTemplate$1[T]>> & PassthroughValue : never;
234
+ type AnyNgnPassthrough = NgnPassthrough<any>;
235
+
236
+ declare function setNgnInstance(element: HTMLElement, instance: AnyNgnBase): void;
237
+ declare function getNgnInstance(element: HTMLElement): FullAnyNgnBase;
238
+ declare function getNearestNgnInstance<T extends Type<Omit<AnyNgnBase, 'kind'>>>(element: HTMLElement, kind?: T): InstanceType<T> | null;
239
+ declare function getNearestNgnInstanceSig<T extends Type<AnyNgnBase>>(element: HTMLElement, kind?: T): Signal<InstanceType<T> | null>;
240
+
241
+ declare abstract class ValueControlBase<C extends ControlName, T> extends NgnBase<C> implements FormValueControl<T> {
242
+ /**
243
+ * The label for the control.
244
+ */
245
+ readonly label: _angular_core.InputSignal<string | null>;
246
+ /**
247
+ * Sets the `aria-labelledby` attribute on the control.
248
+ * @default null
249
+ */
250
+ readonly labelledBy: _angular_core.InputSignal<string | null>;
251
+ /**
252
+ * The ID for the control
253
+ * @default generateElementId()
254
+ */
255
+ readonly inputId: _angular_core.InputSignal<string>;
256
+ /**
257
+ * Explicitly apply invalid state styling
258
+ * @default false
259
+ */
260
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
261
+ /**
262
+ * The value of the control.
263
+ */
264
+ readonly value: _angular_core.ModelSignal<T>;
265
+ /**
266
+ * Set the disabled state of the control.
267
+ */
268
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
269
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
270
+ readonly touched: _angular_core.ModelSignal<boolean>;
271
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
272
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ValueControlBase<any, any>, never>;
273
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ValueControlBase<any, any>, never, never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelledBy": { "alias": "labelledBy"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
274
+ }
275
+
276
+ export { NGN_CONTROL, NgnBase, NgnPt, NgnPtEngine, ValueControlBase, getNearestNgnInstance, getNearestNgnInstanceSig, getNgnInstance, provideSelf, setNgnInstance };
277
+ export type { AnyNgnBase, AnyNgnPassthrough, DepClass, FullAnyNgnBase, NgnBaseSafe, NgnPassthrough, PassthroughValue };
@@ -0,0 +1,272 @@
1
+ import * as _ngneers_controls_custom_types from '@ngneers/controls-custom-types';
2
+ import { IconType } from '@ngneers/controls-custom-types';
3
+ import * as _iconify_types from '@iconify/types';
4
+ import * as _angular_core from '@angular/core';
5
+ import { TemplateRef } from '@angular/core';
6
+ import * as _ngneers_signal_translate from '@ngneers/signal-translate';
7
+ import * as _ngneers_controls_api_ng from '@ngneers/controls/api/ng';
8
+ import * as _ngneers_controls_themes from '@ngneers/controls-themes';
9
+ import { maybeCallback } from '@ngneers/controls/utils';
10
+ import { NgnBase } from '@ngneers/controls/base';
11
+ import { NgnActionItemFlat, NgnActionItem } from '@ngneers/controls/api';
12
+
13
+ type BreadcrumbItem = NgnActionItemFlat<NgnActionItem>;
14
+ type ItemTemplateType = {
15
+ $implicit: BreadcrumbItem;
16
+ };
17
+ type SeparatorTemplateType = {
18
+ $implicit: {
19
+ icon: IconType;
20
+ };
21
+ };
22
+ type OverflowTemplateType = {
23
+ $implicit: {
24
+ icon: IconType;
25
+ overflowingItems: BreadcrumbItem[];
26
+ };
27
+ };
28
+
29
+ declare abstract class BreadcrumbTemplates extends NgnBase<'breadcrumb'> {
30
+ private readonly _defaultItemTemplate;
31
+ private readonly _userItemTemplate;
32
+ /**
33
+ * Set a custom template for an item.
34
+ * Can also be set using an `<ng-template>` element with `#item` template reference variable.
35
+ */
36
+ readonly templateItem: _angular_core.InputSignal<TemplateRef<ItemTemplateType> | null>;
37
+ protected readonly itemTemplate: _angular_core.Signal<TemplateRef<ItemTemplateType>>;
38
+ private readonly _defaultSeparatorTemplate;
39
+ private readonly _userSeparatorTemplate;
40
+ /**
41
+ * Set a custom template for a separator.
42
+ * Can also be set using an `<ng-template>` element with `#separator` template reference variable.
43
+ */
44
+ readonly templateSeparator: _angular_core.InputSignal<TemplateRef<SeparatorTemplateType> | null>;
45
+ protected readonly separatorTemplate: _angular_core.Signal<TemplateRef<SeparatorTemplateType>>;
46
+ private readonly _defaultOverflowTemplate;
47
+ private readonly _userOverflowTemplate;
48
+ /**
49
+ * Set a custom template for the overflowing items.
50
+ * Can also be set using an `<ng-template>` element with `#overflow` template reference variable.
51
+ */
52
+ readonly templateOverflow: _angular_core.InputSignal<TemplateRef<OverflowTemplateType> | null>;
53
+ protected readonly overflowTemplate: _angular_core.Signal<TemplateRef<OverflowTemplateType>>;
54
+ /**
55
+ * Types for the breadcrumb templates.
56
+ */
57
+ readonly templateTypes: {
58
+ /**
59
+ * Type of the template variable for the item template.
60
+ */
61
+ item: ItemTemplateType;
62
+ separator: SeparatorTemplateType;
63
+ overflow: OverflowTemplateType;
64
+ } & {
65
+ $implicit: {
66
+ item: Partial<ItemTemplateType>;
67
+ separator: Partial<SeparatorTemplateType>;
68
+ overflow: Partial<OverflowTemplateType>;
69
+ };
70
+ };
71
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbTemplates, never>;
72
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BreadcrumbTemplates, never, never, { "templateItem": { "alias": "templateItem"; "required": false; "isSignal": true; }; "templateSeparator": { "alias": "templateSeparator"; "required": false; "isSignal": true; }; "templateOverflow": { "alias": "templateOverflow"; "required": false; "isSignal": true; }; }, {}, ["_userItemTemplate", "_userSeparatorTemplate", "_userOverflowTemplate"], never, true, never>;
73
+ }
74
+
75
+ /**
76
+ * @category control
77
+ */
78
+ declare class NgnBreadcrumb extends BreadcrumbTemplates {
79
+ protected readonly theme: _ngneers_controls_api_ng.ControlTemplateInfo<_ngneers_controls_themes.ControlTemplate<"breadcrumb", ["root", "item", "item-clickable", "separator", "overflow"], readonly [{
80
+ readonly class: "item-view";
81
+ readonly template: _ngneers_controls_themes.ControlTemplate<"item-view", ["root", "item", "item-overflowing", "more-items", "more-items-hidden", "more-items-default", "hidden-separator"], readonly []>;
82
+ }, {
83
+ readonly class: "menu";
84
+ readonly template: _ngneers_controls_themes.ControlTemplate<"menu", ["root", "submenu", "item", "item-opened", "icon-children", "separator"], readonly [{
85
+ readonly class: "popover";
86
+ readonly template: _ngneers_controls_themes.ControlTemplate<"popover", ["root", "content", "content-closing"], readonly []>;
87
+ }]>;
88
+ }]>>;
89
+ protected readonly i18n: _ngneers_signal_translate.TranslationsSignal<{
90
+ calendar: {
91
+ today: string;
92
+ input: string;
93
+ selectYear: string;
94
+ selectMonth: string;
95
+ previousMonth: string;
96
+ nextMonth: string;
97
+ weekdays: {
98
+ monday: string;
99
+ tuesday: string;
100
+ wednesday: string;
101
+ thursday: string;
102
+ friday: string;
103
+ saturday: string;
104
+ sunday: string;
105
+ };
106
+ weekdaysShort: {
107
+ monday: string;
108
+ tuesday: string;
109
+ wednesday: string;
110
+ thursday: string;
111
+ friday: string;
112
+ saturday: string;
113
+ sunday: string;
114
+ };
115
+ months: {
116
+ january: string;
117
+ february: string;
118
+ march: string;
119
+ april: string;
120
+ may: string;
121
+ june: string;
122
+ july: string;
123
+ august: string;
124
+ september: string;
125
+ october: string;
126
+ november: string;
127
+ december: string;
128
+ };
129
+ };
130
+ editInplace: {
131
+ placeholder: string;
132
+ confirm: string;
133
+ };
134
+ filter: {
135
+ noFilter: string;
136
+ addCondition: string;
137
+ removeCondition: string;
138
+ operator: string;
139
+ value: string;
140
+ clear: string;
141
+ apply: string;
142
+ cancel: string;
143
+ matchModeLabel: string;
144
+ match: {
145
+ all: string;
146
+ any: string;
147
+ and: string;
148
+ or: string;
149
+ };
150
+ selected: string;
151
+ conditions: string;
152
+ operators: {
153
+ isEqual: string;
154
+ isNotEqual: string;
155
+ contains: string;
156
+ startsWith: string;
157
+ endsWith: string;
158
+ in: string;
159
+ isEmpty: string;
160
+ isNotEmpty: string;
161
+ greaterThan: string;
162
+ greaterThanOrEqual: string;
163
+ lessThan: string;
164
+ lessThanOrEqual: string;
165
+ after: string;
166
+ onOrAfter: string;
167
+ before: string;
168
+ onOrBefore: string;
169
+ isTrue: string;
170
+ isFalse: string;
171
+ custom: string;
172
+ };
173
+ };
174
+ splitter: {
175
+ handleLabel: string;
176
+ };
177
+ inputField: {
178
+ clearInput: string;
179
+ };
180
+ maskInput: {
181
+ roleDescription: string;
182
+ segmentRange: string;
183
+ optionSeparator: string;
184
+ };
185
+ drawer: {
186
+ close: string;
187
+ };
188
+ dialog: {
189
+ close: string;
190
+ };
191
+ chip: {
192
+ close: string;
193
+ };
194
+ breadcrumb: {
195
+ overflow: string;
196
+ };
197
+ toast: {
198
+ close: string;
199
+ region: string;
200
+ };
201
+ snackbar: {
202
+ close: string;
203
+ region: string;
204
+ severity: {
205
+ error: string;
206
+ warning: string;
207
+ success: string;
208
+ info: string;
209
+ };
210
+ };
211
+ upload: {
212
+ upload: string;
213
+ uploadNamed: string;
214
+ retryNamed: string;
215
+ cancelNamed: string;
216
+ removeNamed: string;
217
+ progressNamed: string;
218
+ };
219
+ select: {
220
+ filterOptions: string;
221
+ };
222
+ paginator: {
223
+ previousPage: string;
224
+ nextPage: string;
225
+ };
226
+ listBox: {
227
+ noItemsFound: string;
228
+ };
229
+ tree: {
230
+ noItemsFound: string;
231
+ };
232
+ table: {
233
+ selectAllRows: string;
234
+ selectRow: string;
235
+ sortedBy: string;
236
+ sortAscending: string;
237
+ sortDescending: string;
238
+ sortCleared: string;
239
+ selectedCount: string;
240
+ page: string;
241
+ resultCount: string;
242
+ };
243
+ state: {
244
+ loading: string;
245
+ success: string;
246
+ warning: string;
247
+ error: string;
248
+ cancelled: string;
249
+ };
250
+ }, "_">;
251
+ /**
252
+ * The breadcrumb entries to render, ordered from root to the current page.
253
+ * @see {@link BreadcrumbItem}
254
+ */
255
+ readonly items: _angular_core.InputSignal<BreadcrumbItem[]>;
256
+ /**
257
+ * Icon rendered between adjacent breadcrumb items.
258
+ * Falls back to the theme's default separator icon when unset.
259
+ */
260
+ readonly iconItemSeparator: _angular_core.InputSignal<_iconify_types.IconifyIcon | _ngneers_controls_custom_types.NgnIconEntry | undefined>;
261
+ /**
262
+ * Icon for the overflow menu trigger shown when items are collapsed to save space.
263
+ * Falls back to the theme's default overflow icon when unset.
264
+ */
265
+ readonly iconOverflow: _angular_core.InputSignal<_iconify_types.IconifyIcon | _ngneers_controls_custom_types.NgnIconEntry | undefined>;
266
+ protected readonly maybeCallback: typeof maybeCallback;
267
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgnBreadcrumb, never>;
268
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgnBreadcrumb, "ngn-breadcrumb", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "iconItemSeparator": { "alias": "iconItemSeparator"; "required": false; "isSignal": true; }; "iconOverflow": { "alias": "iconOverflow"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
269
+ }
270
+
271
+ export { NgnBreadcrumb };
272
+ export type { BreadcrumbItem, ItemTemplateType, OverflowTemplateType, SeparatorTemplateType };
@@ -0,0 +1,46 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Signal } from '@angular/core';
3
+ import * as _ngneers_controls_api_ng from '@ngneers/controls/api/ng';
4
+ import * as _ngneers_controls_themes from '@ngneers/controls-themes';
5
+ import { NgnBase } from '@ngneers/controls/base';
6
+
7
+ /**
8
+ * @category control
9
+ */
10
+ declare class NgnButtonGroup extends NgnBase<'buttonGroup'> {
11
+ protected readonly theme: _ngneers_controls_api_ng.ControlTemplateInfo<_ngneers_controls_themes.ControlTemplate<"button-group", ["root", "vertical", "horizontal"], readonly [{
12
+ readonly class: "button";
13
+ readonly template: _ngneers_controls_themes.ControlTemplate<"button", ["root", "inline", "loading", `kind-${string}`, `color-${string}`], readonly []>;
14
+ readonly projected: true;
15
+ }, {
16
+ readonly class: "toggle-button";
17
+ readonly template: _ngneers_controls_themes.ControlTemplate<"toggle-button", ["root", "invalid", "button", "label", "active", "placeholder", "placeholder-active"], readonly []>;
18
+ readonly projected: true;
19
+ }]>>;
20
+ private readonly _contentRef;
21
+ private readonly _content;
22
+ /**
23
+ * The roving-focus group on the inner container. Coordinates a single tab
24
+ * stop across the projected buttons: the active button gets `tabindex="0"`,
25
+ * the rest `-1`, and arrow keys move focus between them.
26
+ */
27
+ private readonly _roving;
28
+ private readonly _parentSize;
29
+ private readonly _contentSizes;
30
+ private readonly _contentWidth;
31
+ /**
32
+ * Defines the orientation of the button group.
33
+ * - 'auto' - The orientation is determined based on the available space.
34
+ * - 'horizontal' - The buttons are arranged horizontally. (Default for `auto` if enough space)
35
+ * - 'vertical' - The buttons are arranged vertically.
36
+ * @default 'auto'
37
+ */
38
+ readonly orientation: i0.InputSignal<"vertical" | "horizontal" | "auto">;
39
+ protected readonly appliedOrientation: Signal<"vertical" | "horizontal">;
40
+ private readonly _injector;
41
+ constructor();
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgnButtonGroup, never>;
43
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgnButtonGroup, "ngn-button-group", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, ["_contentRef"], ["*"], true, never>;
44
+ }
45
+
46
+ export { NgnButtonGroup };
@@ -0,0 +1,48 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { NgnBase } from '@ngneers/controls/base';
3
+ import { maybeCallback } from '@ngneers/controls/utils';
4
+ import { NgnActionButtonConfig } from '@ngneers/controls/api';
5
+ import * as _ngneers_controls_api_ng from '@ngneers/controls/api/ng';
6
+ import * as _ngneers_controls_themes from '@ngneers/controls-themes';
7
+
8
+ declare class NgnActionButton<T> extends NgnBase<null> {
9
+ protected readonly theme: null;
10
+ /**
11
+ * The configuration describing the button: its label, icon, tooltip, value,
12
+ * and the action callback fired on click.
13
+ * @see {@link NgnActionButtonConfig}
14
+ */
15
+ readonly config: _angular_core.InputSignal<NgnActionButtonConfig<T>>;
16
+ /**
17
+ * Whether the inner button is displayed inline (line-height sized).
18
+ * @default false
19
+ */
20
+ readonly inline: _angular_core.InputSignalWithTransform<boolean, unknown>;
21
+ /**
22
+ * Emits the {@link config}'s `value` when the button is clicked, after its
23
+ * `action` callback has run.
24
+ */
25
+ readonly clicked: _angular_core.OutputEmitterRef<T>;
26
+ protected readonly maybeCallback: typeof maybeCallback;
27
+ protected click(event: PointerEvent): void;
28
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgnActionButton<any>, never>;
29
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgnActionButton<any>, "ngn-action-button", never, { "config": { "alias": "config"; "required": true; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
30
+ }
31
+
32
+ /**
33
+ * @category control
34
+ */
35
+ declare class NgnButton extends NgnBase<'button'> {
36
+ protected readonly theme: _ngneers_controls_api_ng.ControlTemplateInfo<_ngneers_controls_themes.ControlTemplate<"button", ["root", "inline", "loading", `kind-${string}`, `color-${string}`], readonly []>>;
37
+ /**
38
+ * Whether the button is displayed inline.
39
+ * This will make the button height fit the current line height.
40
+ */
41
+ readonly inline: _angular_core.InputSignalWithTransform<boolean, unknown>;
42
+ constructor();
43
+ protected afterLeave(): void;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgnButton, never>;
45
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgnButton, "button[ngnButton], a[ngnButton]", ["ngnButton"], { "inline": { "alias": "ngnButtonInline"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
46
+ }
47
+
48
+ export { NgnActionButton, NgnButton };