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.
- package/accordion/README.md +122 -0
- package/aspect-ratio/README.md +76 -0
- package/avatar/README.md +100 -0
- package/breadcrumbs/README.md +49 -0
- package/breakpoints/README.md +81 -0
- package/button/README.md +49 -0
- package/calendar/README.md +458 -0
- package/carousel/README.md +358 -0
- package/checkbox/README.md +146 -0
- package/combobox/README.md +535 -0
- package/context-menu/README.md +139 -0
- package/date-field/README.md +184 -0
- package/date-picker/README.md +338 -0
- package/dialog/README.md +388 -0
- package/disclosure/README.md +114 -0
- package/drag-drop/README.md +359 -0
- package/drawer/README.md +560 -0
- package/dropdown-menu/README.md +176 -0
- package/fesm2022/forty-cdk-accordion.mjs +348 -0
- package/fesm2022/forty-cdk-accordion.mjs.map +1 -0
- package/fesm2022/forty-cdk-aspect-ratio.mjs +74 -0
- package/fesm2022/forty-cdk-aspect-ratio.mjs.map +1 -0
- package/fesm2022/forty-cdk-avatar.mjs +308 -0
- package/fesm2022/forty-cdk-avatar.mjs.map +1 -0
- package/fesm2022/forty-cdk-breadcrumbs.mjs +125 -0
- package/fesm2022/forty-cdk-breadcrumbs.mjs.map +1 -0
- package/fesm2022/forty-cdk-breakpoints.mjs +117 -0
- package/fesm2022/forty-cdk-breakpoints.mjs.map +1 -0
- package/fesm2022/forty-cdk-button.mjs +134 -0
- package/fesm2022/forty-cdk-button.mjs.map +1 -0
- package/fesm2022/forty-cdk-calendar.mjs +2034 -0
- package/fesm2022/forty-cdk-calendar.mjs.map +1 -0
- package/fesm2022/forty-cdk-carousel.mjs +968 -0
- package/fesm2022/forty-cdk-carousel.mjs.map +1 -0
- package/fesm2022/forty-cdk-checkbox.mjs +226 -0
- package/fesm2022/forty-cdk-checkbox.mjs.map +1 -0
- package/fesm2022/forty-cdk-combobox.mjs +2596 -0
- package/fesm2022/forty-cdk-combobox.mjs.map +1 -0
- package/fesm2022/forty-cdk-context-menu.mjs +413 -0
- package/fesm2022/forty-cdk-context-menu.mjs.map +1 -0
- package/fesm2022/forty-cdk-core.mjs +9022 -0
- package/fesm2022/forty-cdk-core.mjs.map +1 -0
- package/fesm2022/forty-cdk-date-field.mjs +744 -0
- package/fesm2022/forty-cdk-date-field.mjs.map +1 -0
- package/fesm2022/forty-cdk-date-picker.mjs +1011 -0
- package/fesm2022/forty-cdk-date-picker.mjs.map +1 -0
- package/fesm2022/forty-cdk-dialog.mjs +707 -0
- package/fesm2022/forty-cdk-dialog.mjs.map +1 -0
- package/fesm2022/forty-cdk-disclosure.mjs +190 -0
- package/fesm2022/forty-cdk-disclosure.mjs.map +1 -0
- package/fesm2022/forty-cdk-drag-drop.mjs +1180 -0
- package/fesm2022/forty-cdk-drag-drop.mjs.map +1 -0
- package/fesm2022/forty-cdk-drawer.mjs +1641 -0
- package/fesm2022/forty-cdk-drawer.mjs.map +1 -0
- package/fesm2022/forty-cdk-dropdown-menu.mjs +350 -0
- package/fesm2022/forty-cdk-dropdown-menu.mjs.map +1 -0
- package/fesm2022/forty-cdk-field.mjs +425 -0
- package/fesm2022/forty-cdk-field.mjs.map +1 -0
- package/fesm2022/forty-cdk-fieldset.mjs +164 -0
- package/fesm2022/forty-cdk-fieldset.mjs.map +1 -0
- package/fesm2022/forty-cdk-file-upload.mjs +221 -0
- package/fesm2022/forty-cdk-file-upload.mjs.map +1 -0
- package/fesm2022/forty-cdk-hover-card.mjs +496 -0
- package/fesm2022/forty-cdk-hover-card.mjs.map +1 -0
- package/fesm2022/forty-cdk-input.mjs +274 -0
- package/fesm2022/forty-cdk-input.mjs.map +1 -0
- package/fesm2022/forty-cdk-internationalized-date.mjs +1 -1
- package/fesm2022/forty-cdk-internationalized-date.mjs.map +1 -1
- package/fesm2022/forty-cdk-listbox.mjs +1279 -0
- package/fesm2022/forty-cdk-listbox.mjs.map +1 -0
- package/fesm2022/forty-cdk-menu.mjs +1439 -0
- package/fesm2022/forty-cdk-menu.mjs.map +1 -0
- package/fesm2022/forty-cdk-menubar.mjs +787 -0
- package/fesm2022/forty-cdk-menubar.mjs.map +1 -0
- package/fesm2022/forty-cdk-meter.mjs +211 -0
- package/fesm2022/forty-cdk-meter.mjs.map +1 -0
- package/fesm2022/forty-cdk-navigation-menu.mjs +1145 -0
- package/fesm2022/forty-cdk-navigation-menu.mjs.map +1 -0
- package/fesm2022/forty-cdk-number-input.mjs +559 -0
- package/fesm2022/forty-cdk-number-input.mjs.map +1 -0
- package/fesm2022/forty-cdk-otp-input.mjs +527 -0
- package/fesm2022/forty-cdk-otp-input.mjs.map +1 -0
- package/fesm2022/forty-cdk-pagination.mjs +323 -0
- package/fesm2022/forty-cdk-pagination.mjs.map +1 -0
- package/fesm2022/forty-cdk-pane-resizer.mjs +297 -0
- package/fesm2022/forty-cdk-pane-resizer.mjs.map +1 -0
- package/fesm2022/forty-cdk-popover.mjs +698 -0
- package/fesm2022/forty-cdk-popover.mjs.map +1 -0
- package/fesm2022/forty-cdk-progress.mjs +226 -0
- package/fesm2022/forty-cdk-progress.mjs.map +1 -0
- package/fesm2022/forty-cdk-radio-group.mjs +378 -0
- package/fesm2022/forty-cdk-radio-group.mjs.map +1 -0
- package/fesm2022/forty-cdk-scroll-area.mjs +640 -0
- package/fesm2022/forty-cdk-scroll-area.mjs.map +1 -0
- package/fesm2022/forty-cdk-search.mjs +205 -0
- package/fesm2022/forty-cdk-search.mjs.map +1 -0
- package/fesm2022/forty-cdk-select.mjs +1661 -0
- package/fesm2022/forty-cdk-select.mjs.map +1 -0
- package/fesm2022/forty-cdk-separator.mjs +82 -0
- package/fesm2022/forty-cdk-separator.mjs.map +1 -0
- package/fesm2022/forty-cdk-signal-forms.mjs +97 -0
- package/fesm2022/forty-cdk-signal-forms.mjs.map +1 -0
- package/fesm2022/forty-cdk-slider.mjs +803 -0
- package/fesm2022/forty-cdk-slider.mjs.map +1 -0
- package/fesm2022/forty-cdk-stepper.mjs +886 -0
- package/fesm2022/forty-cdk-stepper.mjs.map +1 -0
- package/fesm2022/forty-cdk-switch.mjs +137 -0
- package/fesm2022/forty-cdk-switch.mjs.map +1 -0
- package/fesm2022/forty-cdk-table.mjs +1518 -0
- package/fesm2022/forty-cdk-table.mjs.map +1 -0
- package/fesm2022/forty-cdk-tabs.mjs +400 -0
- package/fesm2022/forty-cdk-tabs.mjs.map +1 -0
- package/fesm2022/forty-cdk-time-field.mjs +593 -0
- package/fesm2022/forty-cdk-time-field.mjs.map +1 -0
- package/fesm2022/forty-cdk-time-picker.mjs +1013 -0
- package/fesm2022/forty-cdk-time-picker.mjs.map +1 -0
- package/fesm2022/forty-cdk-toast.mjs +1153 -0
- package/fesm2022/forty-cdk-toast.mjs.map +1 -0
- package/fesm2022/forty-cdk-toggle.mjs +516 -0
- package/fesm2022/forty-cdk-toggle.mjs.map +1 -0
- package/fesm2022/forty-cdk-toolbar.mjs +374 -0
- package/fesm2022/forty-cdk-toolbar.mjs.map +1 -0
- package/fesm2022/forty-cdk-tooltip.mjs +672 -0
- package/fesm2022/forty-cdk-tooltip.mjs.map +1 -0
- package/fesm2022/forty-cdk-tree.mjs +2007 -0
- package/fesm2022/forty-cdk-tree.mjs.map +1 -0
- package/fesm2022/forty-cdk-virtualization.mjs +1 -1
- package/fesm2022/forty-cdk-virtualization.mjs.map +1 -1
- package/fesm2022/forty-cdk.mjs +0 -43310
- package/fesm2022/forty-cdk.mjs.map +1 -1
- package/field/README.md +97 -0
- package/fieldset/README.md +86 -0
- package/file-upload/README.md +73 -0
- package/hover-card/README.md +171 -0
- package/input/README.md +156 -0
- package/listbox/README.md +424 -0
- package/menu/README.md +181 -0
- package/menubar/README.md +140 -0
- package/meter/README.md +128 -0
- package/navigation-menu/README.md +253 -0
- package/number-input/README.md +171 -0
- package/otp-input/README.md +198 -0
- package/package.json +213 -1
- package/pagination/README.md +61 -0
- package/pane-resizer/README.md +136 -0
- package/popover/README.md +262 -0
- package/progress/README.md +115 -0
- package/radio-group/README.md +129 -0
- package/scroll-area/README.md +184 -0
- package/search/README.md +42 -0
- package/select/README.md +488 -0
- package/separator/README.md +84 -0
- package/signal-forms/README.md +72 -0
- package/slider/README.md +152 -0
- package/stepper/README.md +292 -0
- package/switch/README.md +116 -0
- package/table/README.md +769 -0
- package/tabs/README.md +130 -0
- package/time-field/README.md +157 -0
- package/time-picker/README.md +172 -0
- package/toast/README.md +398 -0
- package/toggle/README.md +224 -0
- package/toolbar/README.md +109 -0
- package/tooltip/README.md +274 -0
- package/tree/README.md +708 -0
- package/types/forty-cdk-accordion.d.ts +242 -0
- package/types/forty-cdk-aspect-ratio.d.ts +59 -0
- package/types/forty-cdk-avatar.d.ts +133 -0
- package/types/forty-cdk-breadcrumbs.d.ts +92 -0
- package/types/forty-cdk-breakpoints.d.ts +141 -0
- package/types/forty-cdk-button.d.ts +80 -0
- package/types/forty-cdk-calendar.d.ts +914 -0
- package/types/forty-cdk-carousel.d.ts +530 -0
- package/types/forty-cdk-checkbox.d.ts +141 -0
- package/types/forty-cdk-combobox.d.ts +1259 -0
- package/types/forty-cdk-context-menu.d.ts +313 -0
- package/types/forty-cdk-core.d.ts +5774 -0
- package/types/forty-cdk-date-field.d.ts +307 -0
- package/types/forty-cdk-date-picker.d.ts +622 -0
- package/types/forty-cdk-dialog.d.ts +546 -0
- package/types/forty-cdk-disclosure.d.ts +127 -0
- package/types/forty-cdk-drag-drop.d.ts +456 -0
- package/types/forty-cdk-drawer.d.ts +871 -0
- package/types/forty-cdk-dropdown-menu.d.ts +242 -0
- package/types/forty-cdk-field.d.ts +236 -0
- package/types/forty-cdk-fieldset.d.ts +119 -0
- package/types/forty-cdk-file-upload.d.ts +124 -0
- package/types/forty-cdk-hover-card.d.ts +320 -0
- package/types/forty-cdk-input.d.ts +169 -0
- package/types/forty-cdk-internationalized-date.d.ts +1 -1
- package/types/forty-cdk-listbox.d.ts +513 -0
- package/types/forty-cdk-menu.d.ts +629 -0
- package/types/forty-cdk-menubar.d.ts +451 -0
- package/types/forty-cdk-meter.d.ts +122 -0
- package/types/forty-cdk-navigation-menu.d.ts +514 -0
- package/types/forty-cdk-number-input.d.ts +319 -0
- package/types/forty-cdk-otp-input.d.ts +248 -0
- package/types/forty-cdk-pagination.d.ts +214 -0
- package/types/forty-cdk-pane-resizer.d.ts +145 -0
- package/types/forty-cdk-popover.d.ts +509 -0
- package/types/forty-cdk-progress.d.ts +143 -0
- package/types/forty-cdk-radio-group.d.ts +222 -0
- package/types/forty-cdk-scroll-area.d.ts +258 -0
- package/types/forty-cdk-search.d.ts +142 -0
- package/types/forty-cdk-select.d.ts +899 -0
- package/types/forty-cdk-separator.d.ts +59 -0
- package/types/forty-cdk-signal-forms.d.ts +58 -0
- package/types/forty-cdk-slider.d.ts +379 -0
- package/types/forty-cdk-stepper.d.ts +650 -0
- package/types/forty-cdk-switch.d.ts +87 -0
- package/types/forty-cdk-table.d.ts +723 -0
- package/types/forty-cdk-tabs.d.ts +235 -0
- package/types/forty-cdk-time-field.d.ts +307 -0
- package/types/forty-cdk-time-picker.d.ts +578 -0
- package/types/forty-cdk-toast.d.ts +598 -0
- package/types/forty-cdk-toggle.d.ts +310 -0
- package/types/forty-cdk-toolbar.d.ts +217 -0
- package/types/forty-cdk-tooltip.d.ts +436 -0
- package/types/forty-cdk-tree.d.ts +688 -0
- 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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"}
|