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,297 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, model, output, inject, ElementRef, DestroyRef, Directive } from '@angular/core';
3
+ import { injectTextDirection, startPointerResize, clampToRange, roundToStepPrecision, createDefaults } from 'forty-cdk/core';
4
+
5
+ /**
6
+ * Headless implementation of the
7
+ * [WAI-ARIA Window Splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/):
8
+ * the focusable divider between two resizable panes. Carries `role="separator"`
9
+ * with live `aria-valuenow` / `aria-valuemin` / `aria-valuemax`, is tabbable,
10
+ * handles arrow keys / Page Up-Down / Home / End / (optional) Enter, and
11
+ * supports pointer drag with `setPointerCapture`. Emits `(resizing)` on every
12
+ * mutation and `(resizeCommit)` once per key release / drag end.
13
+ *
14
+ * It is essentially a 1-D slider wearing a separator role; the static
15
+ * `[forSeparator]` divider stays a separate, thinner primitive so a visual-only
16
+ * separator never pulls the drag / keyboard-resize code in.
17
+ *
18
+ * Pointer drag arms only after the pointer travels past a small dead-zone (a
19
+ * few px), so a plain click that fires a stray sub-threshold `pointermove`
20
+ * never mutates the value — `(resizing)` won't fire on a jittery click.
21
+ *
22
+ * @example
23
+ * ```html
24
+ * <!-- Vertical divider between two horizontally stacked panes. -->
25
+ * <div
26
+ * forPaneResizer
27
+ * orientation="vertical"
28
+ * [(value)]="size"
29
+ * [min]="100"
30
+ * [max]="700"
31
+ * [step]="8"
32
+ * [largeStep]="80"
33
+ * aria-controls="pane-a pane-b"
34
+ * ></div>
35
+ * ```
36
+ */
37
+ class ForPaneResizer {
38
+ /**
39
+ * Axis the divider line runs along. `horizontal` splits content stacked
40
+ * vertically; `vertical` splits content arranged horizontally. Defaults to
41
+ * `horizontal`.
42
+ *
43
+ * `orientation` describes the *separator line*; the resize axis runs
44
+ * perpendicular to it. APG: a horizontal pane stack uses a vertical
45
+ * separator, and arrow keys move along the resize axis.
46
+ */
47
+ orientation = input('horizontal', /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
49
+ /**
50
+ * Disables the resizer: it drops out of tab order, no keyboard or pointer
51
+ * mutation fires, and `aria-disabled` / `data-disabled` are reflected.
52
+ */
53
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
54
+ /**
55
+ * Two-way bindable. The current value along the resize axis. Units are
56
+ * consumer-defined (px, %, fr, rem, …) — the directive treats this as an
57
+ * opaque number constrained by `min` / `max`. Pointer drag adds raw px
58
+ * deltas, so use px units when wiring drag directly; keyboard navigation is
59
+ * unit-agnostic.
60
+ *
61
+ * The `model()` change emitter (`(valueChange)`) follows the project-wide
62
+ * contract: it fires only on internal updates (keyboard, drag), never on
63
+ * consumer writes via `[(value)]` — observe transitions without binding
64
+ * back. `(resizing)` carries the same value with a verb-named alias for
65
+ * one-way wiring.
66
+ */
67
+ value = model(0, /* @ts-ignore */
68
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
69
+ /** Lower bound for `value`. Default `0`. */
70
+ min = input(0, /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
72
+ /** Upper bound for `value`. Default `100` (matches a percentage default). */
73
+ max = input(100, /* @ts-ignore */
74
+ ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
75
+ /** Step applied by ArrowKeys along the resize axis. Default `1`. */
76
+ step = input(1, /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
78
+ /** Step applied by `Page Up` / `Page Down`. Default `10`. */
79
+ largeStep = input(10, /* @ts-ignore */
80
+ ...(ngDevMode ? [{ debugName: "largeStep" }] : /* istanbul ignore next */ []));
81
+ /**
82
+ * Optional human-readable value for `aria-valuetext`. Use when the bare
83
+ * number is not meaningful to AT (e.g. `"30 percent of viewport"`). When
84
+ * `null`, AT reads `aria-valuenow`.
85
+ */
86
+ valueText = input(null, /* @ts-ignore */
87
+ ...(ngDevMode ? [{ debugName: "valueText" }] : /* istanbul ignore next */ []));
88
+ /**
89
+ * Space-separated list of element ids the resizer splits. Surfaces as
90
+ * `aria-controls`. Recommended per APG so AT can relate the resizer to the
91
+ * panes it affects.
92
+ */
93
+ controls = input(null, /* @ts-ignore */
94
+ ...(ngDevMode ? [{ debugName: "controls" }] : /* istanbul ignore next */ []));
95
+ /**
96
+ * Opt-in `Enter` (and `Space`) toggle: collapses the value to `min` and
97
+ * restores the last non-min value on the next press. APG-optional behaviour
98
+ * for resizers that back a collapsible pane. Off by default — enabling it
99
+ * changes the meaning of `Enter`.
100
+ */
101
+ collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
102
+ /**
103
+ * Reading direction. RTL inverts ArrowLeft / ArrowRight on a vertical
104
+ * separator (horizontal pane stack) and the horizontal axis of pointer
105
+ * drag. When unset (default `null`), the inherited ambient direction is
106
+ * resolved from the nearest ancestor carrying a `dir` attribute (or
107
+ * `<html dir>`), defaulting to `'ltr'`. An explicit `[dir]` always wins and
108
+ * the resolved value is reflected to the host `dir` attribute.
109
+ */
110
+ _dirInput = input(null, { ...(ngDevMode ? { debugName: "_dirInput" } : /* istanbul ignore next */ {}), alias: 'dir' });
111
+ dir = injectTextDirection(this._dirInput);
112
+ /**
113
+ * Verb-named alias for the model change emitter. Fires on every value
114
+ * mutation (keyboard step, pointer-move tick). Emits the same value as
115
+ * `(valueChange)`; pick one or the other based on whether you want
116
+ * two-way binding (`[(value)]`) or one-shot observation.
117
+ */
118
+ resizing = output();
119
+ /**
120
+ * Fires once at the end of a resize burst — when the user releases the
121
+ * pointer (or it is cancelled) or releases an arrow / page key. Useful for
122
+ * persisting the final size after a drag, where `(resizing)` may fire 60+
123
+ * times per second.
124
+ */
125
+ resizeCommit = output();
126
+ #host = inject(ElementRef).nativeElement;
127
+ /** Last value above `min` — used to restore size when `collapsible` Enter expands. */
128
+ #lastNonMinValue = 0;
129
+ #disposePointer = null;
130
+ /** True between the first kbd-driven mutation and the next `keyup`. */
131
+ #pendingKeyboardCommit = false;
132
+ constructor() {
133
+ inject(DestroyRef).onDestroy(() => this.#disposePointer?.());
134
+ }
135
+ onKeyDown(event) {
136
+ if (this.disabled()) {
137
+ return;
138
+ }
139
+ // Vertical separator (line) → resize axis is horizontal → ArrowLeft/Right.
140
+ // Horizontal separator (line) → resize axis is vertical → ArrowUp/Down.
141
+ const axis = this.orientation() === 'vertical' ? 'horizontal' : 'vertical';
142
+ const ltr = this.dir() !== 'rtl';
143
+ let next = null;
144
+ switch (event.key) {
145
+ case 'ArrowLeft':
146
+ if (axis !== 'horizontal')
147
+ return;
148
+ next = this.#stepClamp(this.value() + (ltr ? -this.step() : this.step()), this.step());
149
+ break;
150
+ case 'ArrowRight':
151
+ if (axis !== 'horizontal')
152
+ return;
153
+ next = this.#stepClamp(this.value() + (ltr ? this.step() : -this.step()), this.step());
154
+ break;
155
+ case 'ArrowUp':
156
+ if (axis !== 'vertical')
157
+ return;
158
+ next = this.#stepClamp(this.value() - this.step(), this.step());
159
+ break;
160
+ case 'ArrowDown':
161
+ if (axis !== 'vertical')
162
+ return;
163
+ next = this.#stepClamp(this.value() + this.step(), this.step());
164
+ break;
165
+ case 'PageUp':
166
+ next = this.#stepClamp(this.value() - this.largeStep(), this.largeStep());
167
+ break;
168
+ case 'PageDown':
169
+ next = this.#stepClamp(this.value() + this.largeStep(), this.largeStep());
170
+ break;
171
+ case 'Home':
172
+ next = this.min();
173
+ break;
174
+ case 'End':
175
+ next = this.max();
176
+ break;
177
+ case 'Enter':
178
+ case ' ':
179
+ if (!this.collapsible())
180
+ return;
181
+ event.preventDefault();
182
+ this.#toggleCollapsed();
183
+ return;
184
+ default:
185
+ return;
186
+ }
187
+ event.preventDefault();
188
+ if (next === this.value()) {
189
+ return;
190
+ }
191
+ this.value.set(next);
192
+ this.resizing.emit(next);
193
+ this.#pendingKeyboardCommit = true;
194
+ }
195
+ onKeyUp(_event) {
196
+ if (!this.#pendingKeyboardCommit) {
197
+ return;
198
+ }
199
+ this.#pendingKeyboardCommit = false;
200
+ this.resizeCommit.emit(this.value());
201
+ }
202
+ onPointerDown(event) {
203
+ if (this.disabled()) {
204
+ return;
205
+ }
206
+ if (event.button !== 0) {
207
+ return;
208
+ }
209
+ event.preventDefault();
210
+ const ltr = this.dir() !== 'rtl';
211
+ this.#disposePointer = startPointerResize(event, {
212
+ host: this.#host,
213
+ axis: this.orientation() === 'vertical' ? 'x' : 'y',
214
+ startValue: this.value(),
215
+ invert: this.orientation() === 'vertical' && !ltr,
216
+ constrain: (n) => this.#clamp(n),
217
+ onResize: (v) => {
218
+ this.value.set(v);
219
+ this.resizing.emit(v);
220
+ },
221
+ onCommit: (v) => this.resizeCommit.emit(v),
222
+ });
223
+ }
224
+ #toggleCollapsed() {
225
+ const current = this.value();
226
+ const min = this.min();
227
+ let next;
228
+ if (current <= min) {
229
+ // Restore last non-min value, falling back to max if the consumer has
230
+ // not produced one yet (initial value === min).
231
+ next = this.#clamp(this.#lastNonMinValue > min ? this.#lastNonMinValue : this.max());
232
+ }
233
+ else {
234
+ this.#lastNonMinValue = current;
235
+ next = min;
236
+ }
237
+ if (next === current) {
238
+ return;
239
+ }
240
+ this.value.set(next);
241
+ this.resizing.emit(next);
242
+ this.resizeCommit.emit(next);
243
+ }
244
+ #clamp(n) {
245
+ return clampToRange(n, this.min(), this.max());
246
+ }
247
+ /** Clamp a step-derived value, rounding to the step's precision first. */
248
+ #stepClamp(n, step) {
249
+ return this.#clamp(roundToStepPrecision(n, step));
250
+ }
251
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForPaneResizer, deps: [], target: i0.ɵɵFactoryTarget.Directive });
252
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: ForPaneResizer, isStandalone: true, selector: "[forPaneResizer]", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, 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 }, largeStep: { classPropertyName: "largeStep", publicName: "largeStep", isSignal: true, isRequired: false, transformFunction: null }, valueText: { classPropertyName: "valueText", publicName: "valueText", isSignal: true, isRequired: false, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, _dirInput: { classPropertyName: "_dirInput", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", resizing: "resizing", resizeCommit: "resizeCommit" }, host: { attributes: { "role": "separator" }, listeners: { "keydown": "onKeyDown($event)", "keyup": "onKeyUp($event)", "pointerdown": "onPointerDown($event)" }, properties: { "attr.aria-orientation": "orientation()", "attr.data-orientation": "orientation()", "attr.tabindex": "disabled() ? null : \"0\"", "attr.aria-valuenow": "value()", "attr.aria-valuemin": "min()", "attr.aria-valuemax": "max()", "attr.aria-valuetext": "valueText() || null", "attr.aria-controls": "controls()", "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.dir": "dir()" } }, exportAs: ["forPaneResizer"], ngImport: i0 });
253
+ }
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForPaneResizer, decorators: [{
255
+ type: Directive,
256
+ args: [{
257
+ selector: '[forPaneResizer]',
258
+ exportAs: 'forPaneResizer',
259
+ host: {
260
+ role: 'separator',
261
+ '[attr.aria-orientation]': 'orientation()',
262
+ '[attr.data-orientation]': 'orientation()',
263
+ '[attr.tabindex]': 'disabled() ? null : "0"',
264
+ '[attr.aria-valuenow]': 'value()',
265
+ '[attr.aria-valuemin]': 'min()',
266
+ '[attr.aria-valuemax]': 'max()',
267
+ '[attr.aria-valuetext]': 'valueText() || null',
268
+ '[attr.aria-controls]': 'controls()',
269
+ '[attr.aria-disabled]': 'disabled() ? "true" : null',
270
+ '[attr.data-disabled]': 'disabled() ? "" : null',
271
+ '[attr.dir]': 'dir()',
272
+ '(keydown)': 'onKeyDown($event)',
273
+ '(keyup)': 'onKeyUp($event)',
274
+ '(pointerdown)': 'onPointerDown($event)',
275
+ },
276
+ }]
277
+ }], ctorParameters: () => [], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], 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 }] }], largeStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "largeStep", required: false }] }], valueText: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueText", required: false }] }], controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], _dirInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], resizing: [{ type: i0.Output, args: ["resizing"] }], resizeCommit: [{ type: i0.Output, args: ["resizeCommit"] }] } });
278
+
279
+ const FALLBACK = {};
280
+ const { token, provideDefaults } = createDefaults('FOR_PANE_RESIZER_DEFAULTS', FALLBACK);
281
+ /** Token holding the resolved pane-resizer defaults for the current scope. */
282
+ const FOR_PANE_RESIZER_DEFAULTS = token;
283
+ /**
284
+ * Configures forty-cdk pane-resizer defaults for this injector scope. Partial
285
+ * overrides inherit unspecified keys from the parent scope (or library
286
+ * defaults at the root).
287
+ */
288
+ function provideForPaneResizerDefaults(defaults = {}) {
289
+ return provideDefaults(defaults);
290
+ }
291
+
292
+ /**
293
+ * Generated bundle index. Do not edit.
294
+ */
295
+
296
+ export { FOR_PANE_RESIZER_DEFAULTS, ForPaneResizer, provideForPaneResizerDefaults };
297
+ //# sourceMappingURL=forty-cdk-pane-resizer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forty-cdk-pane-resizer.mjs","sources":["../../../projects/forty-cdk/pane-resizer/src/pane-resizer.ts","../../../projects/forty-cdk/pane-resizer/src/pane-resizer-defaults.ts","../../../projects/forty-cdk/pane-resizer/src/forty-cdk-pane-resizer.ts"],"sourcesContent":["import {\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\n\nimport {\n type WritingDirection,\n injectTextDirection,\n clampToRange,\n roundToStepPrecision,\n startPointerResize,\n} from 'forty-cdk/core';\n\n/**\n * Headless implementation of the\n * [WAI-ARIA Window Splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/):\n * the focusable divider between two resizable panes. Carries `role=\"separator\"`\n * with live `aria-valuenow` / `aria-valuemin` / `aria-valuemax`, is tabbable,\n * handles arrow keys / Page Up-Down / Home / End / (optional) Enter, and\n * supports pointer drag with `setPointerCapture`. Emits `(resizing)` on every\n * mutation and `(resizeCommit)` once per key release / drag end.\n *\n * It is essentially a 1-D slider wearing a separator role; the static\n * `[forSeparator]` divider stays a separate, thinner primitive so a visual-only\n * separator never pulls the drag / keyboard-resize code in.\n *\n * Pointer drag arms only after the pointer travels past a small dead-zone (a\n * few px), so a plain click that fires a stray sub-threshold `pointermove`\n * never mutates the value — `(resizing)` won't fire on a jittery click.\n *\n * @example\n * ```html\n * <!-- Vertical divider between two horizontally stacked panes. -->\n * <div\n * forPaneResizer\n * orientation=\"vertical\"\n * [(value)]=\"size\"\n * [min]=\"100\"\n * [max]=\"700\"\n * [step]=\"8\"\n * [largeStep]=\"80\"\n * aria-controls=\"pane-a pane-b\"\n * ></div>\n * ```\n */\n@Directive({\n selector: '[forPaneResizer]',\n exportAs: 'forPaneResizer',\n host: {\n role: 'separator',\n '[attr.aria-orientation]': 'orientation()',\n '[attr.data-orientation]': 'orientation()',\n '[attr.tabindex]': 'disabled() ? null : \"0\"',\n '[attr.aria-valuenow]': 'value()',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-valuetext]': 'valueText() || null',\n '[attr.aria-controls]': 'controls()',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n '[attr.dir]': 'dir()',\n '(keydown)': 'onKeyDown($event)',\n '(keyup)': 'onKeyUp($event)',\n '(pointerdown)': 'onPointerDown($event)',\n },\n})\nexport class ForPaneResizer {\n /**\n * Axis the divider line runs along. `horizontal` splits content stacked\n * vertically; `vertical` splits content arranged horizontally. Defaults to\n * `horizontal`.\n *\n * `orientation` describes the *separator line*; the resize axis runs\n * perpendicular to it. APG: a horizontal pane stack uses a vertical\n * separator, and arrow keys move along the resize axis.\n */\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n /**\n * Disables the resizer: it drops out of tab order, no keyboard or pointer\n * mutation fires, and `aria-disabled` / `data-disabled` are reflected.\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Two-way bindable. The current value along the resize axis. Units are\n * consumer-defined (px, %, fr, rem, …) — the directive treats this as an\n * opaque number constrained by `min` / `max`. Pointer drag adds raw px\n * deltas, so use px units when wiring drag directly; keyboard navigation is\n * unit-agnostic.\n *\n * The `model()` change emitter (`(valueChange)`) follows the project-wide\n * contract: it fires only on internal updates (keyboard, drag), never on\n * consumer writes via `[(value)]` — observe transitions without binding\n * back. `(resizing)` carries the same value with a verb-named alias for\n * one-way wiring.\n */\n readonly value = model<number>(0);\n\n /** Lower bound for `value`. Default `0`. */\n readonly min = input<number>(0);\n\n /** Upper bound for `value`. Default `100` (matches a percentage default). */\n readonly max = input<number>(100);\n\n /** Step applied by ArrowKeys along the resize axis. Default `1`. */\n readonly step = input<number>(1);\n\n /** Step applied by `Page Up` / `Page Down`. Default `10`. */\n readonly largeStep = input<number>(10);\n\n /**\n * Optional human-readable value for `aria-valuetext`. Use when the bare\n * number is not meaningful to AT (e.g. `\"30 percent of viewport\"`). When\n * `null`, AT reads `aria-valuenow`.\n */\n readonly valueText = input<string | null>(null);\n\n /**\n * Space-separated list of element ids the resizer splits. Surfaces as\n * `aria-controls`. Recommended per APG so AT can relate the resizer to the\n * panes it affects.\n */\n readonly controls = input<string | null>(null);\n\n /**\n * Opt-in `Enter` (and `Space`) toggle: collapses the value to `min` and\n * restores the last non-min value on the next press. APG-optional behaviour\n * for resizers that back a collapsible pane. Off by default — enabling it\n * changes the meaning of `Enter`.\n */\n readonly collapsible = input(false, { transform: booleanAttribute });\n\n /**\n * Reading direction. RTL inverts ArrowLeft / ArrowRight on a vertical\n * separator (horizontal pane stack) and the horizontal axis of pointer\n * drag. When unset (default `null`), the inherited ambient direction is\n * resolved from the nearest ancestor carrying a `dir` attribute (or\n * `<html dir>`), defaulting to `'ltr'`. An explicit `[dir]` always wins and\n * the resolved value is reflected to the host `dir` attribute.\n */\n readonly _dirInput = input<WritingDirection | null>(null, { alias: 'dir' });\n readonly dir = injectTextDirection(this._dirInput);\n\n /**\n * Verb-named alias for the model change emitter. Fires on every value\n * mutation (keyboard step, pointer-move tick). Emits the same value as\n * `(valueChange)`; pick one or the other based on whether you want\n * two-way binding (`[(value)]`) or one-shot observation.\n */\n readonly resizing = output<number>();\n\n /**\n * Fires once at the end of a resize burst — when the user releases the\n * pointer (or it is cancelled) or releases an arrow / page key. Useful for\n * persisting the final size after a drag, where `(resizing)` may fire 60+\n * times per second.\n */\n readonly resizeCommit = output<number>();\n\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** Last value above `min` — used to restore size when `collapsible` Enter expands. */\n #lastNonMinValue = 0;\n\n #disposePointer: (() => void) | null = null;\n\n /** True between the first kbd-driven mutation and the next `keyup`. */\n #pendingKeyboardCommit = false;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.#disposePointer?.());\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.disabled()) {\n return;\n }\n\n // Vertical separator (line) → resize axis is horizontal → ArrowLeft/Right.\n // Horizontal separator (line) → resize axis is vertical → ArrowUp/Down.\n const axis: 'horizontal' | 'vertical' =\n this.orientation() === 'vertical' ? 'horizontal' : 'vertical';\n const ltr = this.dir() !== 'rtl';\n\n let next: number | null = null;\n\n switch (event.key) {\n case 'ArrowLeft':\n if (axis !== 'horizontal') return;\n next = this.#stepClamp(this.value() + (ltr ? -this.step() : this.step()), this.step());\n break;\n case 'ArrowRight':\n if (axis !== 'horizontal') return;\n next = this.#stepClamp(this.value() + (ltr ? this.step() : -this.step()), this.step());\n break;\n case 'ArrowUp':\n if (axis !== 'vertical') return;\n next = this.#stepClamp(this.value() - this.step(), this.step());\n break;\n case 'ArrowDown':\n if (axis !== 'vertical') return;\n next = this.#stepClamp(this.value() + this.step(), this.step());\n break;\n case 'PageUp':\n next = this.#stepClamp(this.value() - this.largeStep(), this.largeStep());\n break;\n case 'PageDown':\n next = this.#stepClamp(this.value() + this.largeStep(), this.largeStep());\n break;\n case 'Home':\n next = this.min();\n break;\n case 'End':\n next = this.max();\n break;\n case 'Enter':\n case ' ':\n if (!this.collapsible()) return;\n event.preventDefault();\n this.#toggleCollapsed();\n return;\n default:\n return;\n }\n\n event.preventDefault();\n if (next === this.value()) {\n return;\n }\n this.value.set(next);\n this.resizing.emit(next);\n this.#pendingKeyboardCommit = true;\n }\n\n protected onKeyUp(_event: KeyboardEvent): void {\n if (!this.#pendingKeyboardCommit) {\n return;\n }\n this.#pendingKeyboardCommit = false;\n this.resizeCommit.emit(this.value());\n }\n\n protected onPointerDown(event: PointerEvent): void {\n if (this.disabled()) {\n return;\n }\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n const ltr = this.dir() !== 'rtl';\n this.#disposePointer = startPointerResize(event, {\n host: this.#host,\n axis: this.orientation() === 'vertical' ? 'x' : 'y',\n startValue: this.value(),\n invert: this.orientation() === 'vertical' && !ltr,\n constrain: (n) => this.#clamp(n),\n onResize: (v) => {\n this.value.set(v);\n this.resizing.emit(v);\n },\n onCommit: (v) => this.resizeCommit.emit(v),\n });\n }\n\n #toggleCollapsed(): void {\n const current = this.value();\n const min = this.min();\n let next: number;\n if (current <= min) {\n // Restore last non-min value, falling back to max if the consumer has\n // not produced one yet (initial value === min).\n next = this.#clamp(this.#lastNonMinValue > min ? this.#lastNonMinValue : this.max());\n } else {\n this.#lastNonMinValue = current;\n next = min;\n }\n if (next === current) {\n return;\n }\n this.value.set(next);\n this.resizing.emit(next);\n this.resizeCommit.emit(next);\n }\n\n #clamp(n: number): number {\n return clampToRange(n, this.min(), this.max());\n }\n\n /** Clamp a step-derived value, rounding to the step's precision first. */\n #stepClamp(n: number, step: number): number {\n return this.#clamp(roundToStepPrecision(n, step));\n }\n}\n","import { type Provider } from '@angular/core';\n\nimport { createDefaults } from 'forty-cdk/core';\n\n/**\n * Defaults inherited by descendant pane resizers in the surrounding injector\n * scope. Configure with `provideForPaneResizerDefaults`. The shape is a stub\n * today — present so future per-scope tuning can land without churning the\n * public surface.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ForPaneResizerDefaults {}\n\nconst FALLBACK: ForPaneResizerDefaults = {};\n\nconst { token, provideDefaults } = createDefaults<ForPaneResizerDefaults>(\n 'FOR_PANE_RESIZER_DEFAULTS',\n FALLBACK,\n);\n\n/** Token holding the resolved pane-resizer defaults for the current scope. */\nexport const FOR_PANE_RESIZER_DEFAULTS = token;\n\n/**\n * Configures forty-cdk pane-resizer 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 provideForPaneResizerDefaults(\n defaults: Partial<ForPaneResizerDefaults> = {},\n): Provider[] {\n return provideDefaults(defaults);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}