@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.
Files changed (209) hide show
  1. package/README.md +78 -15
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
  5. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
  7. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  8. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
  9. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
  11. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
  13. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
  15. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
  17. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
  19. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
  21. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
  23. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
  25. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
  27. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
  29. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
  35. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
  37. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
  41. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
  43. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
  44. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
  45. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  46. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
  47. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
  48. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
  49. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
  51. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
  53. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
  54. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
  55. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
  57. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
  59. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
  61. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  62. package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
  63. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-item.mjs +28 -4
  65. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
  67. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
  68. package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
  69. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
  71. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
  73. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
  75. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
  77. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
  79. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
  81. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
  83. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
  84. package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
  85. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  86. package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
  87. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
  88. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
  89. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
  90. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
  91. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
  93. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
  95. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
  97. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
  99. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
  101. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  102. package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
  103. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
  105. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
  107. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
  109. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
  111. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
  112. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
  113. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
  115. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  116. package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
  117. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  118. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
  119. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
  120. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
  121. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  122. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
  123. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  124. package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
  125. package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
  126. package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
  127. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  128. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
  129. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  130. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
  131. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
  132. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
  133. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
  134. package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
  135. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
  136. package/index.json +1 -1
  137. package/package.json +63 -2
  138. package/theme/_base.css +13 -0
  139. package/theme/_dark.css +111 -36
  140. package/theme/_high-contrast-dark.css +367 -0
  141. package/theme/_high-contrast.css +13 -2
  142. package/theme/_light.css +332 -0
  143. package/theme/_semantic.css +60 -26
  144. package/theme/_typography.css +17 -0
  145. package/theme/index.css +86 -7
  146. package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
  147. package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
  148. package/types/cdevhub-ngx-tw-button.d.ts +1 -0
  149. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
  150. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
  151. package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
  152. package/types/cdevhub-ngx-tw-card.d.ts +11 -3
  153. package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
  154. package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
  155. package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
  156. package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
  157. package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
  158. package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
  159. package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
  160. package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
  161. package/types/cdevhub-ngx-tw-core.d.ts +152 -21
  162. package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
  163. package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
  164. package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
  165. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
  166. package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
  167. package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
  168. package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
  169. package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
  170. package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
  171. package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
  172. package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
  173. package/types/cdevhub-ngx-tw-input.d.ts +5 -8
  174. package/types/cdevhub-ngx-tw-item.d.ts +2 -0
  175. package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
  176. package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
  177. package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
  178. package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
  179. package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
  180. package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
  181. package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
  182. package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
  183. package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
  184. package/types/cdevhub-ngx-tw-select.d.ts +104 -33
  185. package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
  186. package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
  187. package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
  188. package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
  189. package/types/cdevhub-ngx-tw-split.d.ts +32 -2
  190. package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
  191. package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
  192. package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
  193. package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
  194. package/types/cdevhub-ngx-tw-table.d.ts +53 -10
  195. package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
  196. package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
  197. package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
  198. package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
  199. package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
  200. package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
  201. package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
  202. package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
  203. package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
  204. package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
  205. package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
  206. package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
  207. package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
  208. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
  209. 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
- private readonly _ngControlRev;
177
- private readonly _formSubmitRev;
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
- /** @internal */
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":"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"}