@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
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-calendar-testing.mjs","sources":["../../../projects/ngx-tw/calendar/testing/calendar-cell-harness.ts","../../../projects/ngx-tw/calendar/testing/calendar-harness.ts","../../../projects/ngx-tw/calendar/testing/cdevhub-ngx-tw-calendar-testing.ts"],"sourcesContent":["import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Filters accepted by `CalendarCellHarness.with`. */\nexport interface CalendarCellHarnessFilters extends BaseHarnessFilters {\n /** Match by the cell's visible display text (`1`, `Apr`, `2026`, etc.). */\n text?: string | RegExp;\n /** Match selected / unselected cells. */\n selected?: boolean;\n /** Match disabled / enabled cells. */\n disabled?: boolean;\n}\n\n/** Harness for interacting with a single calendar cell in tests. */\nexport class CalendarCellHarness extends ComponentHarness {\n static hostSelector = '[role=\"gridcell\"]';\n\n private readonly button = this.locatorFor('button');\n\n /** Predicate for `locatorFor` / `locatorForAll`. */\n static with(options: CalendarCellHarnessFilters = {}): HarnessPredicate<CalendarCellHarness> {\n return new HarnessPredicate(CalendarCellHarness, options)\n .addOption('text', options.text, async (h, text) =>\n HarnessPredicate.stringMatches(await h.getText(), text),\n )\n .addOption('selected', options.selected, async (h, selected) => (await h.isSelected()) === selected)\n .addOption('disabled', options.disabled, async (h, disabled) => (await h.isDisabled()) === disabled);\n }\n\n /** The cell's rendered text, trimmed. */\n async getText(): Promise<string> {\n const btn = await this.button();\n return (await btn.text()).trim();\n }\n\n /** The cell's `aria-label`. */\n async getAriaLabel(): Promise<string | null> {\n const btn = await this.button();\n return btn.getAttribute('aria-label');\n }\n\n /** Whether the cell carries `aria-selected=\"true\"`. */\n async isSelected(): Promise<boolean> {\n const btn = await this.button();\n return (await btn.getAttribute('aria-selected')) === 'true';\n }\n\n /** Whether the cell is disabled — true if the button has `disabled` or carries `aria-disabled=\"true\"`. */\n async isDisabled(): Promise<boolean> {\n const btn = await this.button();\n if (await btn.getProperty<boolean>('disabled')) return true;\n return (await btn.getAttribute('aria-disabled')) === 'true';\n }\n\n /** Whether the cell represents today's date (`aria-current=\"date\"`). */\n async isToday(): Promise<boolean> {\n const btn = await this.button();\n return (await btn.getAttribute('aria-current')) === 'date';\n }\n\n /** Click the cell. */\n async select(): Promise<void> {\n const btn = await this.button();\n return btn.click();\n }\n\n /** Dispatches `mouseenter` and `mousemove` on the cell to drive range-hover preview. */\n async hover(): Promise<void> {\n const btn = await this.button();\n await btn.dispatchEvent('mouseenter');\n await btn.dispatchEvent('mousemove');\n }\n\n /** Programmatically focus the cell. */\n async focus(): Promise<void> {\n const btn = await this.button();\n return btn.focus();\n }\n\n /** Whether the cell's button is the active document element. */\n async isFocused(): Promise<boolean> {\n const btn = await this.button();\n return btn.isFocused();\n }\n\n /** Dispatches a `keydown` for `key` on the cell button (e.g. `'ArrowRight'`, `'Enter'`, `' '`, `'PageUp'`). */\n async pressKey(\n key: string,\n modifiers: { shift?: boolean; meta?: boolean; ctrl?: boolean; alt?: boolean } = {},\n ): Promise<void> {\n const btn = await this.button();\n await btn.dispatchEvent('keydown', {\n key,\n bubbles: true,\n cancelable: true,\n shiftKey: !!modifiers.shift,\n metaKey: !!modifiers.meta,\n ctrlKey: !!modifiers.ctrl,\n altKey: !!modifiers.alt,\n });\n }\n}\n","import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\nimport type { BaseHarnessFilters, TestElement } from '@angular/cdk/testing';\nimport { CalendarCellHarness, type CalendarCellHarnessFilters } from './calendar-cell-harness';\n\n/** The available calendar views, mirrored so consumers don't have to import from the library's main entry point. */\nexport type CalendarHarnessView = 'day' | 'month' | 'year';\n\n/** Filters accepted by `CalendarHarness.with`. */\nexport type CalendarHarnessFilters = BaseHarnessFilters;\n\n/** Harness for interacting with a `<tw-calendar>` in tests. */\nexport class CalendarHarness extends ComponentHarness {\n static hostSelector = 'tw-calendar';\n\n private readonly headerNavButtons = this.locatorForAll('tw-calendar-header button');\n private readonly grid = this.locatorFor('[role=\"grid\"]');\n\n /** Predicate for `locatorFor` / `locatorForAll`. */\n static with(options: CalendarHarnessFilters = {}): HarnessPredicate<CalendarHarness> {\n return new HarnessPredicate(CalendarHarness, options);\n }\n\n /** The header period label (e.g. `\"October 2026\"`, `\"2026\"`, `\"2024 – 2047\"`). */\n async getPeriodLabel(): Promise<string> {\n const [, periodBtn] = await this.orderedHeaderButtons();\n return (await periodBtn.text()).trim();\n }\n\n /** Click the previous-page nav button. */\n async goToPreviousPage(): Promise<void> {\n const [prev] = await this.orderedHeaderButtons();\n return prev.click();\n }\n\n /** Click the next-page nav button. */\n async goToNextPage(): Promise<void> {\n const [, , next] = await this.orderedHeaderButtons();\n return next.click();\n }\n\n /** Whether the previous nav button is disabled. */\n async isPreviousDisabled(): Promise<boolean> {\n const [prev] = await this.orderedHeaderButtons();\n return prev.getProperty<boolean>('disabled');\n }\n\n /** Whether the next nav button is disabled. */\n async isNextDisabled(): Promise<boolean> {\n const [, , next] = await this.orderedHeaderButtons();\n return next.getProperty<boolean>('disabled');\n }\n\n /**\n * Click the period label button to move up one view (`day` → `month` → `year`).\n * Accepts an optional `target` to call it multiple times until the current view matches.\n */\n async switchView(target?: CalendarHarnessView): Promise<void> {\n if (!target) {\n const [, periodBtn] = await this.orderedHeaderButtons();\n await periodBtn.click();\n return;\n }\n for (let i = 0; i < 3; i++) {\n if ((await this.getCurrentView()) === target) return;\n const [, periodBtn] = await this.orderedHeaderButtons();\n await periodBtn.click();\n }\n }\n\n /** Identify the currently rendered view by inspecting which view component is present. */\n async getCurrentView(): Promise<CalendarHarnessView> {\n const day = await this.locatorForOptional('tw-calendar-month-view')();\n if (day) return 'day';\n const month = await this.locatorForOptional('tw-calendar-year-view')();\n if (month) return 'month';\n return 'year';\n }\n\n /** All cell harnesses in the currently rendered view. */\n async getCells(filters: CalendarCellHarnessFilters = {}): Promise<CalendarCellHarness[]> {\n return this.locatorForAll(CalendarCellHarness.with(filters))();\n }\n\n /** Click the cell whose text matches exactly. Throws if no match. */\n async selectCell(text: string): Promise<void> {\n const cell = await this.findCellByText(text);\n return cell.select();\n }\n\n /**\n * Selects a date range by clicking the cell whose text matches `start`, then\n * the cell whose text matches `end`. Caller is responsible for ensuring the\n * calendar is in `mode: 'range'` and that both cells are visible in the\n * current view.\n */\n async selectRange(start: string, end: string): Promise<void> {\n const startCell = await this.findCellByText(start);\n await startCell.select();\n const endCell = await this.findCellByText(end);\n await endCell.select();\n }\n\n /** Hovers the cell whose text matches `text` (dispatches `mouseenter` + `mousemove`). Throws if no match. */\n async hoverCell(text: string): Promise<void> {\n const cell = await this.findCellByText(text);\n return cell.hover();\n }\n\n /**\n * Dispatches a `keydown` for `key` on the currently focused cell — falls back\n * to the calendar grid host when no cell owns focus. Supports `'ArrowLeft'`,\n * `'ArrowRight'`, `'ArrowUp'`, `'ArrowDown'`, `'Home'`, `'End'`, `'PageUp'`,\n * `'PageDown'`, `'Enter'`, and `' '` (Space).\n */\n async pressKey(\n key: string,\n modifiers: { shift?: boolean; meta?: boolean; ctrl?: boolean; alt?: boolean } = {},\n ): Promise<void> {\n const cells = await this.getCells();\n for (const cell of cells) {\n if (await cell.isFocused()) {\n return cell.pressKey(key, modifiers);\n }\n }\n const target: TestElement = await this.grid();\n await target.dispatchEvent('keydown', {\n key,\n bubbles: true,\n cancelable: true,\n shiftKey: !!modifiers.shift,\n metaKey: !!modifiers.meta,\n ctrlKey: !!modifiers.ctrl,\n altKey: !!modifiers.alt,\n });\n }\n\n /** All cells currently rendered with `aria-selected=\"true\"`. */\n async getSelectedCells(): Promise<CalendarCellHarness[]> {\n return this.getCells({ selected: true });\n }\n\n /** The cell representing today, or `null` if not visible in the current view. */\n async getTodayCell(): Promise<CalendarCellHarness | null> {\n const cells = await this.getCells();\n for (const cell of cells) {\n if (await cell.isToday()) return cell;\n }\n return null;\n }\n\n /** All disabled cells in the current view. */\n async getDisabledCells(): Promise<CalendarCellHarness[]> {\n return this.getCells({ disabled: true });\n }\n\n /** Whether the calendar host carries `aria-disabled=\"true\"`. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-disabled')) === 'true';\n }\n\n /** @internal Returns the header buttons in [prev, period, next] order. */\n private async orderedHeaderButtons() {\n const buttons = await this.headerNavButtons();\n // Header DOM is [prev-button, period-button, next-button].\n const [prev, period, next] = buttons;\n return [prev, period, next] as const;\n }\n\n /** @internal Resolves the first cell whose text matches `text`. Throws if no match. */\n private async findCellByText(text: string): Promise<CalendarCellHarness> {\n const cells = await this.getCells({ text });\n if (cells.length === 0) {\n throw new Error(`Could not find calendar cell with text \"${text}\"`);\n }\n return cells[0]!;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cdevhub-ngx-tw-calendar-testing.mjs","sources":["../../../projects/ngx-tw/calendar/testing/calendar-cell-harness.ts","../../../projects/ngx-tw/calendar/testing/calendar-harness.ts","../../../projects/ngx-tw/calendar/testing/cdevhub-ngx-tw-calendar-testing.ts"],"sourcesContent":["import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Filters accepted by `CalendarCellHarness.with`. */\nexport interface CalendarCellHarnessFilters extends BaseHarnessFilters {\n /** Match by the cell's visible display text (`1`, `Apr`, `2026`, etc.). */\n text?: string | RegExp;\n /** Match selected / unselected cells. */\n selected?: boolean;\n /** Match disabled / enabled cells. */\n disabled?: boolean;\n}\n\n/** Harness for interacting with a single calendar cell in tests. */\nexport class CalendarCellHarness extends ComponentHarness {\n static hostSelector = '[role=\"gridcell\"]';\n\n private readonly button = this.locatorFor('button');\n\n /** Predicate for `locatorFor` / `locatorForAll`. */\n static with(options: CalendarCellHarnessFilters = {}): HarnessPredicate<CalendarCellHarness> {\n return new HarnessPredicate(CalendarCellHarness, options)\n .addOption('text', options.text, async (h, text) =>\n HarnessPredicate.stringMatches(await h.getText(), text),\n )\n .addOption('selected', options.selected, async (h, selected) => (await h.isSelected()) === selected)\n .addOption('disabled', options.disabled, async (h, disabled) => (await h.isDisabled()) === disabled);\n }\n\n /** The cell's rendered text, trimmed. */\n async getText(): Promise<string> {\n const btn = await this.button();\n return (await btn.text()).trim();\n }\n\n /** The cell's `aria-label`. */\n async getAriaLabel(): Promise<string | null> {\n const btn = await this.button();\n return btn.getAttribute('aria-label');\n }\n\n /** Whether the cell carries `aria-selected=\"true\"`. Read from the `role=\"gridcell\"` host, which is the element that carries selection state — a `<button>`'s implicit role does not support `aria-selected`. */\n async isSelected(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-selected')) === 'true';\n }\n\n /** Whether the cell is disabled — true if the button has `disabled` or carries `aria-disabled=\"true\"`. */\n async isDisabled(): Promise<boolean> {\n const btn = await this.button();\n if (await btn.getProperty<boolean>('disabled')) return true;\n return (await btn.getAttribute('aria-disabled')) === 'true';\n }\n\n /** Whether the cell represents today's date (`aria-current=\"date\"`). */\n async isToday(): Promise<boolean> {\n const btn = await this.button();\n return (await btn.getAttribute('aria-current')) === 'date';\n }\n\n /** Click the cell. */\n async select(): Promise<void> {\n const btn = await this.button();\n return btn.click();\n }\n\n /** Dispatches `mouseenter` and `mousemove` on the cell to drive range-hover preview. */\n async hover(): Promise<void> {\n const btn = await this.button();\n await btn.dispatchEvent('mouseenter');\n await btn.dispatchEvent('mousemove');\n }\n\n /** Programmatically focus the cell. */\n async focus(): Promise<void> {\n const btn = await this.button();\n return btn.focus();\n }\n\n /** Whether the cell's button is the active document element. */\n async isFocused(): Promise<boolean> {\n const btn = await this.button();\n return btn.isFocused();\n }\n\n /** Dispatches a `keydown` for `key` on the cell button (e.g. `'ArrowRight'`, `'Enter'`, `' '`, `'PageUp'`). */\n async pressKey(\n key: string,\n modifiers: { shift?: boolean; meta?: boolean; ctrl?: boolean; alt?: boolean } = {},\n ): Promise<void> {\n const btn = await this.button();\n await btn.dispatchEvent('keydown', {\n key,\n bubbles: true,\n cancelable: true,\n shiftKey: !!modifiers.shift,\n metaKey: !!modifiers.meta,\n ctrlKey: !!modifiers.ctrl,\n altKey: !!modifiers.alt,\n });\n }\n}\n","import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\nimport type { BaseHarnessFilters, TestElement } from '@angular/cdk/testing';\nimport { CalendarCellHarness, type CalendarCellHarnessFilters } from './calendar-cell-harness';\n\n/** The available calendar views, mirrored so consumers don't have to import from the library's main entry point. */\nexport type CalendarHarnessView = 'day' | 'month' | 'year';\n\n/** Filters accepted by `CalendarHarness.with`. */\nexport type CalendarHarnessFilters = BaseHarnessFilters;\n\n/** Harness for interacting with a `<tw-calendar>` in tests. */\nexport class CalendarHarness extends ComponentHarness {\n static hostSelector = 'tw-calendar';\n\n private readonly headerNavButtons = this.locatorForAll('tw-calendar-header button');\n private readonly grid = this.locatorFor('[role=\"grid\"]');\n\n /** Predicate for `locatorFor` / `locatorForAll`. */\n static with(options: CalendarHarnessFilters = {}): HarnessPredicate<CalendarHarness> {\n return new HarnessPredicate(CalendarHarness, options);\n }\n\n /** The header period label (e.g. `\"October 2026\"`, `\"2026\"`, `\"2024 – 2047\"`). */\n async getPeriodLabel(): Promise<string> {\n const [, periodBtn] = await this.orderedHeaderButtons();\n return (await periodBtn.text()).trim();\n }\n\n /** Click the previous-page nav button. */\n async goToPreviousPage(): Promise<void> {\n const [prev] = await this.orderedHeaderButtons();\n return prev.click();\n }\n\n /** Click the next-page nav button. */\n async goToNextPage(): Promise<void> {\n const [, , next] = await this.orderedHeaderButtons();\n return next.click();\n }\n\n /** Whether the previous nav button is disabled. */\n async isPreviousDisabled(): Promise<boolean> {\n const [prev] = await this.orderedHeaderButtons();\n return prev.getProperty<boolean>('disabled');\n }\n\n /** Whether the next nav button is disabled. */\n async isNextDisabled(): Promise<boolean> {\n const [, , next] = await this.orderedHeaderButtons();\n return next.getProperty<boolean>('disabled');\n }\n\n /**\n * Click the period label button to move up one view (`day` → `month` → `year`).\n * Accepts an optional `target` to call it multiple times until the current view matches.\n */\n async switchView(target?: CalendarHarnessView): Promise<void> {\n if (!target) {\n const [, periodBtn] = await this.orderedHeaderButtons();\n await periodBtn.click();\n return;\n }\n for (let i = 0; i < 3; i++) {\n if ((await this.getCurrentView()) === target) return;\n const [, periodBtn] = await this.orderedHeaderButtons();\n await periodBtn.click();\n }\n }\n\n /** Identify the currently rendered view by inspecting which view component is present. */\n async getCurrentView(): Promise<CalendarHarnessView> {\n const day = await this.locatorForOptional('tw-calendar-month-view')();\n if (day) return 'day';\n const month = await this.locatorForOptional('tw-calendar-year-view')();\n if (month) return 'month';\n return 'year';\n }\n\n /** All cell harnesses in the currently rendered view. */\n async getCells(filters: CalendarCellHarnessFilters = {}): Promise<CalendarCellHarness[]> {\n return this.locatorForAll(CalendarCellHarness.with(filters))();\n }\n\n /** Click the cell whose text matches exactly. Throws if no match. */\n async selectCell(text: string): Promise<void> {\n const cell = await this.findCellByText(text);\n return cell.select();\n }\n\n /**\n * Selects a date range by clicking the cell whose text matches `start`, then\n * the cell whose text matches `end`. Caller is responsible for ensuring the\n * calendar is in `mode: 'range'` and that both cells are visible in the\n * current view.\n */\n async selectRange(start: string, end: string): Promise<void> {\n const startCell = await this.findCellByText(start);\n await startCell.select();\n const endCell = await this.findCellByText(end);\n await endCell.select();\n }\n\n /** Hovers the cell whose text matches `text` (dispatches `mouseenter` + `mousemove`). Throws if no match. */\n async hoverCell(text: string): Promise<void> {\n const cell = await this.findCellByText(text);\n return cell.hover();\n }\n\n /**\n * Dispatches a `keydown` for `key` on the currently focused cell — falls back\n * to the calendar grid host when no cell owns focus. Supports `'ArrowLeft'`,\n * `'ArrowRight'`, `'ArrowUp'`, `'ArrowDown'`, `'Home'`, `'End'`, `'PageUp'`,\n * `'PageDown'`, `'Enter'`, and `' '` (Space).\n */\n async pressKey(\n key: string,\n modifiers: { shift?: boolean; meta?: boolean; ctrl?: boolean; alt?: boolean } = {},\n ): Promise<void> {\n const cells = await this.getCells();\n for (const cell of cells) {\n if (await cell.isFocused()) {\n return cell.pressKey(key, modifiers);\n }\n }\n const target: TestElement = await this.grid();\n await target.dispatchEvent('keydown', {\n key,\n bubbles: true,\n cancelable: true,\n shiftKey: !!modifiers.shift,\n metaKey: !!modifiers.meta,\n ctrlKey: !!modifiers.ctrl,\n altKey: !!modifiers.alt,\n });\n }\n\n /** All cells currently rendered with `aria-selected=\"true\"`. */\n async getSelectedCells(): Promise<CalendarCellHarness[]> {\n return this.getCells({ selected: true });\n }\n\n /** The cell representing today, or `null` if not visible in the current view. */\n async getTodayCell(): Promise<CalendarCellHarness | null> {\n const cells = await this.getCells();\n for (const cell of cells) {\n if (await cell.isToday()) return cell;\n }\n return null;\n }\n\n /** All disabled cells in the current view. */\n async getDisabledCells(): Promise<CalendarCellHarness[]> {\n return this.getCells({ disabled: true });\n }\n\n /** Whether the calendar host carries `aria-disabled=\"true\"`. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.getAttribute('aria-disabled')) === 'true';\n }\n\n /** @internal Returns the header buttons in [prev, period, next] order. */\n private async orderedHeaderButtons() {\n const buttons = await this.headerNavButtons();\n // Header DOM is [prev-button, period-button, next-button].\n const [prev, period, next] = buttons;\n return [prev, period, next] as const;\n }\n\n /** @internal Resolves the first cell whose text matches `text`. Throws if no match. */\n private async findCellByText(text: string): Promise<CalendarCellHarness> {\n const cells = await this.getCells({ text });\n if (cells.length === 0) {\n throw new Error(`Could not find calendar cell with text \"${text}\"`);\n }\n return cells[0]!;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}