forty-cdk 0.2.0 → 0.3.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 (220) hide show
  1. package/accordion/README.md +122 -0
  2. package/aspect-ratio/README.md +76 -0
  3. package/avatar/README.md +100 -0
  4. package/breadcrumbs/README.md +49 -0
  5. package/breakpoints/README.md +81 -0
  6. package/button/README.md +49 -0
  7. package/calendar/README.md +458 -0
  8. package/carousel/README.md +358 -0
  9. package/checkbox/README.md +146 -0
  10. package/combobox/README.md +535 -0
  11. package/context-menu/README.md +139 -0
  12. package/date-field/README.md +184 -0
  13. package/date-picker/README.md +338 -0
  14. package/dialog/README.md +388 -0
  15. package/disclosure/README.md +114 -0
  16. package/drag-drop/README.md +359 -0
  17. package/drawer/README.md +560 -0
  18. package/dropdown-menu/README.md +176 -0
  19. package/fesm2022/forty-cdk-accordion.mjs +348 -0
  20. package/fesm2022/forty-cdk-accordion.mjs.map +1 -0
  21. package/fesm2022/forty-cdk-aspect-ratio.mjs +74 -0
  22. package/fesm2022/forty-cdk-aspect-ratio.mjs.map +1 -0
  23. package/fesm2022/forty-cdk-avatar.mjs +308 -0
  24. package/fesm2022/forty-cdk-avatar.mjs.map +1 -0
  25. package/fesm2022/forty-cdk-breadcrumbs.mjs +125 -0
  26. package/fesm2022/forty-cdk-breadcrumbs.mjs.map +1 -0
  27. package/fesm2022/forty-cdk-breakpoints.mjs +117 -0
  28. package/fesm2022/forty-cdk-breakpoints.mjs.map +1 -0
  29. package/fesm2022/forty-cdk-button.mjs +134 -0
  30. package/fesm2022/forty-cdk-button.mjs.map +1 -0
  31. package/fesm2022/forty-cdk-calendar.mjs +2034 -0
  32. package/fesm2022/forty-cdk-calendar.mjs.map +1 -0
  33. package/fesm2022/forty-cdk-carousel.mjs +968 -0
  34. package/fesm2022/forty-cdk-carousel.mjs.map +1 -0
  35. package/fesm2022/forty-cdk-checkbox.mjs +226 -0
  36. package/fesm2022/forty-cdk-checkbox.mjs.map +1 -0
  37. package/fesm2022/forty-cdk-combobox.mjs +2596 -0
  38. package/fesm2022/forty-cdk-combobox.mjs.map +1 -0
  39. package/fesm2022/forty-cdk-context-menu.mjs +413 -0
  40. package/fesm2022/forty-cdk-context-menu.mjs.map +1 -0
  41. package/fesm2022/forty-cdk-core.mjs +9022 -0
  42. package/fesm2022/forty-cdk-core.mjs.map +1 -0
  43. package/fesm2022/forty-cdk-date-field.mjs +744 -0
  44. package/fesm2022/forty-cdk-date-field.mjs.map +1 -0
  45. package/fesm2022/forty-cdk-date-picker.mjs +1011 -0
  46. package/fesm2022/forty-cdk-date-picker.mjs.map +1 -0
  47. package/fesm2022/forty-cdk-dialog.mjs +707 -0
  48. package/fesm2022/forty-cdk-dialog.mjs.map +1 -0
  49. package/fesm2022/forty-cdk-disclosure.mjs +190 -0
  50. package/fesm2022/forty-cdk-disclosure.mjs.map +1 -0
  51. package/fesm2022/forty-cdk-drag-drop.mjs +1180 -0
  52. package/fesm2022/forty-cdk-drag-drop.mjs.map +1 -0
  53. package/fesm2022/forty-cdk-drawer.mjs +1641 -0
  54. package/fesm2022/forty-cdk-drawer.mjs.map +1 -0
  55. package/fesm2022/forty-cdk-dropdown-menu.mjs +350 -0
  56. package/fesm2022/forty-cdk-dropdown-menu.mjs.map +1 -0
  57. package/fesm2022/forty-cdk-field.mjs +425 -0
  58. package/fesm2022/forty-cdk-field.mjs.map +1 -0
  59. package/fesm2022/forty-cdk-fieldset.mjs +164 -0
  60. package/fesm2022/forty-cdk-fieldset.mjs.map +1 -0
  61. package/fesm2022/forty-cdk-file-upload.mjs +221 -0
  62. package/fesm2022/forty-cdk-file-upload.mjs.map +1 -0
  63. package/fesm2022/forty-cdk-hover-card.mjs +496 -0
  64. package/fesm2022/forty-cdk-hover-card.mjs.map +1 -0
  65. package/fesm2022/forty-cdk-input.mjs +274 -0
  66. package/fesm2022/forty-cdk-input.mjs.map +1 -0
  67. package/fesm2022/forty-cdk-internationalized-date.mjs +1 -1
  68. package/fesm2022/forty-cdk-internationalized-date.mjs.map +1 -1
  69. package/fesm2022/forty-cdk-listbox.mjs +1279 -0
  70. package/fesm2022/forty-cdk-listbox.mjs.map +1 -0
  71. package/fesm2022/forty-cdk-menu.mjs +1439 -0
  72. package/fesm2022/forty-cdk-menu.mjs.map +1 -0
  73. package/fesm2022/forty-cdk-menubar.mjs +787 -0
  74. package/fesm2022/forty-cdk-menubar.mjs.map +1 -0
  75. package/fesm2022/forty-cdk-meter.mjs +211 -0
  76. package/fesm2022/forty-cdk-meter.mjs.map +1 -0
  77. package/fesm2022/forty-cdk-navigation-menu.mjs +1145 -0
  78. package/fesm2022/forty-cdk-navigation-menu.mjs.map +1 -0
  79. package/fesm2022/forty-cdk-number-input.mjs +559 -0
  80. package/fesm2022/forty-cdk-number-input.mjs.map +1 -0
  81. package/fesm2022/forty-cdk-otp-input.mjs +527 -0
  82. package/fesm2022/forty-cdk-otp-input.mjs.map +1 -0
  83. package/fesm2022/forty-cdk-pagination.mjs +323 -0
  84. package/fesm2022/forty-cdk-pagination.mjs.map +1 -0
  85. package/fesm2022/forty-cdk-pane-resizer.mjs +297 -0
  86. package/fesm2022/forty-cdk-pane-resizer.mjs.map +1 -0
  87. package/fesm2022/forty-cdk-popover.mjs +698 -0
  88. package/fesm2022/forty-cdk-popover.mjs.map +1 -0
  89. package/fesm2022/forty-cdk-progress.mjs +226 -0
  90. package/fesm2022/forty-cdk-progress.mjs.map +1 -0
  91. package/fesm2022/forty-cdk-radio-group.mjs +378 -0
  92. package/fesm2022/forty-cdk-radio-group.mjs.map +1 -0
  93. package/fesm2022/forty-cdk-scroll-area.mjs +640 -0
  94. package/fesm2022/forty-cdk-scroll-area.mjs.map +1 -0
  95. package/fesm2022/forty-cdk-search.mjs +205 -0
  96. package/fesm2022/forty-cdk-search.mjs.map +1 -0
  97. package/fesm2022/forty-cdk-select.mjs +1661 -0
  98. package/fesm2022/forty-cdk-select.mjs.map +1 -0
  99. package/fesm2022/forty-cdk-separator.mjs +82 -0
  100. package/fesm2022/forty-cdk-separator.mjs.map +1 -0
  101. package/fesm2022/forty-cdk-signal-forms.mjs +97 -0
  102. package/fesm2022/forty-cdk-signal-forms.mjs.map +1 -0
  103. package/fesm2022/forty-cdk-slider.mjs +803 -0
  104. package/fesm2022/forty-cdk-slider.mjs.map +1 -0
  105. package/fesm2022/forty-cdk-stepper.mjs +886 -0
  106. package/fesm2022/forty-cdk-stepper.mjs.map +1 -0
  107. package/fesm2022/forty-cdk-switch.mjs +137 -0
  108. package/fesm2022/forty-cdk-switch.mjs.map +1 -0
  109. package/fesm2022/forty-cdk-table.mjs +1518 -0
  110. package/fesm2022/forty-cdk-table.mjs.map +1 -0
  111. package/fesm2022/forty-cdk-tabs.mjs +400 -0
  112. package/fesm2022/forty-cdk-tabs.mjs.map +1 -0
  113. package/fesm2022/forty-cdk-time-field.mjs +593 -0
  114. package/fesm2022/forty-cdk-time-field.mjs.map +1 -0
  115. package/fesm2022/forty-cdk-time-picker.mjs +1013 -0
  116. package/fesm2022/forty-cdk-time-picker.mjs.map +1 -0
  117. package/fesm2022/forty-cdk-toast.mjs +1153 -0
  118. package/fesm2022/forty-cdk-toast.mjs.map +1 -0
  119. package/fesm2022/forty-cdk-toggle.mjs +516 -0
  120. package/fesm2022/forty-cdk-toggle.mjs.map +1 -0
  121. package/fesm2022/forty-cdk-toolbar.mjs +374 -0
  122. package/fesm2022/forty-cdk-toolbar.mjs.map +1 -0
  123. package/fesm2022/forty-cdk-tooltip.mjs +672 -0
  124. package/fesm2022/forty-cdk-tooltip.mjs.map +1 -0
  125. package/fesm2022/forty-cdk-tree.mjs +2007 -0
  126. package/fesm2022/forty-cdk-tree.mjs.map +1 -0
  127. package/fesm2022/forty-cdk-virtualization.mjs +1 -1
  128. package/fesm2022/forty-cdk-virtualization.mjs.map +1 -1
  129. package/fesm2022/forty-cdk.mjs +0 -43310
  130. package/fesm2022/forty-cdk.mjs.map +1 -1
  131. package/field/README.md +97 -0
  132. package/fieldset/README.md +86 -0
  133. package/file-upload/README.md +73 -0
  134. package/hover-card/README.md +171 -0
  135. package/input/README.md +156 -0
  136. package/listbox/README.md +424 -0
  137. package/menu/README.md +181 -0
  138. package/menubar/README.md +140 -0
  139. package/meter/README.md +128 -0
  140. package/navigation-menu/README.md +253 -0
  141. package/number-input/README.md +171 -0
  142. package/otp-input/README.md +198 -0
  143. package/package.json +213 -1
  144. package/pagination/README.md +61 -0
  145. package/pane-resizer/README.md +136 -0
  146. package/popover/README.md +262 -0
  147. package/progress/README.md +115 -0
  148. package/radio-group/README.md +129 -0
  149. package/scroll-area/README.md +184 -0
  150. package/search/README.md +42 -0
  151. package/select/README.md +488 -0
  152. package/separator/README.md +84 -0
  153. package/signal-forms/README.md +72 -0
  154. package/slider/README.md +152 -0
  155. package/stepper/README.md +292 -0
  156. package/switch/README.md +116 -0
  157. package/table/README.md +769 -0
  158. package/tabs/README.md +130 -0
  159. package/time-field/README.md +157 -0
  160. package/time-picker/README.md +172 -0
  161. package/toast/README.md +398 -0
  162. package/toggle/README.md +224 -0
  163. package/toolbar/README.md +109 -0
  164. package/tooltip/README.md +274 -0
  165. package/tree/README.md +708 -0
  166. package/types/forty-cdk-accordion.d.ts +242 -0
  167. package/types/forty-cdk-aspect-ratio.d.ts +59 -0
  168. package/types/forty-cdk-avatar.d.ts +133 -0
  169. package/types/forty-cdk-breadcrumbs.d.ts +92 -0
  170. package/types/forty-cdk-breakpoints.d.ts +141 -0
  171. package/types/forty-cdk-button.d.ts +80 -0
  172. package/types/forty-cdk-calendar.d.ts +914 -0
  173. package/types/forty-cdk-carousel.d.ts +530 -0
  174. package/types/forty-cdk-checkbox.d.ts +141 -0
  175. package/types/forty-cdk-combobox.d.ts +1259 -0
  176. package/types/forty-cdk-context-menu.d.ts +313 -0
  177. package/types/forty-cdk-core.d.ts +5774 -0
  178. package/types/forty-cdk-date-field.d.ts +307 -0
  179. package/types/forty-cdk-date-picker.d.ts +622 -0
  180. package/types/forty-cdk-dialog.d.ts +546 -0
  181. package/types/forty-cdk-disclosure.d.ts +127 -0
  182. package/types/forty-cdk-drag-drop.d.ts +456 -0
  183. package/types/forty-cdk-drawer.d.ts +871 -0
  184. package/types/forty-cdk-dropdown-menu.d.ts +242 -0
  185. package/types/forty-cdk-field.d.ts +236 -0
  186. package/types/forty-cdk-fieldset.d.ts +119 -0
  187. package/types/forty-cdk-file-upload.d.ts +124 -0
  188. package/types/forty-cdk-hover-card.d.ts +320 -0
  189. package/types/forty-cdk-input.d.ts +169 -0
  190. package/types/forty-cdk-internationalized-date.d.ts +1 -1
  191. package/types/forty-cdk-listbox.d.ts +513 -0
  192. package/types/forty-cdk-menu.d.ts +629 -0
  193. package/types/forty-cdk-menubar.d.ts +451 -0
  194. package/types/forty-cdk-meter.d.ts +122 -0
  195. package/types/forty-cdk-navigation-menu.d.ts +514 -0
  196. package/types/forty-cdk-number-input.d.ts +319 -0
  197. package/types/forty-cdk-otp-input.d.ts +248 -0
  198. package/types/forty-cdk-pagination.d.ts +214 -0
  199. package/types/forty-cdk-pane-resizer.d.ts +145 -0
  200. package/types/forty-cdk-popover.d.ts +509 -0
  201. package/types/forty-cdk-progress.d.ts +143 -0
  202. package/types/forty-cdk-radio-group.d.ts +222 -0
  203. package/types/forty-cdk-scroll-area.d.ts +258 -0
  204. package/types/forty-cdk-search.d.ts +142 -0
  205. package/types/forty-cdk-select.d.ts +899 -0
  206. package/types/forty-cdk-separator.d.ts +59 -0
  207. package/types/forty-cdk-signal-forms.d.ts +58 -0
  208. package/types/forty-cdk-slider.d.ts +379 -0
  209. package/types/forty-cdk-stepper.d.ts +650 -0
  210. package/types/forty-cdk-switch.d.ts +87 -0
  211. package/types/forty-cdk-table.d.ts +723 -0
  212. package/types/forty-cdk-tabs.d.ts +235 -0
  213. package/types/forty-cdk-time-field.d.ts +307 -0
  214. package/types/forty-cdk-time-picker.d.ts +578 -0
  215. package/types/forty-cdk-toast.d.ts +598 -0
  216. package/types/forty-cdk-toggle.d.ts +310 -0
  217. package/types/forty-cdk-toolbar.d.ts +217 -0
  218. package/types/forty-cdk-tooltip.d.ts +436 -0
  219. package/types/forty-cdk-tree.d.ts +688 -0
  220. package/types/forty-cdk.d.ts +1 -19743
@@ -0,0 +1,559 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, model, input, computed, DestroyRef, Directive, signal } from '@angular/core';
3
+ import { createDefaults, FormUiControlBase, localeSeparators, reflectDisabled, injectHiddenInput, mirrorUnfocusedValue, roundToStepPrecision, parseLocaleNumber, clamp } from 'forty-cdk/core';
4
+
5
+ /**
6
+ * Injection token for the `[forNumberInputGroup]` coordination surface. The
7
+ * spinbutton joins it via `register`; the buttons read the registered field
8
+ * through `field()`.
9
+ */
10
+ const FOR_NUMBER_INPUT_GROUP = new InjectionToken('FOR_NUMBER_INPUT_GROUP');
11
+ /**
12
+ * Resolve the surrounding `[forNumberInputGroup]`, or throw a descriptive
13
+ * error. The increment / decrement buttons are only meaningful inside a
14
+ * `[forNumberInputGroup]` that wraps a `[forNumberInput]`.
15
+ */
16
+ function injectNumberInputGroup(piece) {
17
+ const group = inject(FOR_NUMBER_INPUT_GROUP, { optional: true });
18
+ if (!group) {
19
+ throw new Error(`[forty-cdk/number-input] ${piece} must be used inside a [forNumberInputGroup] that wraps a [forNumberInput].`);
20
+ }
21
+ return group;
22
+ }
23
+
24
+ /**
25
+ * Library fallback for number-input defaults, read at the root injector when no
26
+ * consumer has called `provideForNumberInputDefaults`. Exported for the shared
27
+ * defaults contract spec; not re-exported from the primitive's public entry.
28
+ */
29
+ const FOR_NUMBER_INPUT_FALLBACK_DEFAULTS = {
30
+ stepMultiplier: 10,
31
+ };
32
+ const { token, provideDefaults } = createDefaults('FOR_NUMBER_INPUT_DEFAULTS', FOR_NUMBER_INPUT_FALLBACK_DEFAULTS);
33
+ /** Token holding the resolved number-input defaults for the current scope. */
34
+ const FOR_NUMBER_INPUT_DEFAULTS = token;
35
+ /**
36
+ * Configures forty-cdk number-input defaults for this injector scope. Partial
37
+ * overrides inherit unspecified keys from the parent scope (or library
38
+ * defaults at the root).
39
+ */
40
+ function provideForNumberInputDefaults(defaults = {}) {
41
+ return provideDefaults(defaults);
42
+ }
43
+
44
+ /**
45
+ * Headless implementation of the
46
+ * [WAI-ARIA Spinbutton pattern](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/)
47
+ * and Angular's `FormValueControl<number | null>` from `@angular/forms/signals`,
48
+ * so it auto-wires with `[formField]` and auto-associates inside a `[forField]`
49
+ * (label / description / error) with no extra markup.
50
+ *
51
+ * Apply on a `<input type="text" inputmode="numeric">` — not `type="number"`,
52
+ * whose native UI is unstylable and locale-quirky. The directive owns parsing,
53
+ * clamping to `[min, max]`, the full Spinbutton keyboard map, and optional
54
+ * `Intl.NumberFormat`-based display formatting. The focusable spinbutton input
55
+ * itself is the `FormValueControl`; the `[forNumberInputIncrement]` /
56
+ * `[forNumberInputDecrement]` buttons are auxiliary pointer affordances.
57
+ *
58
+ * Because the displayed (formatted) text can differ from the submitted value,
59
+ * the directive mounts a hidden `<input>` carrying the raw number for native
60
+ * form submission when `name` is set — deliberately unlike `ForInput`, whose
61
+ * visible element is itself the submittable field.
62
+ *
63
+ * The host gets `data-empty` (while the value is `null`), `data-disabled`, and
64
+ * `data-readonly` for CSS hooks, plus `data-touched` / `data-dirty` /
65
+ * `data-pending` / `data-invalid` from the shared form-control reflection.
66
+ *
67
+ * @example
68
+ * ```html
69
+ * <button forNumberInputDecrement aria-label="Decrease">−</button>
70
+ * <input forNumberInput [(value)]="qty" [min]="0" [max]="10" [step]="1" />
71
+ * <button forNumberInputIncrement aria-label="Increase">+</button>
72
+ *
73
+ * <!-- With Signal Forms + Field (auto-wired): -->
74
+ * <div forField>
75
+ * <label forLabel>Quantity</label>
76
+ * <input forNumberInput [formField]="order.qty" [min]="1" />
77
+ * </div>
78
+ * ```
79
+ */
80
+ class ForNumberInput extends FormUiControlBase {
81
+ #host = inject(ElementRef);
82
+ #defaults = inject(FOR_NUMBER_INPUT_DEFAULTS);
83
+ /**
84
+ * Two-way bindable numeric value. Required by `FormValueControl<number | null>`.
85
+ * `null` represents the empty input (reflected as `data-empty`); a parsed
86
+ * number otherwise.
87
+ */
88
+ value = model(null, /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
90
+ /**
91
+ * Minimum value. Typed `number | undefined` to satisfy `FormUiControl.min`
92
+ * (Signal Forms passes `undefined` when no `min` validator is bound). When
93
+ * unset there is no lower bound.
94
+ */
95
+ min = input(undefined, /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
97
+ /**
98
+ * Maximum value. Typed `number | undefined` to satisfy `FormUiControl.max`.
99
+ * When unset there is no upper bound.
100
+ */
101
+ max = input(undefined, /* @ts-ignore */
102
+ ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
103
+ /** Increment applied by ArrowUp / ArrowDown and the inc/dec buttons. */
104
+ step = input(1, /* @ts-ignore */
105
+ ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
106
+ /**
107
+ * Multiplier applied to `step` for `PageUp` / `PageDown`. Defaults to the
108
+ * value from `provideForNumberInputDefaults` for the surrounding scope (10).
109
+ */
110
+ stepMultiplier = input(this.#defaults.stepMultiplier, /* @ts-ignore */
111
+ ...(ngDevMode ? [{ debugName: "stepMultiplier" }] : /* istanbul ignore next */ []));
112
+ /**
113
+ * `Intl.NumberFormat` options for the displayed text and `aria-valuetext`.
114
+ * When `null` (default) the raw number is shown and no `aria-valuetext` is
115
+ * emitted (the numeric `aria-valuenow` already conveys the value).
116
+ */
117
+ formatOptions = input(null, /* @ts-ignore */
118
+ ...(ngDevMode ? [{ debugName: "formatOptions" }] : /* istanbul ignore next */ []));
119
+ /** BCP 47 locale for parsing and formatting. Defaults to the runtime locale. */
120
+ locale = input(null, /* @ts-ignore */
121
+ ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
122
+ #formatter = computed(() => {
123
+ const options = this.formatOptions();
124
+ return options ? new Intl.NumberFormat(this.locale() ?? undefined, options) : null;
125
+ }, /* @ts-ignore */
126
+ ...(ngDevMode ? [{ debugName: "#formatter" }] : /* istanbul ignore next */ []));
127
+ #separators = computed(() => localeSeparators(this.locale() ?? undefined), /* @ts-ignore */
128
+ ...(ngDevMode ? [{ debugName: "#separators" }] : /* istanbul ignore next */ []));
129
+ #displayText = computed(() => {
130
+ const current = this.value();
131
+ if (current === null) {
132
+ return '';
133
+ }
134
+ const formatter = this.#formatter();
135
+ return formatter ? formatter.format(current) : String(current);
136
+ }, /* @ts-ignore */
137
+ ...(ngDevMode ? [{ debugName: "#displayText" }] : /* istanbul ignore next */ []));
138
+ /**
139
+ * Human-readable value for `aria-valuetext`. Only emitted when
140
+ * `formatOptions` is set (the formatted text differs from `aria-valuenow`);
141
+ * `null` otherwise so screen readers fall back to the numeric value.
142
+ */
143
+ valueText = computed(() => {
144
+ const current = this.value();
145
+ if (current === null) {
146
+ return null;
147
+ }
148
+ const formatter = this.#formatter();
149
+ return formatter ? formatter.format(current) : null;
150
+ }, /* @ts-ignore */
151
+ ...(ngDevMode ? [{ debugName: "valueText" }] : /* istanbul ignore next */ []));
152
+ /**
153
+ * Derived keyboard mode: `decimal` when fractional values are possible, else
154
+ * `numeric`. Reads the formatter's *resolved* options so currency / percent
155
+ * styles (which imply fraction digits the consumer never spelled out, e.g. 2
156
+ * for most currencies) report their effective `maximumFractionDigits` rather
157
+ * than the raw, un-resolved options object where those keys are absent.
158
+ */
159
+ inputmode = computed(() => {
160
+ const resolved = this.#formatter()?.resolvedOptions();
161
+ const fractional = !Number.isInteger(this.step()) ||
162
+ !this.#isWholeBound(this.min()) ||
163
+ !this.#isWholeBound(this.max()) ||
164
+ (resolved?.maximumFractionDigits ?? 0) > 0 ||
165
+ (resolved?.minimumFractionDigits ?? 0) > 0;
166
+ return fractional ? 'decimal' : 'numeric';
167
+ }, /* @ts-ignore */
168
+ ...(ngDevMode ? [{ debugName: "inputmode" }] : /* istanbul ignore next */ []));
169
+ /** `true` when the value sits at (or below) `min`. */
170
+ atMin = computed(() => {
171
+ const min = this.min();
172
+ const current = this.value();
173
+ return min !== undefined && current !== null && current <= min;
174
+ }, /* @ts-ignore */
175
+ ...(ngDevMode ? [{ debugName: "atMin" }] : /* istanbul ignore next */ []));
176
+ /** `true` when the value sits at (or above) `max`. */
177
+ atMax = computed(() => {
178
+ const max = this.max();
179
+ const current = this.value();
180
+ return max !== undefined && current !== null && current >= max;
181
+ }, /* @ts-ignore */
182
+ ...(ngDevMode ? [{ debugName: "atMax" }] : /* istanbul ignore next */ []));
183
+ constructor() {
184
+ super();
185
+ reflectDisabled(this.effectiveDisabled);
186
+ injectHiddenInput({
187
+ name: this.name,
188
+ values: computed(() => {
189
+ const current = this.value();
190
+ return current === null ? [] : [String(current)];
191
+ }),
192
+ disabled: this.effectiveDisabled,
193
+ });
194
+ // Register with an optional surrounding [forNumberInputGroup] so its
195
+ // stepper buttons can drive this spinbutton. A standalone input (no
196
+ // buttons) has no group and skips this entirely.
197
+ const group = inject(FOR_NUMBER_INPUT_GROUP, { optional: true });
198
+ if (group) {
199
+ group.register(this);
200
+ inject(DestroyRef).onDestroy(() => group.unregister(this));
201
+ }
202
+ // Mirror external writes (consumer `[(value)]` / `[formField]`, or the
203
+ // post-commit reformat) into the native element while it isn't focused. Live
204
+ // typing flows in through the `(input)` listener, and step / commit write the
205
+ // display imperatively (the element is focused then, so this guard skips it).
206
+ mirrorUnfocusedValue(() => this.#host.nativeElement, this.#displayText);
207
+ }
208
+ /**
209
+ * Increase the value by `by` (defaults to `step`). From empty, lands on the
210
+ * clamped baseline (`min ?? 0`). Clamps to `[min, max]`.
211
+ */
212
+ increment(by = this.step()) {
213
+ if (this.effectiveDisabled() || this.readonly()) {
214
+ return;
215
+ }
216
+ const current = this.value();
217
+ this.#applyValue(current === null ? this.#baseline() : roundToStepPrecision(current + by, this.step()));
218
+ }
219
+ /**
220
+ * Decrease the value by `by` (defaults to `step`). From empty, lands on the
221
+ * clamped baseline (`min ?? 0`). Clamps to `[min, max]`.
222
+ */
223
+ decrement(by = this.step()) {
224
+ if (this.effectiveDisabled() || this.readonly()) {
225
+ return;
226
+ }
227
+ const current = this.value();
228
+ this.#applyValue(current === null ? this.#baseline() : roundToStepPrecision(current - by, this.step()));
229
+ }
230
+ /** Live-parse the typed text into the value (unclamped — clamping waits for commit). */
231
+ onInput(event) {
232
+ if (this.effectiveDisabled() || this.readonly()) {
233
+ return;
234
+ }
235
+ const raw = event.target.value;
236
+ if (raw.trim() === '') {
237
+ this.value.set(null);
238
+ return;
239
+ }
240
+ const parsed = parseLocaleNumber(raw, this.#separators());
241
+ // Ignore unparseable input: keep the last valid value, leave the user's
242
+ // in-progress text untouched; commit() reformats from the value on blur.
243
+ if (parsed !== null) {
244
+ this.value.set(parsed);
245
+ }
246
+ }
247
+ onKeyDown(event) {
248
+ if (this.effectiveDisabled() || this.readonly()) {
249
+ return;
250
+ }
251
+ switch (event.key) {
252
+ case 'ArrowUp':
253
+ event.preventDefault();
254
+ this.increment();
255
+ return;
256
+ case 'ArrowDown':
257
+ event.preventDefault();
258
+ this.decrement();
259
+ return;
260
+ case 'PageUp':
261
+ event.preventDefault();
262
+ this.increment(this.step() * this.stepMultiplier());
263
+ return;
264
+ case 'PageDown':
265
+ event.preventDefault();
266
+ this.decrement(this.step() * this.stepMultiplier());
267
+ return;
268
+ case 'Home': {
269
+ const min = this.min();
270
+ if (min !== undefined) {
271
+ event.preventDefault();
272
+ this.#applyValue(min);
273
+ }
274
+ return;
275
+ }
276
+ case 'End': {
277
+ const max = this.max();
278
+ if (max !== undefined) {
279
+ event.preventDefault();
280
+ this.#applyValue(max);
281
+ }
282
+ return;
283
+ }
284
+ case 'Enter':
285
+ this.commit();
286
+ return;
287
+ default:
288
+ return;
289
+ }
290
+ }
291
+ /** Clamp the live value to `[min, max]` and reformat the displayed text. */
292
+ commit() {
293
+ const current = this.value();
294
+ if (current !== null) {
295
+ const clamped = this.#clamp(current);
296
+ if (clamped !== current) {
297
+ this.value.set(clamped);
298
+ }
299
+ }
300
+ this.#writeDisplay();
301
+ }
302
+ #applyValue(raw) {
303
+ this.value.set(this.#clamp(raw));
304
+ this.#writeDisplay();
305
+ }
306
+ #writeDisplay() {
307
+ const el = this.#host.nativeElement;
308
+ const text = this.#displayText();
309
+ if (el.value !== text) {
310
+ el.value = text;
311
+ }
312
+ }
313
+ #baseline() {
314
+ return this.#clamp(this.min() ?? 0);
315
+ }
316
+ #clamp(n) {
317
+ return clamp(n, this.min() ?? -Infinity, this.max() ?? Infinity);
318
+ }
319
+ #isWholeBound(bound) {
320
+ return bound === undefined || Number.isInteger(bound);
321
+ }
322
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInput, deps: [], target: i0.ɵɵFactoryTarget.Directive });
323
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: ForNumberInput, isStandalone: true, selector: "[forNumberInput]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, stepMultiplier: { classPropertyName: "stepMultiplier", publicName: "stepMultiplier", isSignal: true, isRequired: false, transformFunction: null }, formatOptions: { classPropertyName: "formatOptions", publicName: "formatOptions", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "role": "spinbutton" }, listeners: { "input": "onInput($event)", "keydown": "onKeyDown($event)", "blur": "commit(); markTouched()" }, properties: { "attr.inputmode": "inputmode()", "attr.aria-valuenow": "value() ?? null", "attr.aria-valuemin": "min() ?? null", "attr.aria-valuemax": "max() ?? null", "attr.aria-valuetext": "valueText()", "attr.aria-disabled": "effectiveDisabled() ? \"true\" : null", "attr.aria-readonly": "readonly() ? \"true\" : null", "attr.aria-required": "required() ? \"true\" : null", "attr.aria-invalid": "invalid() ? \"true\" : null", "attr.aria-busy": "pending() ? \"true\" : null", "attr.readonly": "readonly() ? \"\" : null", "attr.data-empty": "value() === null ? \"\" : null", "attr.data-disabled": "effectiveDisabled() ? \"\" : null", "attr.data-readonly": "readonly() ? \"\" : null" } }, exportAs: ["forNumberInput"], usesInheritance: true, ngImport: i0 });
324
+ }
325
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInput, decorators: [{
326
+ type: Directive,
327
+ args: [{
328
+ selector: '[forNumberInput]',
329
+ exportAs: 'forNumberInput',
330
+ host: {
331
+ role: 'spinbutton',
332
+ '[attr.inputmode]': 'inputmode()',
333
+ '[attr.aria-valuenow]': 'value() ?? null',
334
+ '[attr.aria-valuemin]': 'min() ?? null',
335
+ '[attr.aria-valuemax]': 'max() ?? null',
336
+ '[attr.aria-valuetext]': 'valueText()',
337
+ '[attr.aria-disabled]': 'effectiveDisabled() ? "true" : null',
338
+ '[attr.aria-readonly]': 'readonly() ? "true" : null',
339
+ '[attr.aria-required]': 'required() ? "true" : null',
340
+ '[attr.aria-invalid]': 'invalid() ? "true" : null',
341
+ '[attr.aria-busy]': 'pending() ? "true" : null',
342
+ '[attr.readonly]': 'readonly() ? "" : null',
343
+ '[attr.data-empty]': 'value() === null ? "" : null',
344
+ '[attr.data-disabled]': 'effectiveDisabled() ? "" : null',
345
+ '[attr.data-readonly]': 'readonly() ? "" : null',
346
+ '(input)': 'onInput($event)',
347
+ '(keydown)': 'onKeyDown($event)',
348
+ '(blur)': 'commit(); markTouched()',
349
+ },
350
+ }]
351
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], stepMultiplier: [{ type: i0.Input, args: [{ isSignal: true, alias: "stepMultiplier", required: false }] }], formatOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatOptions", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }] } });
352
+
353
+ /**
354
+ * Optional coordination wrapper for a `[forNumberInput]` and its
355
+ * `[forNumberInputIncrement]` / `[forNumberInputDecrement]` buttons. It renders
356
+ * nothing and imposes no role or layout — its only job is to bridge the buttons
357
+ * to the spinbutton.
358
+ *
359
+ * It is required _only_ when you use the stepper buttons: a `<input>` is a void
360
+ * element and can't contain the buttons as DOM descendants, so the buttons
361
+ * can't inject the spinbutton's context directly. The group registers the
362
+ * `[forNumberInput]` beneath it and exposes it via `field()`, which the buttons
363
+ * read. A standalone `[forNumberInput]` (keyboard / `[(value)]` only) needs no
364
+ * group.
365
+ *
366
+ * @example
367
+ * ```html
368
+ * <div forNumberInputGroup>
369
+ * <button forNumberInputDecrement aria-label="Decrease">−</button>
370
+ * <input forNumberInput [(value)]="qty" [min]="0" [max]="10" />
371
+ * <button forNumberInputIncrement aria-label="Increase">+</button>
372
+ * </div>
373
+ * ```
374
+ */
375
+ class ForNumberInputGroup {
376
+ #field = signal(null, /* @ts-ignore */
377
+ ...(ngDevMode ? [{ debugName: "#field" }] : /* istanbul ignore next */ []));
378
+ field = this.#field.asReadonly();
379
+ register(field) {
380
+ this.#field.set(field);
381
+ }
382
+ unregister(field) {
383
+ if (this.#field() === field) {
384
+ this.#field.set(null);
385
+ }
386
+ }
387
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
388
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: ForNumberInputGroup, isStandalone: true, selector: "[forNumberInputGroup]", providers: [{ provide: FOR_NUMBER_INPUT_GROUP, useExisting: ForNumberInputGroup }], exportAs: ["forNumberInputGroup"], ngImport: i0 });
389
+ }
390
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInputGroup, decorators: [{
391
+ type: Directive,
392
+ args: [{
393
+ selector: '[forNumberInputGroup]',
394
+ exportAs: 'forNumberInputGroup',
395
+ providers: [{ provide: FOR_NUMBER_INPUT_GROUP, useExisting: ForNumberInputGroup }],
396
+ }]
397
+ }] });
398
+
399
+ /**
400
+ * Auxiliary "step up" button for a `[forNumberInput]`. Apply on a `<button>`
401
+ * (the directive forces `type="button"` to prevent form submission). It stays
402
+ * `tabindex="-1"` — focus belongs on the spinbutton input, which carries the
403
+ * full keyboard map — and reflects `[disabled]` + `data-disabled` when the
404
+ * value is at `max` (or the control is disabled / read-only).
405
+ *
406
+ * Takes the uniform `ariaLabel` input so consumers can name it (e.g.
407
+ * "Increase quantity").
408
+ *
409
+ * @example
410
+ * ```html
411
+ * <input forNumberInput [(value)]="qty" [max]="10" />
412
+ * <button forNumberInputIncrement aria-label="Increase">+</button>
413
+ * ```
414
+ */
415
+ class ForNumberInputIncrement {
416
+ group = injectNumberInputGroup('ForNumberInputIncrement');
417
+ /** Accessible name for the button. Emits `aria-label` only when truthy. */
418
+ ariaLabel = input(null, /* @ts-ignore */
419
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
420
+ isDisabled = computed(() => {
421
+ const field = this.group.field();
422
+ return !field || field.effectiveDisabled() || field.readonly() || field.atMax();
423
+ }, /* @ts-ignore */
424
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
425
+ constructor() {
426
+ reflectDisabled(this.isDisabled);
427
+ }
428
+ step() {
429
+ this.group.field()?.increment();
430
+ }
431
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInputIncrement, deps: [], target: i0.ɵɵFactoryTarget.Directive });
432
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: ForNumberInputIncrement, isStandalone: true, selector: "[forNumberInputIncrement]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button", "tabindex": "-1" }, listeners: { "click": "step()" }, properties: { "attr.aria-label": "ariaLabel() || null", "attr.data-disabled": "isDisabled() ? \"\" : null" } }, exportAs: ["forNumberInputIncrement"], ngImport: i0 });
433
+ }
434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInputIncrement, decorators: [{
435
+ type: Directive,
436
+ args: [{
437
+ selector: '[forNumberInputIncrement]',
438
+ exportAs: 'forNumberInputIncrement',
439
+ host: {
440
+ type: 'button',
441
+ tabindex: '-1',
442
+ '[attr.aria-label]': 'ariaLabel() || null',
443
+ '[attr.data-disabled]': 'isDisabled() ? "" : null',
444
+ '(click)': 'step()',
445
+ },
446
+ }]
447
+ }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
448
+
449
+ /**
450
+ * Auxiliary "step down" button for a `[forNumberInput]`. Apply on a `<button>`
451
+ * (the directive forces `type="button"` to prevent form submission). It stays
452
+ * `tabindex="-1"` — focus belongs on the spinbutton input, which carries the
453
+ * full keyboard map — and reflects `[disabled]` + `data-disabled` when the
454
+ * value is at `min` (or the control is disabled / read-only).
455
+ *
456
+ * Takes the uniform `ariaLabel` input so consumers can name it (e.g.
457
+ * "Decrease quantity").
458
+ *
459
+ * @example
460
+ * ```html
461
+ * <button forNumberInputDecrement aria-label="Decrease">−</button>
462
+ * <input forNumberInput [(value)]="qty" [min]="0" />
463
+ * ```
464
+ */
465
+ class ForNumberInputDecrement {
466
+ group = injectNumberInputGroup('ForNumberInputDecrement');
467
+ /** Accessible name for the button. Emits `aria-label` only when truthy. */
468
+ ariaLabel = input(null, /* @ts-ignore */
469
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
470
+ isDisabled = computed(() => {
471
+ const field = this.group.field();
472
+ return !field || field.effectiveDisabled() || field.readonly() || field.atMin();
473
+ }, /* @ts-ignore */
474
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
475
+ constructor() {
476
+ reflectDisabled(this.isDisabled);
477
+ }
478
+ step() {
479
+ this.group.field()?.decrement();
480
+ }
481
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInputDecrement, deps: [], target: i0.ɵɵFactoryTarget.Directive });
482
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: ForNumberInputDecrement, isStandalone: true, selector: "[forNumberInputDecrement]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button", "tabindex": "-1" }, listeners: { "click": "step()" }, properties: { "attr.aria-label": "ariaLabel() || null", "attr.data-disabled": "isDisabled() ? \"\" : null" } }, exportAs: ["forNumberInputDecrement"], ngImport: i0 });
483
+ }
484
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForNumberInputDecrement, decorators: [{
485
+ type: Directive,
486
+ args: [{
487
+ selector: '[forNumberInputDecrement]',
488
+ exportAs: 'forNumberInputDecrement',
489
+ host: {
490
+ type: 'button',
491
+ tabindex: '-1',
492
+ '[attr.aria-label]': 'ariaLabel() || null',
493
+ '[attr.data-disabled]': 'isDisabled() ? "" : null',
494
+ '(click)': 'step()',
495
+ },
496
+ }]
497
+ }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
498
+
499
+ /**
500
+ * Exact public names of every `ForNumberInput` input, its models included. Spread it into the
501
+ * `inputs` array of a `hostDirectives` entry so a wrapper component re-exposes the
502
+ * primitive's full surface — the Signal Forms members `[formField]` binds among them —
503
+ * without hand-maintaining the list. Always spread into an inline object literal as shown
504
+ * below: the literal is what keeps the entry statically analyzable for consumers compiling
505
+ * against the published package. An anti-drift spec fails when this list no longer matches
506
+ * the directive's actual API. See `docs/wrapping-form-primitives.md` for both supported
507
+ * wrapping patterns.
508
+ *
509
+ * @example
510
+ * ```ts
511
+ * @Component({
512
+ * selector: 'input[myNumberInput]',
513
+ * template: '',
514
+ * hostDirectives: [
515
+ * {
516
+ * directive: ForNumberInput,
517
+ * inputs: [...FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS],
518
+ * outputs: [...FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS],
519
+ * },
520
+ * ],
521
+ * })
522
+ * export class MyNumberInput {}
523
+ * ```
524
+ */
525
+ const FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS = [
526
+ 'value',
527
+ 'dirty',
528
+ 'disabled',
529
+ 'errors',
530
+ 'formatOptions',
531
+ 'invalid',
532
+ 'locale',
533
+ 'max',
534
+ 'min',
535
+ 'name',
536
+ 'pending',
537
+ 'readonly',
538
+ 'required',
539
+ 'step',
540
+ 'stepMultiplier',
541
+ 'touched',
542
+ ];
543
+ /**
544
+ * Exact public names of every `ForNumberInput` output, the Signal Forms `touch` output
545
+ * included. Spread it into the `outputs` array of the same `hostDirectives` entry as
546
+ * {@link FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS}.
547
+ */
548
+ const FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS = [
549
+ 'valueChange',
550
+ 'touchedChange',
551
+ 'touch',
552
+ ];
553
+
554
+ /**
555
+ * Generated bundle index. Do not edit.
556
+ */
557
+
558
+ export { FOR_NUMBER_INPUT_DEFAULTS, FOR_NUMBER_INPUT_GROUP, FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS, FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS, ForNumberInput, ForNumberInputDecrement, ForNumberInputGroup, ForNumberInputIncrement, injectNumberInputGroup, provideForNumberInputDefaults };
559
+ //# sourceMappingURL=forty-cdk-number-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forty-cdk-number-input.mjs","sources":["../../../projects/forty-cdk/number-input/src/number-input-context.ts","../../../projects/forty-cdk/number-input/src/number-input-defaults.ts","../../../projects/forty-cdk/number-input/src/number-input.ts","../../../projects/forty-cdk/number-input/src/number-input-group.ts","../../../projects/forty-cdk/number-input/src/number-input-increment.ts","../../../projects/forty-cdk/number-input/src/number-input-decrement.ts","../../../projects/forty-cdk/number-input/src/number-input-host-directive.ts","../../../projects/forty-cdk/number-input/src/forty-cdk-number-input.ts"],"sourcesContent":["import { inject, InjectionToken, type Signal } from '@angular/core';\n\n/**\n * The coordination surface a `[forNumberInput]` exposes to its siblings. The\n * auxiliary `[forNumberInputIncrement]` / `[forNumberInputDecrement]` buttons\n * read it (through the group) to step the value and to reflect their disabled\n * state at the min / max bound.\n */\nexport interface ForNumberInputContext {\n /** Current numeric value, or `null` while the field is empty. */\n readonly value: Signal<number | null>;\n /**\n * The spinbutton's effective disabled — its own `disabled` input OR'd with a\n * surrounding disabled `[forFieldset]`. The increment / decrement buttons read\n * this so a disabled fieldset also disables stepping.\n */\n readonly effectiveDisabled: Signal<boolean>;\n /** Whether the spinbutton is read-only. */\n readonly readonly: Signal<boolean>;\n /** `true` when the value sits at (or below) `min`. */\n readonly atMin: Signal<boolean>;\n /** `true` when the value sits at (or above) `max`. */\n readonly atMax: Signal<boolean>;\n /**\n * Increase the value by `by` (defaults to `step`), clamping to `[min, max]`.\n * No-op while disabled or read-only.\n */\n increment(by?: number): void;\n /**\n * Decrease the value by `by` (defaults to `step`), clamping to `[min, max]`.\n * No-op while disabled or read-only.\n */\n decrement(by?: number): void;\n}\n\n/**\n * The single coordination surface `[forNumberInputGroup]` exposes. A\n * `[forNumberInput]` nested under the group registers itself, and the\n * auxiliary `[forNumberInputIncrement]` / `[forNumberInputDecrement]` buttons\n * read the registered spinbutton through `field()` to step the value and\n * reflect their min / max disabled state. Coordination flows through this\n * registry — not the DOM — because the focusable spinbutton lives on a void\n * `<input>` that can't contain the sibling buttons as descendants.\n */\nexport interface ForNumberInputGroupContext {\n /** The registered spinbutton, or `null` while none is mounted. */\n readonly field: Signal<ForNumberInputContext | null>;\n /** Register the spinbutton the group coordinates. */\n register(field: ForNumberInputContext): void;\n /** Remove a previously registered spinbutton. */\n unregister(field: ForNumberInputContext): void;\n}\n\n/**\n * Injection token for the `[forNumberInputGroup]` coordination surface. The\n * spinbutton joins it via `register`; the buttons read the registered field\n * through `field()`.\n */\nexport const FOR_NUMBER_INPUT_GROUP = new InjectionToken<ForNumberInputGroupContext>(\n 'FOR_NUMBER_INPUT_GROUP',\n);\n\n/**\n * Resolve the surrounding `[forNumberInputGroup]`, or throw a descriptive\n * error. The increment / decrement buttons are only meaningful inside a\n * `[forNumberInputGroup]` that wraps a `[forNumberInput]`.\n */\nexport function injectNumberInputGroup(piece: string): ForNumberInputGroupContext {\n const group = inject(FOR_NUMBER_INPUT_GROUP, { optional: true });\n if (!group) {\n throw new Error(\n `[forty-cdk/number-input] ${piece} must be used inside a [forNumberInputGroup] that wraps a [forNumberInput].`,\n );\n }\n return group;\n}\n","import { type Provider } from '@angular/core';\n\nimport { createDefaults } from 'forty-cdk/core';\n\n/**\n * Defaults inherited by descendant `[forNumberInput]` controls in the\n * surrounding injector scope. Configure with `provideForNumberInputDefaults`\n * either at the application root or in any component's `providers` array;\n * partial overrides merge with the parent scope.\n */\nexport interface ForNumberInputDefaults {\n /**\n * Multiplier applied to `step` for `PageUp` / `PageDown`. Defaults to `10`,\n * so a step of `1` pages by `10`.\n */\n stepMultiplier: number;\n}\n\n/**\n * Library fallback for number-input defaults, read at the root injector when no\n * consumer has called `provideForNumberInputDefaults`. Exported for the shared\n * defaults contract spec; not re-exported from the primitive's public entry.\n */\nexport const FOR_NUMBER_INPUT_FALLBACK_DEFAULTS: ForNumberInputDefaults = {\n stepMultiplier: 10,\n};\n\nconst { token, provideDefaults } = createDefaults<ForNumberInputDefaults>(\n 'FOR_NUMBER_INPUT_DEFAULTS',\n FOR_NUMBER_INPUT_FALLBACK_DEFAULTS,\n);\n\n/** Token holding the resolved number-input defaults for the current scope. */\nexport const FOR_NUMBER_INPUT_DEFAULTS = token;\n\n/**\n * Configures forty-cdk number-input defaults for this injector scope. Partial\n * overrides inherit unspecified keys from the parent scope (or library\n * defaults at the root).\n */\nexport function provideForNumberInputDefaults(\n defaults: Partial<ForNumberInputDefaults> = {},\n): Provider[] {\n return provideDefaults(defaults);\n}\n","import { computed, DestroyRef, Directive, ElementRef, inject, input, model } from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport {\n reflectDisabled,\n FormUiControlBase,\n mirrorUnfocusedValue,\n injectHiddenInput,\n localeSeparators,\n parseLocaleNumber,\n clamp,\n roundToStepPrecision,\n} from 'forty-cdk/core';\nimport { FOR_NUMBER_INPUT_GROUP, type ForNumberInputContext } from './number-input-context';\nimport { FOR_NUMBER_INPUT_DEFAULTS } from './number-input-defaults';\n\n/**\n * Headless implementation of the\n * [WAI-ARIA Spinbutton pattern](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/)\n * and Angular's `FormValueControl<number | null>` from `@angular/forms/signals`,\n * so it auto-wires with `[formField]` and auto-associates inside a `[forField]`\n * (label / description / error) with no extra markup.\n *\n * Apply on a `<input type=\"text\" inputmode=\"numeric\">` — not `type=\"number\"`,\n * whose native UI is unstylable and locale-quirky. The directive owns parsing,\n * clamping to `[min, max]`, the full Spinbutton keyboard map, and optional\n * `Intl.NumberFormat`-based display formatting. The focusable spinbutton input\n * itself is the `FormValueControl`; the `[forNumberInputIncrement]` /\n * `[forNumberInputDecrement]` buttons are auxiliary pointer affordances.\n *\n * Because the displayed (formatted) text can differ from the submitted value,\n * the directive mounts a hidden `<input>` carrying the raw number for native\n * form submission when `name` is set — deliberately unlike `ForInput`, whose\n * visible element is itself the submittable field.\n *\n * The host gets `data-empty` (while the value is `null`), `data-disabled`, and\n * `data-readonly` for CSS hooks, plus `data-touched` / `data-dirty` /\n * `data-pending` / `data-invalid` from the shared form-control reflection.\n *\n * @example\n * ```html\n * <button forNumberInputDecrement aria-label=\"Decrease\">−</button>\n * <input forNumberInput [(value)]=\"qty\" [min]=\"0\" [max]=\"10\" [step]=\"1\" />\n * <button forNumberInputIncrement aria-label=\"Increase\">+</button>\n *\n * <!-- With Signal Forms + Field (auto-wired): -->\n * <div forField>\n * <label forLabel>Quantity</label>\n * <input forNumberInput [formField]=\"order.qty\" [min]=\"1\" />\n * </div>\n * ```\n */\n@Directive({\n selector: '[forNumberInput]',\n exportAs: 'forNumberInput',\n host: {\n role: 'spinbutton',\n '[attr.inputmode]': 'inputmode()',\n '[attr.aria-valuenow]': 'value() ?? null',\n '[attr.aria-valuemin]': 'min() ?? null',\n '[attr.aria-valuemax]': 'max() ?? null',\n '[attr.aria-valuetext]': 'valueText()',\n '[attr.aria-disabled]': 'effectiveDisabled() ? \"true\" : null',\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\n '[attr.aria-required]': 'required() ? \"true\" : null',\n '[attr.aria-invalid]': 'invalid() ? \"true\" : null',\n '[attr.aria-busy]': 'pending() ? \"true\" : null',\n '[attr.readonly]': 'readonly() ? \"\" : null',\n '[attr.data-empty]': 'value() === null ? \"\" : null',\n '[attr.data-disabled]': 'effectiveDisabled() ? \"\" : null',\n '[attr.data-readonly]': 'readonly() ? \"\" : null',\n '(input)': 'onInput($event)',\n '(keydown)': 'onKeyDown($event)',\n '(blur)': 'commit(); markTouched()',\n },\n})\nexport class ForNumberInput\n extends FormUiControlBase\n implements FormValueControl<number | null>, ForNumberInputContext\n{\n readonly #host = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly #defaults = inject(FOR_NUMBER_INPUT_DEFAULTS);\n\n /**\n * Two-way bindable numeric value. Required by `FormValueControl<number | null>`.\n * `null` represents the empty input (reflected as `data-empty`); a parsed\n * number otherwise.\n */\n readonly value = model<number | null>(null);\n\n /**\n * Minimum value. Typed `number | undefined` to satisfy `FormUiControl.min`\n * (Signal Forms passes `undefined` when no `min` validator is bound). When\n * unset there is no lower bound.\n */\n readonly min = input<number | undefined>(undefined);\n\n /**\n * Maximum value. Typed `number | undefined` to satisfy `FormUiControl.max`.\n * When unset there is no upper bound.\n */\n readonly max = input<number | undefined>(undefined);\n\n /** Increment applied by ArrowUp / ArrowDown and the inc/dec buttons. */\n readonly step = input(1);\n\n /**\n * Multiplier applied to `step` for `PageUp` / `PageDown`. Defaults to the\n * value from `provideForNumberInputDefaults` for the surrounding scope (10).\n */\n readonly stepMultiplier = input(this.#defaults.stepMultiplier);\n\n /**\n * `Intl.NumberFormat` options for the displayed text and `aria-valuetext`.\n * When `null` (default) the raw number is shown and no `aria-valuetext` is\n * emitted (the numeric `aria-valuenow` already conveys the value).\n */\n readonly formatOptions = input<Intl.NumberFormatOptions | null>(null);\n\n /** BCP 47 locale for parsing and formatting. Defaults to the runtime locale. */\n readonly locale = input<string | null>(null);\n\n readonly #formatter = computed(() => {\n const options = this.formatOptions();\n return options ? new Intl.NumberFormat(this.locale() ?? undefined, options) : null;\n });\n\n readonly #separators = computed(() => localeSeparators(this.locale() ?? undefined));\n\n readonly #displayText = computed(() => {\n const current = this.value();\n if (current === null) {\n return '';\n }\n const formatter = this.#formatter();\n return formatter ? formatter.format(current) : String(current);\n });\n\n /**\n * Human-readable value for `aria-valuetext`. Only emitted when\n * `formatOptions` is set (the formatted text differs from `aria-valuenow`);\n * `null` otherwise so screen readers fall back to the numeric value.\n */\n readonly valueText = computed(() => {\n const current = this.value();\n if (current === null) {\n return null;\n }\n const formatter = this.#formatter();\n return formatter ? formatter.format(current) : null;\n });\n\n /**\n * Derived keyboard mode: `decimal` when fractional values are possible, else\n * `numeric`. Reads the formatter's *resolved* options so currency / percent\n * styles (which imply fraction digits the consumer never spelled out, e.g. 2\n * for most currencies) report their effective `maximumFractionDigits` rather\n * than the raw, un-resolved options object where those keys are absent.\n */\n readonly inputmode = computed<'numeric' | 'decimal'>(() => {\n const resolved = this.#formatter()?.resolvedOptions();\n const fractional =\n !Number.isInteger(this.step()) ||\n !this.#isWholeBound(this.min()) ||\n !this.#isWholeBound(this.max()) ||\n (resolved?.maximumFractionDigits ?? 0) > 0 ||\n (resolved?.minimumFractionDigits ?? 0) > 0;\n return fractional ? 'decimal' : 'numeric';\n });\n\n /** `true` when the value sits at (or below) `min`. */\n readonly atMin = computed(() => {\n const min = this.min();\n const current = this.value();\n return min !== undefined && current !== null && current <= min;\n });\n\n /** `true` when the value sits at (or above) `max`. */\n readonly atMax = computed(() => {\n const max = this.max();\n const current = this.value();\n return max !== undefined && current !== null && current >= max;\n });\n\n constructor() {\n super();\n reflectDisabled(this.effectiveDisabled);\n injectHiddenInput({\n name: this.name,\n values: computed(() => {\n const current = this.value();\n return current === null ? [] : [String(current)];\n }),\n disabled: this.effectiveDisabled,\n });\n\n // Register with an optional surrounding [forNumberInputGroup] so its\n // stepper buttons can drive this spinbutton. A standalone input (no\n // buttons) has no group and skips this entirely.\n const group = inject(FOR_NUMBER_INPUT_GROUP, { optional: true });\n if (group) {\n group.register(this);\n inject(DestroyRef).onDestroy(() => group.unregister(this));\n }\n\n // Mirror external writes (consumer `[(value)]` / `[formField]`, or the\n // post-commit reformat) into the native element while it isn't focused. Live\n // typing flows in through the `(input)` listener, and step / commit write the\n // display imperatively (the element is focused then, so this guard skips it).\n mirrorUnfocusedValue(() => this.#host.nativeElement, this.#displayText);\n }\n\n /**\n * Increase the value by `by` (defaults to `step`). From empty, lands on the\n * clamped baseline (`min ?? 0`). Clamps to `[min, max]`.\n */\n increment(by: number = this.step()): void {\n if (this.effectiveDisabled() || this.readonly()) {\n return;\n }\n const current = this.value();\n this.#applyValue(\n current === null ? this.#baseline() : roundToStepPrecision(current + by, this.step()),\n );\n }\n\n /**\n * Decrease the value by `by` (defaults to `step`). From empty, lands on the\n * clamped baseline (`min ?? 0`). Clamps to `[min, max]`.\n */\n decrement(by: number = this.step()): void {\n if (this.effectiveDisabled() || this.readonly()) {\n return;\n }\n const current = this.value();\n this.#applyValue(\n current === null ? this.#baseline() : roundToStepPrecision(current - by, this.step()),\n );\n }\n\n /** Live-parse the typed text into the value (unclamped — clamping waits for commit). */\n protected onInput(event: Event): void {\n if (this.effectiveDisabled() || this.readonly()) {\n return;\n }\n const raw = (event.target as HTMLInputElement).value;\n if (raw.trim() === '') {\n this.value.set(null);\n return;\n }\n const parsed = parseLocaleNumber(raw, this.#separators());\n // Ignore unparseable input: keep the last valid value, leave the user's\n // in-progress text untouched; commit() reformats from the value on blur.\n if (parsed !== null) {\n this.value.set(parsed);\n }\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.effectiveDisabled() || this.readonly()) {\n return;\n }\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.increment();\n return;\n case 'ArrowDown':\n event.preventDefault();\n this.decrement();\n return;\n case 'PageUp':\n event.preventDefault();\n this.increment(this.step() * this.stepMultiplier());\n return;\n case 'PageDown':\n event.preventDefault();\n this.decrement(this.step() * this.stepMultiplier());\n return;\n case 'Home': {\n const min = this.min();\n if (min !== undefined) {\n event.preventDefault();\n this.#applyValue(min);\n }\n return;\n }\n case 'End': {\n const max = this.max();\n if (max !== undefined) {\n event.preventDefault();\n this.#applyValue(max);\n }\n return;\n }\n case 'Enter':\n this.commit();\n return;\n default:\n return;\n }\n }\n\n /** Clamp the live value to `[min, max]` and reformat the displayed text. */\n protected commit(): void {\n const current = this.value();\n if (current !== null) {\n const clamped = this.#clamp(current);\n if (clamped !== current) {\n this.value.set(clamped);\n }\n }\n this.#writeDisplay();\n }\n\n #applyValue(raw: number): void {\n this.value.set(this.#clamp(raw));\n this.#writeDisplay();\n }\n\n #writeDisplay(): void {\n const el = this.#host.nativeElement;\n const text = this.#displayText();\n if (el.value !== text) {\n el.value = text;\n }\n }\n\n #baseline(): number {\n return this.#clamp(this.min() ?? 0);\n }\n\n #clamp(n: number): number {\n return clamp(n, this.min() ?? -Infinity, this.max() ?? Infinity);\n }\n\n #isWholeBound(bound: number | undefined): boolean {\n return bound === undefined || Number.isInteger(bound);\n }\n}\n","import { Directive, signal } from '@angular/core';\n\nimport {\n FOR_NUMBER_INPUT_GROUP,\n type ForNumberInputContext,\n type ForNumberInputGroupContext,\n} from './number-input-context';\n\n/**\n * Optional coordination wrapper for a `[forNumberInput]` and its\n * `[forNumberInputIncrement]` / `[forNumberInputDecrement]` buttons. It renders\n * nothing and imposes no role or layout — its only job is to bridge the buttons\n * to the spinbutton.\n *\n * It is required _only_ when you use the stepper buttons: a `<input>` is a void\n * element and can't contain the buttons as DOM descendants, so the buttons\n * can't inject the spinbutton's context directly. The group registers the\n * `[forNumberInput]` beneath it and exposes it via `field()`, which the buttons\n * read. A standalone `[forNumberInput]` (keyboard / `[(value)]` only) needs no\n * group.\n *\n * @example\n * ```html\n * <div forNumberInputGroup>\n * <button forNumberInputDecrement aria-label=\"Decrease\">−</button>\n * <input forNumberInput [(value)]=\"qty\" [min]=\"0\" [max]=\"10\" />\n * <button forNumberInputIncrement aria-label=\"Increase\">+</button>\n * </div>\n * ```\n */\n@Directive({\n selector: '[forNumberInputGroup]',\n exportAs: 'forNumberInputGroup',\n providers: [{ provide: FOR_NUMBER_INPUT_GROUP, useExisting: ForNumberInputGroup }],\n})\nexport class ForNumberInputGroup implements ForNumberInputGroupContext {\n readonly #field = signal<ForNumberInputContext | null>(null);\n\n readonly field = this.#field.asReadonly();\n\n register(field: ForNumberInputContext): void {\n this.#field.set(field);\n }\n\n unregister(field: ForNumberInputContext): void {\n if (this.#field() === field) {\n this.#field.set(null);\n }\n }\n}\n","import { computed, Directive, input } from '@angular/core';\n\nimport { reflectDisabled } from 'forty-cdk/core';\nimport { injectNumberInputGroup } from './number-input-context';\n\n/**\n * Auxiliary \"step up\" button for a `[forNumberInput]`. Apply on a `<button>`\n * (the directive forces `type=\"button\"` to prevent form submission). It stays\n * `tabindex=\"-1\"` — focus belongs on the spinbutton input, which carries the\n * full keyboard map — and reflects `[disabled]` + `data-disabled` when the\n * value is at `max` (or the control is disabled / read-only).\n *\n * Takes the uniform `ariaLabel` input so consumers can name it (e.g.\n * \"Increase quantity\").\n *\n * @example\n * ```html\n * <input forNumberInput [(value)]=\"qty\" [max]=\"10\" />\n * <button forNumberInputIncrement aria-label=\"Increase\">+</button>\n * ```\n */\n@Directive({\n selector: '[forNumberInputIncrement]',\n exportAs: 'forNumberInputIncrement',\n host: {\n type: 'button',\n tabindex: '-1',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '(click)': 'step()',\n },\n})\nexport class ForNumberInputIncrement {\n protected readonly group = injectNumberInputGroup('ForNumberInputIncrement');\n\n /** Accessible name for the button. Emits `aria-label` only when truthy. */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly isDisabled = computed(() => {\n const field = this.group.field();\n return !field || field.effectiveDisabled() || field.readonly() || field.atMax();\n });\n\n constructor() {\n reflectDisabled(this.isDisabled);\n }\n\n protected step(): void {\n this.group.field()?.increment();\n }\n}\n","import { computed, Directive, input } from '@angular/core';\n\nimport { reflectDisabled } from 'forty-cdk/core';\nimport { injectNumberInputGroup } from './number-input-context';\n\n/**\n * Auxiliary \"step down\" button for a `[forNumberInput]`. Apply on a `<button>`\n * (the directive forces `type=\"button\"` to prevent form submission). It stays\n * `tabindex=\"-1\"` — focus belongs on the spinbutton input, which carries the\n * full keyboard map — and reflects `[disabled]` + `data-disabled` when the\n * value is at `min` (or the control is disabled / read-only).\n *\n * Takes the uniform `ariaLabel` input so consumers can name it (e.g.\n * \"Decrease quantity\").\n *\n * @example\n * ```html\n * <button forNumberInputDecrement aria-label=\"Decrease\">−</button>\n * <input forNumberInput [(value)]=\"qty\" [min]=\"0\" />\n * ```\n */\n@Directive({\n selector: '[forNumberInputDecrement]',\n exportAs: 'forNumberInputDecrement',\n host: {\n type: 'button',\n tabindex: '-1',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '(click)': 'step()',\n },\n})\nexport class ForNumberInputDecrement {\n protected readonly group = injectNumberInputGroup('ForNumberInputDecrement');\n\n /** Accessible name for the button. Emits `aria-label` only when truthy. */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly isDisabled = computed(() => {\n const field = this.group.field();\n return !field || field.effectiveDisabled() || field.readonly() || field.atMin();\n });\n\n constructor() {\n reflectDisabled(this.isDisabled);\n }\n\n protected step(): void {\n this.group.field()?.decrement();\n }\n}\n","/**\n * Exact public names of every `ForNumberInput` input, its models included. Spread it into the\n * `inputs` array of a `hostDirectives` entry so a wrapper component re-exposes the\n * primitive's full surface — the Signal Forms members `[formField]` binds among them —\n * without hand-maintaining the list. Always spread into an inline object literal as shown\n * below: the literal is what keeps the entry statically analyzable for consumers compiling\n * against the published package. An anti-drift spec fails when this list no longer matches\n * the directive's actual API. See `docs/wrapping-form-primitives.md` for both supported\n * wrapping patterns.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'input[myNumberInput]',\n * template: '',\n * hostDirectives: [\n * {\n * directive: ForNumberInput,\n * inputs: [...FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS],\n * outputs: [...FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS],\n * },\n * ],\n * })\n * export class MyNumberInput {}\n * ```\n */\nexport const FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS = [\n 'value',\n 'dirty',\n 'disabled',\n 'errors',\n 'formatOptions',\n 'invalid',\n 'locale',\n 'max',\n 'min',\n 'name',\n 'pending',\n 'readonly',\n 'required',\n 'step',\n 'stepMultiplier',\n 'touched',\n] as const;\n\n/**\n * Exact public names of every `ForNumberInput` output, the Signal Forms `touch` output\n * included. Spread it into the `outputs` array of the same `hostDirectives` entry as\n * {@link FOR_NUMBER_INPUT_HOST_DIRECTIVE_INPUTS}.\n */\nexport const FOR_NUMBER_INPUT_HOST_DIRECTIVE_OUTPUTS = [\n 'valueChange',\n 'touchedChange',\n 'touch',\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}