@cdevhub/ngx-tw 0.5.0 → 0.6.1
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/README.md +78 -15
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +28 -4
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +63 -2
- package/theme/_base.css +13 -0
- package/theme/_dark.css +111 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +332 -0
- package/theme/_semantic.css +60 -26
- package/theme/_typography.css +17 -0
- package/theme/index.css +86 -7
- package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
- package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
- package/types/cdevhub-ngx-tw-button.d.ts +1 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
- package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
- package/types/cdevhub-ngx-tw-card.d.ts +11 -3
- package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
- package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
- package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
- package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
- package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
- package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
- package/types/cdevhub-ngx-tw-core.d.ts +152 -21
- package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
- package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
- package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
- package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
- package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
- package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
- package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
- package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
- package/types/cdevhub-ngx-tw-input.d.ts +5 -8
- package/types/cdevhub-ngx-tw-item.d.ts +2 -0
- package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
- package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
- package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
- package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
- package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
- package/types/cdevhub-ngx-tw-select.d.ts +104 -33
- package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
- package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
- package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
- package/types/cdevhub-ngx-tw-split.d.ts +32 -2
- package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
- package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
- package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
- package/types/cdevhub-ngx-tw-table.d.ts +53 -10
- package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
- package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
- package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
- package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
- package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
- package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
- package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
- package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
- package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
- package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
- package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/** Filters accepted by `TransferItemHarness.with`. */
|
|
4
|
+
interface TransferItemHarnessFilters extends BaseHarnessFilters {
|
|
5
|
+
/** Match by the row's visible text. */
|
|
6
|
+
text?: string | RegExp;
|
|
7
|
+
/** Match ticked / unticked rows. */
|
|
8
|
+
checked?: boolean;
|
|
9
|
+
/** Match disabled / enabled rows. */
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Harness for a single row inside one of a `tw-transfer`'s two panels.
|
|
14
|
+
*
|
|
15
|
+
* Rows are `CdkOption`s, so the harness reads ARIA that CDK owns rather than
|
|
16
|
+
* anything ngx-tw renders: `aria-selected` for the ticked state and
|
|
17
|
+
* `aria-disabled` for the per-item disable predicate.
|
|
18
|
+
*
|
|
19
|
+
* "Checked" here is the *ephemeral pending-move* state — which rows the next
|
|
20
|
+
* move button press will shuttle — not membership of a side. Membership is the
|
|
21
|
+
* component's value; read it by asking {@link TransferHarness} which panel a
|
|
22
|
+
* row is in.
|
|
23
|
+
*
|
|
24
|
+
* Reach these through {@link TransferHarness.getItems}: located from a document
|
|
25
|
+
* root the selector would match every listbox option on the page.
|
|
26
|
+
*/
|
|
27
|
+
declare class TransferItemHarness extends ComponentHarness {
|
|
28
|
+
static hostSelector: string;
|
|
29
|
+
/** Predicate for `locatorFor` / `locatorForAll`. */
|
|
30
|
+
static with(options?: TransferItemHarnessFilters): HarnessPredicate<TransferItemHarness>;
|
|
31
|
+
/**
|
|
32
|
+
* The row's rendered text, trimmed. With the default row rendering this is
|
|
33
|
+
* `labelFn(item)`; a projected `*twTransferItem` template makes it whatever
|
|
34
|
+
* that template renders.
|
|
35
|
+
*/
|
|
36
|
+
getText(): Promise<string>;
|
|
37
|
+
/** Whether the row is ticked for the next move, from `aria-selected`. */
|
|
38
|
+
isChecked(): Promise<boolean>;
|
|
39
|
+
/** Whether the row reports `aria-disabled="true"` (`behavior.disabledItem`). */
|
|
40
|
+
isDisabled(): Promise<boolean>;
|
|
41
|
+
/** Ticks the row for the next move. No-op when already ticked. */
|
|
42
|
+
check(): Promise<void>;
|
|
43
|
+
/** Unticks the row. No-op when already unticked. */
|
|
44
|
+
uncheck(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Which panel of a `tw-transfer` a call addresses. Structurally identical to
|
|
49
|
+
* the component's own `TwTransferSide`, redeclared here so the testing entry
|
|
50
|
+
* point stays free of any import from the component entry point.
|
|
51
|
+
*/
|
|
52
|
+
type TransferHarnessSide = 'source' | 'target';
|
|
53
|
+
/** Filters accepted by `TransferHarness.with`. */
|
|
54
|
+
interface TransferHarnessFilters extends BaseHarnessFilters {
|
|
55
|
+
/** Match by the control's accessible name (its `aria-label`). */
|
|
56
|
+
label?: string | RegExp;
|
|
57
|
+
/** Match disabled / enabled controls. */
|
|
58
|
+
disabled?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Harness for `tw-transfer`.
|
|
62
|
+
*
|
|
63
|
+
* ## How the two panels are told apart
|
|
64
|
+
*
|
|
65
|
+
* The panels are one `ng-template` instantiated twice, and neither the panel
|
|
66
|
+
* element nor its list carries a side marker. The only per-side hook the
|
|
67
|
+
* component renders is the auto-generated panel-title id — `…-source-title` /
|
|
68
|
+
* `…-target-title` — which the listbox references through `aria-labelledby`
|
|
69
|
+
* and which the component's own `focusDestination()` already matches on for
|
|
70
|
+
* the same reason. This harness scopes every per-side query with a suffix
|
|
71
|
+
* match on that id.
|
|
72
|
+
*
|
|
73
|
+
* Two consequences worth knowing:
|
|
74
|
+
*
|
|
75
|
+
* - Ordering is never assumed, so a panel that has emptied (its listbox is
|
|
76
|
+
* removed entirely — an empty `role="listbox"` violates
|
|
77
|
+
* `aria-required-children`) does not shift the other panel's identity.
|
|
78
|
+
* {@link getItems} simply returns `[]` for the empty side.
|
|
79
|
+
* - The hook is a derived id, not a declared contract. If the panels ever gain
|
|
80
|
+
* a real marker attribute, this is the code that should move onto it.
|
|
81
|
+
*
|
|
82
|
+
* The whole control lives inside the `tw-transfer` host — there is no CDK
|
|
83
|
+
* overlay — so the ordinary fixture loader is enough.
|
|
84
|
+
*/
|
|
85
|
+
declare class TransferHarness extends ComponentHarness {
|
|
86
|
+
static hostSelector: string;
|
|
87
|
+
/**
|
|
88
|
+
* The move buttons, in DOM order: `[0]` shuttles source → target and `[1]`
|
|
89
|
+
* target → source (absent under `behavior.oneWay`).
|
|
90
|
+
*
|
|
91
|
+
* The `:not()` excludes buttons a consumer projected into a
|
|
92
|
+
* `*twTransferItem` template, which would otherwise be picked up ahead of
|
|
93
|
+
* the real controls — rows render before the button column.
|
|
94
|
+
*/
|
|
95
|
+
private readonly moveButtons;
|
|
96
|
+
/** Predicate for `locatorFor` / `locatorForAll`. */
|
|
97
|
+
static with(options?: TransferHarnessFilters): HarnessPredicate<TransferHarness>;
|
|
98
|
+
/** The control's accessible name, from `aria-label` when one is set. */
|
|
99
|
+
getLabel(): Promise<string | null>;
|
|
100
|
+
/** Whether the control reports `aria-disabled="true"`. */
|
|
101
|
+
isDisabled(): Promise<boolean>;
|
|
102
|
+
/** The title rendered in a panel's header. */
|
|
103
|
+
getTitle(side: TransferHarnessSide): Promise<string>;
|
|
104
|
+
/**
|
|
105
|
+
* Every visible row in a panel, in render order. Returns `[]` for a panel
|
|
106
|
+
* with nothing in it — including one hidden behind a search query, since
|
|
107
|
+
* filtering removes rows from the DOM rather than hiding them.
|
|
108
|
+
*
|
|
109
|
+
* `filters.ancestor` is ignored: picking the side *is* the ancestor.
|
|
110
|
+
*/
|
|
111
|
+
getItems(side: TransferHarnessSide, filters?: TransferItemHarnessFilters): Promise<TransferItemHarness[]>;
|
|
112
|
+
/** The visible text of every row in a panel, in render order. */
|
|
113
|
+
getItemTexts(side: TransferHarnessSide): Promise<string[]>;
|
|
114
|
+
/**
|
|
115
|
+
* How many rows a panel is showing. This is the number the panel header's
|
|
116
|
+
* count also reports, so it tracks the search query rather than total
|
|
117
|
+
* membership.
|
|
118
|
+
*/
|
|
119
|
+
getItemCount(side: TransferHarnessSide): Promise<number>;
|
|
120
|
+
/**
|
|
121
|
+
* Ticks the first row in a panel whose text matches, staging it for the next
|
|
122
|
+
* move. Throws when nothing matches, rather than failing silently.
|
|
123
|
+
*/
|
|
124
|
+
checkItem(side: TransferHarnessSide, text: string | RegExp): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Drives a panel's header select-all checkbox to `checked`, ticking or
|
|
127
|
+
* clearing every enabled visible row in one gesture. This is how "move
|
|
128
|
+
* everything" is expressed: `setAllChecked('source', true)` then
|
|
129
|
+
* {@link moveToTarget}.
|
|
130
|
+
*
|
|
131
|
+
* The checkbox is tri-state. From `mixed` a single click resolves to
|
|
132
|
+
* *checked*, the way a native indeterminate checkbox does, so clearing from
|
|
133
|
+
* a partial selection takes two clicks — which is what a user does too, and
|
|
134
|
+
* what this method issues. Everything is ticked in between.
|
|
135
|
+
*
|
|
136
|
+
* Throws when the checkbox is not rendered (`display.showSelectAll: false`).
|
|
137
|
+
*/
|
|
138
|
+
setAllChecked(side: TransferHarnessSide, checked: boolean): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Presses the → button, shuttling the source panel's ticked rows to the
|
|
141
|
+
* target. Rows that are disabled are skipped by the component.
|
|
142
|
+
*/
|
|
143
|
+
moveToTarget(): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Presses the ← button, shuttling the target panel's ticked rows back to the
|
|
146
|
+
* source. Throws under `behavior.oneWay`, where that button is not rendered.
|
|
147
|
+
*/
|
|
148
|
+
moveToSource(): Promise<void>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { TransferHarness, TransferItemHarness };
|
|
152
|
+
export type { TransferHarnessFilters, TransferHarnessSide, TransferItemHarnessFilters };
|
|
@@ -135,13 +135,13 @@ declare class TransferComponent<T = unknown, K = unknown> extends FormFieldContr
|
|
|
135
135
|
readonly requiredInput: _angular_core.InputSignal<boolean>;
|
|
136
136
|
/** Reserved for control identification (e.g. analytics, future native-submission parity). The transfer has no single native value element, so it is not currently reflected to the DOM. Defaults to `undefined`. */
|
|
137
137
|
readonly name: _angular_core.InputSignal<string | undefined>;
|
|
138
|
-
/** Id on the host element. Auto-generated as `tw-transfer-N` when unset. Used by the form-field's `<label for>` association. */
|
|
138
|
+
/** Id on the host element. Auto-generated as `tw-transfer-N` when unset. Used by the form-field's `<label for>` association. Alias: `id`. */
|
|
139
139
|
readonly idInput: _angular_core.InputSignal<string | undefined>;
|
|
140
140
|
/** Accessible name applied to the control when no visible label is wired. Mirrored to `aria-label`. Defaults to `undefined`. */
|
|
141
141
|
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
142
142
|
/** ID of an external element that labels the control. Mirrored to `aria-labelledby`. Defaults to `undefined`. */
|
|
143
143
|
readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
|
|
144
|
-
/** ID of an external element that describes the control. The form-field merges its hint / error ids alongside. Defaults to `undefined`. */
|
|
144
|
+
/** ID of an external element that describes the control. The form-field merges its hint / error ids alongside. Defaults to `undefined`. Alias: `aria-describedby`. */
|
|
145
145
|
readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
|
|
146
146
|
/** Per-instance override of the {@link ErrorStateMatcher}. When omitted, uses the `TW_ERROR_STATE_MATCHER` token's value. Defaults to `undefined`. */
|
|
147
147
|
readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
|
|
@@ -157,9 +157,6 @@ declare class TransferComponent<T = unknown, K = unknown> extends FormFieldContr
|
|
|
157
157
|
private readonly focusMonitor;
|
|
158
158
|
private readonly liveAnnouncer;
|
|
159
159
|
private readonly ngControl;
|
|
160
|
-
private readonly parentForm;
|
|
161
|
-
private readonly parentFormGroup;
|
|
162
|
-
private readonly defaultMatcher;
|
|
163
160
|
private readonly platform;
|
|
164
161
|
private readonly uid;
|
|
165
162
|
/** @internal Fallback id used when the consumer does not set `[id]`. */
|
|
@@ -173,16 +170,32 @@ declare class TransferComponent<T = unknown, K = unknown> extends FormFieldContr
|
|
|
173
170
|
private readonly targetQuery;
|
|
174
171
|
private readonly cvaDisabled;
|
|
175
172
|
private readonly _focused;
|
|
176
|
-
|
|
177
|
-
private readonly
|
|
173
|
+
/** @internal Shared `errorState` / `required` / `errors` derivation — see `wireErrorState`. */
|
|
174
|
+
private readonly errorWiring;
|
|
178
175
|
private readonly describedByIdsSignal;
|
|
179
176
|
private readonly labelledByIdsSignal;
|
|
180
177
|
private onChange;
|
|
181
178
|
private onTouched;
|
|
182
179
|
/** @internal Stable comparator for `[cdkListboxCompareWith]`. Keys are identity-comparable. */
|
|
183
180
|
readonly compareKeys: (a: K, b: K) => boolean;
|
|
184
|
-
/**
|
|
181
|
+
/**
|
|
182
|
+
* @internal Resolved label record.
|
|
183
|
+
*
|
|
184
|
+
* Explicitly-undefined keys are dropped before merging. Root `tsconfig.json`
|
|
185
|
+
* does not set `exactOptionalPropertyTypes`, so
|
|
186
|
+
* `[labels]="{ moveAnnouncement: i18n.moved }"` type-checks even when the
|
|
187
|
+
* i18n bundle has no such key — and a plain spread would then overwrite the
|
|
188
|
+
* default with `undefined`, which reaches `formatLabel()` and throws
|
|
189
|
+
* `Cannot read properties of undefined (reading 'replace')`. Same filter
|
|
190
|
+
* `table.ts` and `timeline.ts` already use; the `Required<>` annotation only
|
|
191
|
+
* tells the truth once the filter is in place.
|
|
192
|
+
*/
|
|
185
193
|
readonly resolvedLabels: Signal<Required<TwTransferLabels>>;
|
|
194
|
+
/**
|
|
195
|
+
* @internal Resolved display config. Same explicitly-undefined filter as
|
|
196
|
+
* `resolvedLabels` — a plain spread let `[display]="{ listHeight: undefined }"`
|
|
197
|
+
* reach the list's inline `height` as `undefined`, collapsing the panes.
|
|
198
|
+
*/
|
|
186
199
|
private readonly resolvedDisplay;
|
|
187
200
|
private readonly resolvedBehavior;
|
|
188
201
|
/** @internal */
|
|
@@ -108,6 +108,11 @@ declare class TreeComponent<T = unknown> {
|
|
|
108
108
|
readonly spacerClasses: _angular_core.Signal<string>;
|
|
109
109
|
readonly contentClasses: _angular_core.Signal<string>;
|
|
110
110
|
constructor();
|
|
111
|
+
/**
|
|
112
|
+
* @internal Drives CDK's expansion model to match `wanted`. Idempotent — every
|
|
113
|
+
* node is compared against `tree.isExpanded` before being touched.
|
|
114
|
+
*/
|
|
115
|
+
private applyExpansion;
|
|
111
116
|
/** @internal Resolves a node's identity key via `trackBy`, falling back to the node itself. */
|
|
112
117
|
private keyOf;
|
|
113
118
|
/** @internal Direct children of a node (always a fresh mutable array). */
|
|
@@ -177,7 +182,7 @@ declare class TreeComponent<T = unknown> {
|
|
|
177
182
|
/** Attribute directive (`[twTreeNodeToggle]="node"`) that toggles the given node's expansion on click. */
|
|
178
183
|
declare class TreeNodeToggleDirective<T = unknown> {
|
|
179
184
|
private readonly tree;
|
|
180
|
-
/** The node whose expansion this control toggles. */
|
|
185
|
+
/** The node whose expansion this control toggles. Alias: `twTreeNodeToggle`. */
|
|
181
186
|
readonly node: _angular_core.InputSignal<T>;
|
|
182
187
|
/** @internal Toggles the node and stops the click from bubbling to row activation. */
|
|
183
188
|
onClick(event: Event): void;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs","sources":["../../../projects/ngx-tw/sheet/sheet-container.ts","../../../projects/ngx-tw/sheet/sheet-renderer.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n type EventEmitter,\n inject,\n type Signal,\n ViewEncapsulation,\n computed,\n} from '@angular/core';\nimport { CdkDialogContainer } from '@angular/cdk/dialog';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n coerceOverlayDuration,\n mergeOverlayPanelClass,\n OverlayContainerCoordinator,\n type OverlayContainerAnimationEvent,\n type OverlayContainerState,\n} from '@cdevhub/ngx-tw/core';\nimport { tv } from 'tailwind-variants';\nimport { type SheetConfig } from './sheet-config';\n\n/** Lifecycle states a sheet passes through. */\nexport type SheetState = OverlayContainerState;\n\n/** Event emitted when the sheet's animation state transitions. */\nexport type SheetAnimationEvent = OverlayContainerAnimationEvent;\n\n// Sheet uses a `data-[state]` + `data-[side]` driven CSS transition rather than\n// the project's `animate.enter`/`animate.leave` keyframes. Same rationale as\n// the dialog container (see `dialog-container.ts`):\n// 1. The ref owns the open/close lifecycle (state signal, observables) and\n// needs runtime-configurable enter/exit durations per `Sheet.open()` call\n// — `animate.enter` only accepts a static class name.\n// 2. The transform direction depends on `side`, and encoding four pairs of\n// keyframe classes (slide-in/out × 4 sides) is noisier than four\n// `data-[side=…]` selectors on a single transition rule.\n// All other library overlays (popover, menu, tooltip) use animate.enter/leave;\n// this divergence is intentional and isolated to the sheet container.\nconst sheetContainerVariants = tv(\n {\n slots: {\n host: 'fixed flex flex-col outline-none bg-surface-raised text-fg shadow-md overflow-hidden transition-[transform,opacity] ease-out motion-reduce:transition-none opacity-0 data-[state=open]:opacity-100',\n },\n variants: {\n side: {\n right: {\n host: 'h-screen right-0 top-0 border-l border-border data-[state=opening]:translate-x-full data-[state=closing]:translate-x-full data-[state=open]:translate-x-0',\n },\n left: {\n host: 'h-screen left-0 top-0 border-r border-border data-[state=opening]:-translate-x-full data-[state=closing]:-translate-x-full data-[state=open]:translate-x-0',\n },\n top: {\n host: 'w-screen left-0 top-0 border-b border-border data-[state=opening]:-translate-y-full data-[state=closing]:-translate-y-full data-[state=open]:translate-y-0',\n },\n bottom: {\n host: 'w-screen left-0 bottom-0 border-t border-border data-[state=opening]:translate-y-full data-[state=closing]:translate-y-full data-[state=open]:translate-y-0',\n },\n },\n size: {\n xs: { host: '' },\n sm: { host: '' },\n md: { host: '' },\n lg: { host: '' },\n xl: { host: '' },\n full: { host: '' },\n },\n },\n // Sheets are axis-aware: `size` controls width on horizontal sides and\n // height on vertical sides. Encoded as compound variants so a single\n // {side, size} pair resolves to one set of utility classes.\n compoundVariants: [\n // ── Right-anchored ─────────────────────────────────────────────\n { side: 'right', size: 'xs', class: { host: 'w-full max-w-xs' } },\n { side: 'right', size: 'sm', class: { host: 'w-full max-w-sm' } },\n { side: 'right', size: 'md', class: { host: 'w-full max-w-md' } },\n { side: 'right', size: 'lg', class: { host: 'w-full max-w-xl' } },\n { side: 'right', size: 'xl', class: { host: 'w-full max-w-2xl' } },\n { side: 'right', size: 'full', class: { host: 'w-screen max-w-none' } },\n // ── Left-anchored ──────────────────────────────────────────────\n { side: 'left', size: 'xs', class: { host: 'w-full max-w-xs' } },\n { side: 'left', size: 'sm', class: { host: 'w-full max-w-sm' } },\n { side: 'left', size: 'md', class: { host: 'w-full max-w-md' } },\n { side: 'left', size: 'lg', class: { host: 'w-full max-w-xl' } },\n { side: 'left', size: 'xl', class: { host: 'w-full max-w-2xl' } },\n { side: 'left', size: 'full', class: { host: 'w-screen max-w-none' } },\n // ── Top-anchored ───────────────────────────────────────────────\n { side: 'top', size: 'xs', class: { host: 'h-[20vh]' } },\n { side: 'top', size: 'sm', class: { host: 'h-[33vh]' } },\n { side: 'top', size: 'md', class: { host: 'h-[50vh]' } },\n { side: 'top', size: 'lg', class: { host: 'h-[66vh]' } },\n { side: 'top', size: 'xl', class: { host: 'h-[80vh]' } },\n { side: 'top', size: 'full', class: { host: 'h-screen' } },\n // ── Bottom-anchored ────────────────────────────────────────────\n { side: 'bottom', size: 'xs', class: { host: 'h-[20vh]' } },\n { side: 'bottom', size: 'sm', class: { host: 'h-[33vh]' } },\n { side: 'bottom', size: 'md', class: { host: 'h-[50vh]' } },\n { side: 'bottom', size: 'lg', class: { host: 'h-[66vh]' } },\n { side: 'bottom', size: 'xl', class: { host: 'h-[80vh]' } },\n { side: 'bottom', size: 'full', class: { host: 'h-screen' } },\n ],\n defaultVariants: { side: 'right', size: 'md' },\n },\n { twMerge: true },\n);\n\n/**\n * Sheet container rendered inside the CDK overlay. Wraps the user-provided\n * content in a Tailwind-styled, edge-anchored surface and coordinates slide\n * enter/exit transitions with {@link SheetRef}.\n *\n * The animation state machine, `aria-describedby` queue, and panel-class\n * merge are shared with `DialogContainer` via {@link OverlayContainerCoordinator}\n * (component-scoped — see `providers: [OverlayContainerCoordinator]`).\n *\n * @docs-private\n */\n@Component({\n selector: 'tw-sheet-container',\n template: '<ng-template cdkPortalOutlet />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CdkPortalOutlet],\n providers: [OverlayContainerCoordinator],\n host: {\n tabindex: '-1',\n '[attr.id]': '_config.id || null',\n '[attr.role]': '_config.role',\n '[attr.aria-modal]': '_config.ariaModal',\n '[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledByQueue[0]',\n '[attr.aria-label]': '_config.ariaLabel',\n '[attr.aria-describedby]': 'ariaDescribedByAttr()',\n '[attr.data-state]': 'state()',\n '[attr.data-side]': 'sideAttr()',\n '[class]': 'hostClasses()',\n '[style.transition-duration.ms]': 'transitionDuration()',\n },\n})\nexport class SheetContainer extends CdkDialogContainer<SheetConfig> {\n private readonly coordinator = inject(OverlayContainerCoordinator);\n\n /** Lifecycle state of the sheet's enter/exit animation. */\n readonly state: Signal<SheetState> = this.coordinator.state;\n\n /** Emits whenever the animation state transitions. */\n readonly animationStateChanged: EventEmitter<SheetAnimationEvent> =\n this.coordinator.animationStateChanged;\n\n /** Resolved enter-animation duration in ms. */\n readonly enterAnimationDuration: number;\n /** Resolved exit-animation duration in ms. */\n readonly exitAnimationDuration: number;\n\n protected readonly sideAttr = computed(() => this._config.side ?? 'right');\n\n private readonly variants = computed(() => {\n const side = this._config.side ?? 'right';\n const size = this._config.size ?? 'md';\n return sheetContainerVariants({ side, size });\n });\n\n protected readonly hostClasses = computed(() =>\n mergeOverlayPanelClass(this.variants().host(), this._config.panelClass),\n );\n\n protected readonly ariaDescribedByAttr = computed(\n () =>\n this._config.ariaDescribedBy ||\n this.coordinator.describedByIds()[0] ||\n null,\n );\n\n protected readonly transitionDuration = this.coordinator.transitionDuration;\n\n constructor() {\n super();\n this.enterAnimationDuration = coerceOverlayDuration(this._config.enterAnimationDuration, 200);\n this.exitAnimationDuration = coerceOverlayDuration(this._config.exitAnimationDuration, 160);\n this.coordinator.setDurations(this.enterAnimationDuration, this.exitAnimationDuration);\n }\n\n protected override _contentAttached(): void {\n super._contentAttached();\n this.coordinator.startEnterAnimation();\n }\n\n /** Triggered by the sheet ref to play the exit transition before disposing the overlay. */\n _startExitAnimation(): void {\n this.coordinator.startExitAnimation();\n }\n\n /** Registers a description id for the container's `aria-describedby`. */\n _addAriaDescribedBy(id: string): void {\n this.coordinator.addAriaDescribedBy(id);\n }\n\n /** Removes a previously registered description id. */\n _removeAriaDescribedBy(id: string): void {\n this.coordinator.removeAriaDescribedBy(id);\n }\n}\n","import {\n type ComponentRef,\n type Injector,\n type StaticProvider,\n type TemplateRef,\n} from '@angular/core';\nimport { Dialog, DialogConfig as CdkDialogConfig } from '@angular/cdk/dialog';\nimport {\n createBlockScrollStrategy,\n createCloseScrollStrategy,\n createGlobalPositionStrategy,\n createNoopScrollStrategy,\n createRepositionScrollStrategy,\n type GlobalPositionStrategy,\n type ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport type { ComponentType } from '@angular/cdk/portal';\nimport {\n SHEET_DATA,\n SheetConfig,\n type SheetScrollStrategy,\n type SheetSide,\n} from './sheet-config';\nimport { SheetContainer } from './sheet-container';\nimport { SheetRef } from './sheet-ref';\n\n/**\n * Rendering half of the sheet feature: the only module that pulls in\n * `@angular/cdk/dialog`, the overlay position/scroll strategies, and the\n * Tailwind `SheetContainer`. Reached exclusively through a dynamic `import()`\n * in {@link Sheet}, which keeps that graph out of a consumer's initial bundle.\n * Nothing here may be imported as a value from `sheet.ts`.\n *\n * @docs-private\n */\nexport function openRenderedSheet<R, D, C>(\n injector: Injector,\n content: ComponentType<C> | TemplateRef<C>,\n merged: SheetConfig<D, R>,\n sheetRef: SheetRef<R, C>,\n): void {\n // `Dialog` is `providedIn: 'root'`, so resolving it here — rather than\n // injecting it into the service — keeps the CDK symbol in this lazy chunk.\n const cdkDialog = injector.get(Dialog);\n\n const cdkRef = cdkDialog.open<R, D, C>(content, {\n id: merged.id,\n role: merged.role,\n data: merged.data,\n panelClass: merged.panelClass,\n backdropClass: merged.backdropClass || 'tw-sheet-backdrop',\n hasBackdrop: merged.hasBackdrop,\n // Sheet sizing happens on the container element (axis-aware width/height\n // utilities). The overlay pane itself is the full-edge bounding box.\n direction: merged.direction,\n ariaDescribedBy: merged.ariaDescribedBy,\n ariaLabelledBy: merged.ariaLabelledBy,\n ariaLabel: merged.ariaLabel,\n ariaModal: merged.ariaModal,\n autoFocus: merged.autoFocus,\n restoreFocus: merged.restoreFocus,\n scrollStrategy:\n merged.scrollStrategy ?? resolveScrollStrategy(injector, merged.scrollBehavior),\n positionStrategy:\n merged.positionStrategy ?? resolvePositionStrategy(injector, merged.side ?? 'right'),\n closeOnNavigation: merged.closeOnNavigation,\n viewContainerRef: merged.viewContainerRef,\n injector: merged.injector,\n // We handle close/Escape/backdrop ourselves so we can run the exit slide animation.\n disableClose: true,\n closeOnOverlayDetachments: false,\n container: {\n type: SheetContainer,\n providers: () => [\n { provide: SheetConfig, useValue: merged },\n { provide: CdkDialogConfig, useValue: merged },\n ],\n },\n providers: (cdkRef, _cdkConfig, container) => {\n sheetRef._attach(cdkRef, container as SheetContainer);\n const providers: StaticProvider[] = [\n { provide: SheetRef, useValue: sheetRef },\n { provide: SHEET_DATA, useValue: merged.data ?? null },\n ];\n if (Array.isArray(merged.providers)) providers.push(...merged.providers);\n return providers;\n },\n });\n\n sheetRef._setComponent(\n cdkRef.componentInstance as C | null,\n cdkRef.componentRef as ComponentRef<C> | null,\n );\n}\n\nfunction resolveScrollStrategy(\n injector: Injector,\n strategy: SheetScrollStrategy | undefined,\n): ScrollStrategy {\n switch (strategy) {\n case 'close':\n return createCloseScrollStrategy(injector);\n case 'reposition':\n return createRepositionScrollStrategy(injector);\n case 'noop':\n return createNoopScrollStrategy();\n case 'block':\n default:\n return createBlockScrollStrategy(injector);\n }\n}\n\nfunction resolvePositionStrategy(injector: Injector, side: SheetSide): GlobalPositionStrategy {\n const strategy = createGlobalPositionStrategy(injector);\n switch (side) {\n case 'left':\n return strategy.top('0').left('0').bottom('0');\n case 'top':\n return strategy.top('0').left('0').right('0');\n case 'bottom':\n return strategy.bottom('0').left('0').right('0');\n case 'right':\n default:\n return strategy.top('0').right('0').bottom('0');\n }\n}\n"],"names":["CdkDialogConfig"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs","sources":["../../../projects/ngx-tw/toast/toast-container.ts","../../../projects/ngx-tw/toast/toast-renderer.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n type ComponentRef,\n Component,\n computed,\n ElementRef,\n Injector,\n TemplateRef,\n ViewEncapsulation,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n CdkPortalOutlet,\n type CdkPortalOutletAttachedRef,\n} from '@angular/cdk/portal';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ToastActionDirective, ToastComponent } from './toast-component';\nimport {\n TW_TOAST_DATA,\n TW_TOAST_REF,\n type ToastPosition,\n type ToastTemplateContext,\n} from './toast-config';\nimport type { ToastRef } from './toast-ref';\n\ntype ToastKind = 'string' | 'template' | 'component';\n\ninterface Entry {\n ref: ToastRef;\n kind: ToastKind;\n enterClass: string;\n leaveClass: string;\n}\n\nconst POSITION_AXIS: Record<ToastPosition, 'right' | 'left' | 'top' | 'bottom'> = {\n 'top-right': 'right',\n 'bottom-right': 'right',\n 'top-left': 'left',\n 'bottom-left': 'left',\n 'top-center': 'top',\n 'bottom-center': 'bottom',\n};\n\nconst POSITION_HOST_CLASSES: Record<ToastPosition, string> = {\n 'top-right': 'items-end',\n 'bottom-right': 'items-end',\n 'top-left': 'items-start',\n 'bottom-left': 'items-start',\n 'top-center': 'items-center',\n 'bottom-center': 'items-center',\n};\n\nconst POSITION_ORDER_REVERSED: Record<ToastPosition, boolean> = {\n 'top-right': false,\n 'top-left': false,\n 'top-center': false,\n 'bottom-right': true,\n 'bottom-left': true,\n 'bottom-center': true,\n};\n\nconst SWIPE_DISMISS_FRACTION = 0.4;\nconst SWIPE_MAX_OPACITY_FADE = 0.6;\n\n/**\n * Internal flex-column host rendered inside each per-position CDK overlay.\n * Stacks visible toasts via `@for`, wires pause-on-interaction, Escape\n * dismissal, swipe gestures, and `LiveAnnouncer` announcements.\n *\n * @docs-private\n */\n@Component({\n selector: 'tw-toast-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, CdkPortalOutlet, ToastComponent, ToastActionDirective],\n host: {\n role: 'region',\n '[class]': 'hostClasses()',\n '[attr.aria-label]': 'regionLabel()',\n '[attr.data-position]': 'position()',\n },\n template: `\n @for (entry of orderedEntries(); track entry.ref.id) {\n <!-- Toast entry wrapper; the projected <tw-toast> is the focusable affordance.\n This element only forwards pointer/focus events so the container can\n pause auto-dismiss while the user is interacting. -->\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"pointer-events-auto w-full max-w-sm\"\n [attr.data-toast-id]=\"entry.ref.id\"\n [style.transform]=\"entry.ref.swipeTransform() || null\"\n [style.opacity]=\"entry.ref.swipeOpacity() ?? null\"\n [style.touch-action]=\"'pan-y'\"\n [animate.enter]=\"entry.enterClass\"\n [animate.leave]=\"entry.ref.leaveAnimationOverride() ?? entry.leaveClass\"\n (pointerenter)=\"onPointerEnter(entry.ref)\"\n (pointerleave)=\"onPointerLeave(entry.ref)\"\n (focusin)=\"onFocusIn(entry.ref)\"\n (focusout)=\"onFocusOut(entry.ref, $event)\"\n (keydown.escape)=\"onEscape(entry.ref, $event)\"\n (pointerdown)=\"onSwipeStart(entry.ref, $event, swipeEl)\"\n #swipeEl\n >\n @switch (entry.kind) {\n @case ('string') {\n <tw-toast\n [severity]=\"entry.ref.severity()\"\n [dismissible]=\"entry.ref.dismissible()\"\n [icon]=\"entry.ref.icon()\"\n [ariaLabel]=\"entry.ref.ariaLabel()\"\n [class]=\"panelClassFor(entry.ref)\"\n (dismissed)=\"entry.ref._dismissWith('manual')\"\n (actionClicked)=\"entry.ref.triggerAction()\"\n >\n {{ asString(entry.ref.content()) }}\n @if (entry.ref.action(); as action) {\n <button twToastAction>{{ action.label }}</button>\n }\n </tw-toast>\n }\n @case ('template') {\n <tw-toast\n [severity]=\"entry.ref.severity()\"\n [dismissible]=\"entry.ref.dismissible()\"\n [icon]=\"entry.ref.icon()\"\n [ariaLabel]=\"entry.ref.ariaLabel()\"\n [class]=\"panelClassFor(entry.ref)\"\n (dismissed)=\"entry.ref._dismissWith('manual')\"\n (actionClicked)=\"entry.ref.triggerAction()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"asTemplate(entry.ref.content())\"\n [ngTemplateOutletContext]=\"templateContext(entry.ref)\"\n />\n @if (entry.ref.action(); as action) {\n <button twToastAction>{{ action.label }}</button>\n }\n </tw-toast>\n }\n @case ('component') {\n <ng-template\n [cdkPortalOutlet]=\"entry.ref._portal\"\n (attached)=\"onPortalAttached(entry.ref, $event)\"\n />\n }\n }\n </div>\n }\n `,\n})\nexport class ToastContainerComponent {\n /** Per-position stacking anchor. Mutated from {@link ToastService} via `.instance.position.set(...)`. */\n readonly position = signal<ToastPosition>('bottom-right');\n\n /** Accessible label applied to the `role=\"region\"` host. Mutated from the service on init. */\n readonly regionLabel = signal<string>('Notifications');\n\n /**\n * Toasts currently assigned to this container. The service pushes toasts\n * into this signal; the container filters by state to drive `animate.leave`.\n */\n readonly visibleRefs = signal<readonly ToastRef[]>([]);\n\n private readonly injector = inject(Injector);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly host = inject(ElementRef<HTMLElement>);\n\n private readonly swipeSessions = new WeakMap<\n ToastRef,\n { pointerId: number; startX: number; width: number; active: boolean }\n >();\n\n private readonly entries = computed<readonly Entry[]>(() => {\n const pos = this.position();\n const axis = POSITION_AXIS[pos];\n const enter = `toast-enter-${axis}`;\n const leave = `toast-leave-${axis}`;\n const refs = this.visibleRefs().filter((ref) => {\n const s = ref.state();\n return s === 'entering' || s === 'visible' || s === 'paused';\n });\n return refs.map((ref) => ({\n ref,\n kind: resolveKind(ref.content()),\n enterClass: enter,\n leaveClass: leave,\n }));\n });\n\n protected readonly orderedEntries = computed(() => {\n const list = this.entries();\n return POSITION_ORDER_REVERSED[this.position()] ? [...list].reverse() : list;\n });\n\n protected readonly hostClasses = computed(() => {\n const base = 'flex flex-col gap-2 w-full max-w-sm';\n const align = POSITION_HOST_CLASSES[this.position()];\n return `${base} ${align}`;\n });\n\n /** @internal Called by the service right after attaching a new toast. Runs `LiveAnnouncer`. */\n _announceOpen(ref: ToastRef): void {\n const politeness = this.resolvePoliteness(ref);\n if (politeness === 'off') return;\n const msg = this.resolveAnnouncementText(ref);\n if (msg) this.liveAnnouncer.announce(msg, politeness);\n }\n\n /** @internal Called by the service when `ref.update()` fires — re-announces with the new severity / content. */\n _announceUpdate(ref: ToastRef): void {\n this._announceOpen(ref);\n }\n\n /** @internal Captures the component instance after `cdkPortalOutlet` attaches. */\n protected onPortalAttached(ref: ToastRef, attached: CdkPortalOutletAttachedRef): void {\n if (attached && 'instance' in attached) {\n ref.componentInstance = (attached as ComponentRef<unknown>).instance;\n }\n }\n\n /** @internal Injector factory for component-class content. Provides `TW_TOAST_DATA` + `TW_TOAST_REF`. */\n _createContentInjector(ref: ToastRef): Injector {\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: TW_TOAST_REF, useValue: ref },\n { provide: TW_TOAST_DATA, useValue: ref.data() },\n ],\n });\n }\n\n // ── Template helpers ──\n\n protected asString(content: unknown): string {\n return typeof content === 'string' ? content : '';\n }\n\n protected asTemplate(content: unknown): TemplateRef<ToastTemplateContext> | null {\n return content instanceof TemplateRef ? (content as TemplateRef<ToastTemplateContext>) : null;\n }\n\n protected templateContext(ref: ToastRef): ToastTemplateContext {\n return { $implicit: ref.data() as never, ref };\n }\n\n protected panelClassFor(ref: ToastRef): string {\n const raw = ref.config.panelClass;\n if (!raw) return '';\n return Array.isArray(raw) ? raw.join(' ') : raw;\n }\n\n // ── Interaction handlers ──\n\n protected onPointerEnter(ref: ToastRef): void {\n ref._setHovered(true);\n }\n\n protected onPointerLeave(ref: ToastRef): void {\n ref._setHovered(false);\n }\n\n protected onFocusIn(ref: ToastRef): void {\n ref._setFocused(true);\n }\n\n protected onFocusOut(ref: ToastRef, event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n const target = event.currentTarget as Node | null;\n if (related && target && target.contains(related)) return;\n ref._setFocused(false);\n }\n\n protected onEscape(ref: ToastRef, event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n ref._dismissWith('manual');\n }\n\n protected onSwipeStart(ref: ToastRef, event: PointerEvent, el: HTMLElement): void {\n if (!ref.config.swipeToDismiss) return;\n if (event.button !== 0) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('button, a, input, select, textarea, [role=\"button\"]')) return;\n\n const width = el.getBoundingClientRect().width;\n this.swipeSessions.set(ref, {\n pointerId: event.pointerId,\n startX: event.clientX,\n width,\n active: false,\n });\n el.setPointerCapture(event.pointerId);\n\n const onMove = (e: PointerEvent) => this.onSwipeMove(ref, e, el);\n const onUp = (e: PointerEvent) => this.onSwipeEnd(ref, e, el, onMove, onUp);\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerup', onUp);\n el.addEventListener('pointercancel', onUp);\n }\n\n private onSwipeMove(ref: ToastRef, event: PointerEvent, _el: HTMLElement): void {\n const session = this.swipeSessions.get(ref);\n if (!session || event.pointerId !== session.pointerId) return;\n const dx = event.clientX - session.startX;\n if (!session.active && Math.abs(dx) < 6) return;\n session.active = true;\n ref.swipeTransform.set(`translate3d(${dx}px, 0, 0)`);\n const fade = 1 - Math.min(Math.abs(dx) / session.width, 1) * SWIPE_MAX_OPACITY_FADE;\n ref.swipeOpacity.set(fade);\n }\n\n private onSwipeEnd(\n ref: ToastRef,\n event: PointerEvent,\n el: HTMLElement,\n onMove: (e: PointerEvent) => void,\n onUp: (e: PointerEvent) => void,\n ): void {\n const session = this.swipeSessions.get(ref);\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerup', onUp);\n el.removeEventListener('pointercancel', onUp);\n if (!session || event.pointerId !== session.pointerId) return;\n try {\n el.releasePointerCapture(session.pointerId);\n } catch {\n /* no-op */\n }\n this.swipeSessions.delete(ref);\n\n if (!session.active) return;\n const dx = event.clientX - session.startX;\n const threshold = session.width * SWIPE_DISMISS_FRACTION;\n const allowed = this.swipeDirectionAllowed(dx);\n if (Math.abs(dx) >= threshold && allowed) {\n untracked(() => {\n ref.swipeTransform.set(`translate3d(${Math.sign(dx) * session.width * 1.2}px, 0, 0)`);\n ref.swipeOpacity.set(0);\n ref.leaveAnimationOverride.set('fade-out');\n });\n ref._dismissWith('swipe');\n } else {\n ref.swipeTransform.set(null);\n ref.swipeOpacity.set(null);\n }\n }\n\n private swipeDirectionAllowed(dx: number): boolean {\n const pos = this.position();\n if (pos === 'top-right' || pos === 'bottom-right') return dx > 0;\n if (pos === 'top-left' || pos === 'bottom-left') return dx < 0;\n return true;\n }\n\n private resolvePoliteness(ref: ToastRef): 'polite' | 'assertive' | 'off' {\n if (ref.config.politeness) return ref.config.politeness;\n return ref.severity() === 'error' ? 'assertive' : 'polite';\n }\n\n private resolveAnnouncementText(ref: ToastRef): string {\n const explicit = ref.ariaLabel();\n if (explicit) return explicit;\n const content = ref.content();\n if (typeof content === 'string') return content;\n const host = this.host.nativeElement.querySelector(\n `[data-toast-id=\"${ref.id}\"]`,\n ) as HTMLElement | null;\n if (host) return host.textContent?.trim() ?? '';\n return this.host.nativeElement.textContent?.trim() ?? '';\n }\n}\n\nfunction resolveKind(content: unknown): ToastKind {\n if (typeof content === 'string') return 'string';\n if (content instanceof TemplateRef) return 'template';\n return 'component';\n}\n\n","import { type ComponentRef, type Injector, TemplateRef, type Type } from '@angular/core';\nimport {\n createGlobalPositionStrategy,\n Overlay,\n type OverlayRef,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { type ToastPosition } from './toast-config';\nimport { ToastContainerComponent } from './toast-container';\nimport type { ToastRef } from './toast-ref';\n\nconst OVERLAY_EDGE_OFFSET = '1rem';\n\ninterface PositionOverlay {\n overlayRef: OverlayRef;\n containerRef: ComponentRef<ToastContainerComponent>;\n}\n\n/**\n * Rendering half of the toast feature: owns the CDK overlays, the per-position\n * {@link ToastContainerComponent} instances, and every `LiveAnnouncer` call.\n *\n * This module is reached only through a dynamic `import()` in `ToastService`,\n * which is what keeps `@angular/cdk/overlay`, the toast components, and\n * `tailwind-variants` out of a consumer's initial bundle. Nothing here may be\n * imported statically from `toast.ts` — a value import (as opposed to a\n * `import type`) would pull the whole graph back into the eager chunk and\n * silently undo the split. See `toast.spec.ts` for the guard test.\n *\n * @docs-private\n */\nexport class ToastRenderer {\n private readonly overlay: Overlay;\n private readonly positionOverlays = new Map<ToastPosition, PositionOverlay>();\n private disposed = false;\n\n constructor(\n private readonly injector: Injector,\n private readonly regionAriaLabel: string,\n ) {\n // Resolved here rather than injected into `ToastService`, so the `Overlay`\n // symbol lives in this lazily-loaded chunk. It is `providedIn: 'root'`, so\n // no eager provider is required.\n this.overlay = injector.get(Overlay);\n }\n\n /**\n * Render a toast into its position container, creating the overlay on first\n * use. Returns `false` if the renderer has already been disposed.\n */\n attach(ref: ToastRef, position: ToastPosition): boolean {\n if (this.disposed) return false;\n const entry = this.getContainerForPosition(position);\n const instance = entry.containerRef.instance;\n\n // Component-class content needs an injector built from the container, so\n // the portal cannot be created until the container exists.\n const content = ref.content();\n if (isComponentConstructor(content)) {\n ref._portal = new ComponentPortal(content, null, instance._createContentInjector(ref));\n }\n\n instance.visibleRefs.update((list) => [...list, ref]);\n ref._overlayPanelElement = entry.overlayRef.overlayElement;\n return true;\n }\n\n /** Announce a freshly attached toast to assistive technology. */\n announceOpen(ref: ToastRef): void {\n this.containerFor(ref)?._announceOpen(ref);\n }\n\n /** Re-announce a toast whose content or severity changed via `update()`. */\n announceUpdate(ref: ToastRef): void {\n this.containerFor(ref)?._announceUpdate(ref);\n }\n\n /** Drop a dismissed toast from its container's render list. */\n detach(ref: ToastRef): void {\n const instance = this.containerFor(ref);\n if (!instance) return;\n instance.visibleRefs.update((list) => list.filter((r) => r !== ref));\n }\n\n /** Tear down every overlay this renderer created. */\n dispose(): void {\n this.disposed = true;\n for (const { overlayRef } of this.positionOverlays.values()) {\n overlayRef.dispose();\n }\n this.positionOverlays.clear();\n }\n\n private containerFor(ref: ToastRef): ToastContainerComponent | undefined {\n return this.positionOverlays.get(ref.config.position ?? 'bottom-right')?.containerRef\n .instance;\n }\n\n private getContainerForPosition(position: ToastPosition): PositionOverlay {\n const existing = this.positionOverlays.get(position);\n if (existing) return existing;\n\n const overlayRef = this.overlay.create({\n positionStrategy: this.buildPositionStrategy(position),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: ['tw-toast-overlay', `tw-toast-overlay-${position}`],\n });\n\n const containerPortal = new ComponentPortal(\n ToastContainerComponent,\n null,\n this.injector,\n );\n const containerRef = overlayRef.attach(containerPortal);\n containerRef.instance.position.set(position);\n containerRef.instance.regionLabel.set(this.regionAriaLabel);\n\n const entry: PositionOverlay = { overlayRef, containerRef };\n this.positionOverlays.set(position, entry);\n return entry;\n }\n\n private buildPositionStrategy(position: ToastPosition) {\n const strategy = createGlobalPositionStrategy(this.injector);\n switch (position) {\n case 'top-right':\n strategy.top(OVERLAY_EDGE_OFFSET).right(OVERLAY_EDGE_OFFSET);\n break;\n case 'top-left':\n strategy.top(OVERLAY_EDGE_OFFSET).left(OVERLAY_EDGE_OFFSET);\n break;\n case 'top-center':\n strategy.top(OVERLAY_EDGE_OFFSET).centerHorizontally();\n break;\n case 'bottom-right':\n strategy.bottom(OVERLAY_EDGE_OFFSET).right(OVERLAY_EDGE_OFFSET);\n break;\n case 'bottom-left':\n strategy.bottom(OVERLAY_EDGE_OFFSET).left(OVERLAY_EDGE_OFFSET);\n break;\n case 'bottom-center':\n strategy.bottom(OVERLAY_EDGE_OFFSET).centerHorizontally();\n break;\n }\n return strategy;\n }\n\n}\n\nfunction isComponentConstructor(value: unknown): value is Type<unknown> {\n return typeof value === 'function' && !(value instanceof TemplateRef);\n}\n"],"names":[],"mappings":";;;;;;;;AAqCA,MAAM,aAAa,GAA+D;AAChF,IAAA,WAAW,EAAE,OAAO;AACpB,IAAA,cAAc,EAAE,OAAO;AACvB,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,eAAe,EAAE,QAAQ;CAC1B;AAED,MAAM,qBAAqB,GAAkC;AAC3D,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,cAAc,EAAE,WAAW;AAC3B,IAAA,UAAU,EAAE,aAAa;AACzB,IAAA,aAAa,EAAE,aAAa;AAC5B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,eAAe,EAAE,cAAc;CAChC;AAED,MAAM,uBAAuB,GAAmC;AAC9D,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,eAAe,EAAE,IAAI;CACtB;AAED,MAAM,sBAAsB,GAAG,GAAG;AAClC,MAAM,sBAAsB,GAAG,GAAG;AAElC;;;;;;AAMG;MAiFU,uBAAuB,CAAA;;IAEzB,QAAQ,GAAG,MAAM,CAAgB,cAAc;iFAAC;;IAGhD,WAAW,GAAG,MAAM,CAAS,eAAe;oFAAC;AAEtD;;;AAGG;IACM,WAAW,GAAG,MAAM,CAAsB,EAAE;oFAAC;AAErC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,IAAI,GAAG,MAAM,EAAC,UAAuB,EAAC;AAEtC,IAAA,aAAa,GAAG,IAAI,OAAO,EAGzC;AAEc,IAAA,OAAO,GAAG,QAAQ,CAAmB,MAAK;AACzD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,CAAA,YAAA,EAAe,IAAI,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,CAAA,YAAA,EAAe,IAAI,EAAE;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC7C,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE;YACrB,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ;AAC9D,QAAA,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;YACxB,GAAG;AACH,YAAA,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;AAChC,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,UAAU,EAAE,KAAK;AAClB,SAAA,CAAC,CAAC;IACL,CAAC;gFAAC;AAEiB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;QAC3B,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI;IAC9E,CAAC;uFAAC;AAEiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,IAAI,GAAG,qCAAqC;QAClD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpD,QAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE;IAC3B,CAAC;oFAAC;;AAGF,IAAA,aAAa,CAAC,GAAa,EAAA;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;QAC9C,IAAI,UAAU,KAAK,KAAK;YAAE;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,GAAG;YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACvD;;AAGA,IAAA,eAAe,CAAC,GAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;IACzB;;IAGU,gBAAgB,CAAC,GAAa,EAAE,QAAoC,EAAA;AAC5E,QAAA,IAAI,QAAQ,IAAI,UAAU,IAAI,QAAQ,EAAE;AACtC,YAAA,GAAG,CAAC,iBAAiB,GAAI,QAAkC,CAAC,QAAQ;QACtE;IACF;;AAGA,IAAA,sBAAsB,CAAC,GAAa,EAAA;QAClC,OAAO,QAAQ,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACxC,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE;AACjD,aAAA;AACF,SAAA,CAAC;IACJ;;AAIU,IAAA,QAAQ,CAAC,OAAgB,EAAA;AACjC,QAAA,OAAO,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,EAAE;IACnD;AAEU,IAAA,UAAU,CAAC,OAAgB,EAAA;QACnC,OAAO,OAAO,YAAY,WAAW,GAAI,OAA6C,GAAG,IAAI;IAC/F;AAEU,IAAA,eAAe,CAAC,GAAa,EAAA;QACrC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAW,EAAE,GAAG,EAAE;IAChD;AAEU,IAAA,aAAa,CAAC,GAAa,EAAA;AACnC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU;AACjC,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;AACnB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG;IACjD;;AAIU,IAAA,cAAc,CAAC,GAAa,EAAA;AACpC,QAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;IACvB;AAEU,IAAA,cAAc,CAAC,GAAa,EAAA;AACpC,QAAA,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;IACxB;AAEU,IAAA,SAAS,CAAC,GAAa,EAAA;AAC/B,QAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;IACvB;IAEU,UAAU,CAAC,GAAa,EAAE,KAAiB,EAAA;AACnD,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,aAA4B;AAClD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;QACjD,IAAI,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE;AACnD,QAAA,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;IACxB;IAEU,QAAQ,CAAC,GAAa,EAAE,KAAY,EAAA;QAC5C,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;IAC5B;AAEU,IAAA,YAAY,CAAC,GAAa,EAAE,KAAmB,EAAE,EAAe,EAAA;AACxE,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc;YAAE;AAChC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;AACxB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,QAAA,IAAI,MAAM,EAAE,OAAO,CAAC,qDAAqD,CAAC;YAAE;QAE5E,MAAM,KAAK,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,KAAK;AAC9C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,KAAK;AACL,YAAA,MAAM,EAAE,KAAK;AACd,SAAA,CAAC;AACF,QAAA,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;AAErC,QAAA,MAAM,MAAM,GAAG,CAAC,CAAe,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,CAAC,CAAe,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC;AAC3E,QAAA,EAAE,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1C,QAAA,EAAE,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC;AACtC,QAAA,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC;IAC5C;AAEQ,IAAA,WAAW,CAAC,GAAa,EAAE,KAAmB,EAAE,GAAgB,EAAA;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;QAC3C,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;YAAE;QACvD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM;AACzC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;YAAE;AACzC,QAAA,OAAO,CAAC,MAAM,GAAG,IAAI;QACrB,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,YAAA,EAAe,EAAE,CAAA,SAAA,CAAW,CAAC;QACpD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,sBAAsB;AACnF,QAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;IAEQ,UAAU,CAChB,GAAa,EACb,KAAmB,EACnB,EAAe,EACf,MAAiC,EACjC,IAA+B,EAAA;QAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3C,QAAA,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC;AAC7C,QAAA,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC;AACzC,QAAA,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;YAAE;AACvD,QAAA,IAAI;AACF,YAAA,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC;QAC7C;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;QAE9B,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE;QACrB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM;AACzC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,sBAAsB;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,IAAI,OAAO,EAAE;YACxC,SAAS,CAAC,MAAK;gBACb,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG,CAAA,SAAA,CAAW,CAAC;AACrF,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACvB,gBAAA,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC;AAC5C,YAAA,CAAC,CAAC;AACF,YAAA,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;QAC3B;aAAO;AACL,YAAA,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,YAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B;IACF;AAEQ,IAAA,qBAAqB,CAAC,EAAU,EAAA;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,cAAc;YAAE,OAAO,EAAE,GAAG,CAAC;AAChE,QAAA,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,EAAE,GAAG,CAAC;AAC9D,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,iBAAiB,CAAC,GAAa,EAAA;AACrC,QAAA,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU;AAAE,YAAA,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU;AACvD,QAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,KAAK,OAAO,GAAG,WAAW,GAAG,QAAQ;IAC5D;AAEQ,IAAA,uBAAuB,CAAC,GAAa,EAAA;AAC3C,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE;AAChC,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;AAC7B,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE;QAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,OAAO;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAChD,mBAAmB,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CACR;AACvB,QAAA,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;AAC/C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;IAC1D;uGA3NW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA1ES,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,wJAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FA4EtE,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhFnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,OAAO,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,CAAC;AAClF,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,mBAAmB,EAAE,eAAe;AACpC,wBAAA,sBAAsB,EAAE,YAAY;AACrC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmET,EAAA,CAAA;AACF,iBAAA;;AA+ND,SAAS,WAAW,CAAC,OAAgB,EAAA;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,QAAA,OAAO,QAAQ;IAChD,IAAI,OAAO,YAAY,WAAW;AAAE,QAAA,OAAO,UAAU;AACrD,IAAA,OAAO,WAAW;AACpB;;ACjXA,MAAM,mBAAmB,GAAG,MAAM;AAOlC;;;;;;;;;;;;AAYG;MACU,aAAa,CAAA;AAML,IAAA,QAAA;AACA,IAAA,eAAA;AANF,IAAA,OAAO;AACP,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAAkC;IACrE,QAAQ,GAAG,KAAK;IAExB,WAAA,CACmB,QAAkB,EAClB,eAAuB,EAAA;QADvB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,eAAe,GAAf,eAAe;;;;QAKhC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;IACtC;AAEA;;;AAGG;IACH,MAAM,CAAC,GAAa,EAAE,QAAuB,EAAA;QAC3C,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC;AACpD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ;;;AAI5C,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE;AAC7B,QAAA,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE;AACnC,YAAA,GAAG,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACxF;AAEA,QAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QACrD,GAAG,CAAC,oBAAoB,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc;AAC1D,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,YAAY,CAAC,GAAa,EAAA;QACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC;IAC5C;;AAGA,IAAA,cAAc,CAAC,GAAa,EAAA;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC;IAC9C;;AAGA,IAAA,MAAM,CAAC,GAAa,EAAA;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IACtE;;IAGA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE;YAC3D,UAAU,CAAC,OAAO,EAAE;QACtB;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;IAC/B;AAEQ,IAAA,YAAY,CAAC,GAAa,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,EAAE;AACtE,aAAA,QAAQ;IACb;AAEQ,IAAA,uBAAuB,CAAC,QAAuB,EAAA;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpD,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;AAE7B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACrC,YAAA,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;YACtD,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACpD,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,UAAU,EAAE,CAAC,kBAAkB,EAAE,CAAA,iBAAA,EAAoB,QAAQ,EAAE,CAAC;AACjE,SAAA,CAAC;AAEF,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,CACzC,uBAAuB,EACvB,IAAI,EACJ,IAAI,CAAC,QAAQ,CACd;QACD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;QACvD,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5C,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;AAE3D,QAAA,MAAM,KAAK,GAAoB,EAAE,UAAU,EAAE,YAAY,EAAE;QAC3D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;AAC1C,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,qBAAqB,CAAC,QAAuB,EAAA;QACnD,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5D,QAAQ,QAAQ;AACd,YAAA,KAAK,WAAW;gBACd,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;gBAC5D;AACF,YAAA,KAAK,UAAU;gBACb,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;gBAC3D;AACF,YAAA,KAAK,YAAY;gBACf,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,kBAAkB,EAAE;gBACtD;AACF,YAAA,KAAK,cAAc;gBACjB,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;gBAC/D;AACF,YAAA,KAAK,aAAa;gBAChB,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;gBAC9D;AACF,YAAA,KAAK,eAAe;gBAClB,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,kBAAkB,EAAE;gBACzD;;AAEJ,QAAA,OAAO,QAAQ;IACjB;AAED;AAED,SAAS,sBAAsB,CAAC,KAAc,EAAA;IAC5C,OAAO,OAAO,KAAK,KAAK,UAAU,IAAI,EAAE,KAAK,YAAY,WAAW,CAAC;AACvE;;;;"}
|