@cdevhub/ngx-tw 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/index.json +1 -0
  121. package/package.json +45 -20
  122. package/theme/index.css +10 -2
  123. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  124. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  125. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  126. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  127. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  128. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  129. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  130. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  131. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  132. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  133. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  134. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  135. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  136. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  137. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  138. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  139. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  140. package/types/cdevhub-ngx-tw.d.ts +7 -0
@@ -104,16 +104,18 @@ const menuItemSubmenuIndicatorVariants = tv({
104
104
  // ── MenuComponent ──
105
105
  class MenuComponent {
106
106
  /** Controls item density and padding. Defaults to `'md'`. */
107
- size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
107
+ size = input('md', /* @ts-ignore */
108
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
108
109
  /** Accessible label for the menu panel. Use when no visible heading describes the menu (e.g. a kebab-icon trigger). */
109
110
  ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
110
111
  /** ID of an element that labels the menu panel. Ignored when `ariaLabel` is set. */
111
112
  ariaLabelledBy = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabelledBy" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
112
- classes = computed(() => menuVariants({ size: this.size() }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
113
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
114
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.14", type: MenuComponent, isStandalone: true, selector: "tw-menu", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-label": "ariaLabel() ?? null", "attr.aria-labelledby": "ariaLabel() ? null : (ariaLabelledBy() ?? null)", "animate.enter": "\"scale-in\"", "animate.leave": "\"scale-out\"" } }, hostDirectives: [{ directive: i1.CdkMenu, outputs: ["closed", "closed"] }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
113
+ classes = computed(() => menuVariants({ size: this.size() }), /* @ts-ignore */
114
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
115
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
116
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MenuComponent, isStandalone: true, selector: "tw-menu", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-label": "ariaLabel() ?? null", "attr.aria-labelledby": "ariaLabel() ? null : (ariaLabelledBy() ?? null)", "animate.enter": "\"scale-in\"", "animate.leave": "\"scale-out\"" } }, hostDirectives: [{ directive: i1.CdkMenu, outputs: ["closed", "closed"] }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
115
117
  }
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuComponent, decorators: [{
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuComponent, decorators: [{
117
119
  type: Component,
118
120
  args: [{
119
121
  selector: 'tw-menu',
@@ -136,10 +138,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
136
138
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }] } });
137
139
  // ── MenuTriggerDirective ──
138
140
  class MenuTriggerDirective {
139
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
140
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuTriggerDirective, isStandalone: true, selector: "[twMenuTrigger]", hostDirectives: [{ directive: i1.CdkMenuTrigger, inputs: ["cdkMenuTriggerFor", "twMenuTrigger", "cdkMenuPosition", "position", "cdkMenuTriggerData", "data"], outputs: ["cdkMenuOpened", "opened", "cdkMenuClosed", "closed"] }], ngImport: i0 });
141
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
142
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MenuTriggerDirective, isStandalone: true, selector: "[twMenuTrigger]", hostDirectives: [{ directive: i1.CdkMenuTrigger, inputs: ["cdkMenuTriggerFor", "twMenuTrigger", "cdkMenuPosition", "position", "cdkMenuTriggerData", "data"], outputs: ["cdkMenuOpened", "opened", "cdkMenuClosed", "closed"] }], ngImport: i0 });
141
143
  }
142
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuTriggerDirective, decorators: [{
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuTriggerDirective, decorators: [{
143
145
  type: Directive,
144
146
  args: [{
145
147
  selector: '[twMenuTrigger]',
@@ -161,10 +163,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
161
163
  }] });
162
164
  // ── ContextMenuTriggerDirective ──
163
165
  class ContextMenuTriggerDirective {
164
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ContextMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
165
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: ContextMenuTriggerDirective, isStandalone: true, selector: "[twContextMenuTrigger]", hostDirectives: [{ directive: i1.CdkContextMenuTrigger, inputs: ["cdkContextMenuTriggerFor", "twContextMenuTrigger", "cdkContextMenuDisabled", "disabled", "cdkContextMenuPosition", "position", "cdkContextMenuTriggerData", "data"], outputs: ["cdkContextMenuOpened", "opened", "cdkContextMenuClosed", "closed"] }], ngImport: i0 });
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ContextMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
167
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: ContextMenuTriggerDirective, isStandalone: true, selector: "[twContextMenuTrigger]", hostDirectives: [{ directive: i1.CdkContextMenuTrigger, inputs: ["cdkContextMenuTriggerFor", "twContextMenuTrigger", "cdkContextMenuDisabled", "disabled", "cdkContextMenuPosition", "position", "cdkContextMenuTriggerData", "data"], outputs: ["cdkContextMenuOpened", "opened", "cdkContextMenuClosed", "closed"] }], ngImport: i0 });
166
168
  }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ContextMenuTriggerDirective, decorators: [{
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ContextMenuTriggerDirective, decorators: [{
168
170
  type: Directive,
169
171
  args: [{
170
172
  selector: '[twContextMenuTrigger]',
@@ -192,9 +194,11 @@ class MenuItemDirective {
192
194
  * base `text-fg` styling at full prominence; `'neutral'` (the explicit muted
193
195
  * variant) is a distinct value with `text-fg-muted` + `bg-surface-muted` hovers.
194
196
  */
195
- color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
197
+ color = input(undefined, /* @ts-ignore */
198
+ ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
196
199
  /** Whether this item is disabled. Defaults to `false`. */
197
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
200
+ disabled = input(false, /* @ts-ignore */
201
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
198
202
  menu = inject(MenuComponent, { optional: true });
199
203
  cdkItem = inject(CdkMenuItem);
200
204
  constructor() {
@@ -208,11 +212,12 @@ class MenuItemDirective {
208
212
  size: this.menu?.size() ?? 'md',
209
213
  color: this.color(),
210
214
  disabled: this.disabled(),
211
- }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
212
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
213
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: MenuItemDirective, isStandalone: true, selector: "[twMenuItem]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItem, outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0 });
215
+ }), /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
217
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
218
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MenuItemDirective, isStandalone: true, selector: "[twMenuItem]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItem, outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0 });
214
219
  }
215
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDirective, decorators: [{
220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemDirective, decorators: [{
216
221
  type: Directive,
217
222
  args: [{
218
223
  selector: '[twMenuItem]',
@@ -230,12 +235,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
230
235
  // ── MenuItemCheckboxComponent ──
231
236
  class MenuItemCheckboxComponent {
232
237
  /** Whether this item is disabled. Defaults to `false`. */
233
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
238
+ disabled = input(false, /* @ts-ignore */
239
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
234
240
  /** Fires when the item is activated, carrying the new `checked` value after CDK toggles it. */
235
241
  checkedChange = output();
236
242
  cdkCheckbox = inject(CdkMenuItemCheckbox);
237
243
  menu = inject(MenuComponent, { optional: true });
238
- resolvedSize = computed(() => this.menu?.size() ?? 'md', ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
244
+ resolvedSize = computed(() => this.menu?.size() ?? 'md', /* @ts-ignore */
245
+ ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
239
246
  constructor() {
240
247
  effect(() => {
241
248
  this.cdkCheckbox.disabled = this.disabled();
@@ -248,10 +255,12 @@ class MenuItemCheckboxComponent {
248
255
  classes = computed(() => menuItemVariants({
249
256
  size: this.resolvedSize(),
250
257
  disabled: this.disabled(),
251
- }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
252
- indicatorClasses = computed(() => menuItemIndicatorVariants({ size: this.resolvedSize() }), ...(ngDevMode ? [{ debugName: "indicatorClasses" }] : /* istanbul ignore next */ []));
253
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
254
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: MenuItemCheckboxComponent, isStandalone: true, selector: "[twMenuItemCheckbox]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItemCheckbox, inputs: ["cdkMenuItemChecked", "checked"], outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0, template: `
258
+ }), /* @ts-ignore */
259
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
260
+ indicatorClasses = computed(() => menuItemIndicatorVariants({ size: this.resolvedSize() }), /* @ts-ignore */
261
+ ...(ngDevMode ? [{ debugName: "indicatorClasses" }] : /* istanbul ignore next */ []));
262
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
263
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MenuItemCheckboxComponent, isStandalone: true, selector: "[twMenuItemCheckbox]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItemCheckbox, inputs: ["cdkMenuItemChecked", "checked"], outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0, template: `
255
264
  <span [class]="indicatorClasses()">
256
265
  @if (cdkCheckbox.checked) {
257
266
  <svg class="size-full" viewBox="0 0 20 20" fill="currentColor">
@@ -262,7 +271,7 @@ class MenuItemCheckboxComponent {
262
271
  <ng-content />
263
272
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
264
273
  }
265
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemCheckboxComponent, decorators: [{
274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemCheckboxComponent, decorators: [{
266
275
  type: Component,
267
276
  args: [{
268
277
  selector: '[twMenuItemCheckbox]',
@@ -292,12 +301,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
292
301
  // ── MenuItemRadioComponent ──
293
302
  class MenuItemRadioComponent {
294
303
  /** Whether this item is disabled. Defaults to `false`. */
295
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
304
+ disabled = input(false, /* @ts-ignore */
305
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
296
306
  /** Fires when the item is activated, carrying the new `checked` value after CDK selects it. */
297
307
  checkedChange = output();
298
308
  cdkRadio = inject(CdkMenuItemRadio);
299
309
  menu = inject(MenuComponent, { optional: true });
300
- resolvedSize = computed(() => this.menu?.size() ?? 'md', ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
310
+ resolvedSize = computed(() => this.menu?.size() ?? 'md', /* @ts-ignore */
311
+ ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
301
312
  constructor() {
302
313
  effect(() => {
303
314
  this.cdkRadio.disabled = this.disabled();
@@ -310,10 +321,12 @@ class MenuItemRadioComponent {
310
321
  classes = computed(() => menuItemVariants({
311
322
  size: this.resolvedSize(),
312
323
  disabled: this.disabled(),
313
- }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
314
- indicatorClasses = computed(() => menuItemIndicatorVariants({ size: this.resolvedSize() }), ...(ngDevMode ? [{ debugName: "indicatorClasses" }] : /* istanbul ignore next */ []));
315
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
316
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: MenuItemRadioComponent, isStandalone: true, selector: "[twMenuItemRadio]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItemRadio, inputs: ["cdkMenuItemChecked", "checked"], outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0, template: `
324
+ }), /* @ts-ignore */
325
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
326
+ indicatorClasses = computed(() => menuItemIndicatorVariants({ size: this.resolvedSize() }), /* @ts-ignore */
327
+ ...(ngDevMode ? [{ debugName: "indicatorClasses" }] : /* istanbul ignore next */ []));
328
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
329
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MenuItemRadioComponent, isStandalone: true, selector: "[twMenuItemRadio]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItemRadio, inputs: ["cdkMenuItemChecked", "checked"], outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0, template: `
317
330
  <span [class]="indicatorClasses()">
318
331
  @if (cdkRadio.checked) {
319
332
  <svg class="size-full" viewBox="0 0 20 20" fill="currentColor">
@@ -324,7 +337,7 @@ class MenuItemRadioComponent {
324
337
  <ng-content />
325
338
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
326
339
  }
327
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemRadioComponent, decorators: [{
340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemRadioComponent, decorators: [{
328
341
  type: Component,
329
342
  args: [{
330
343
  selector: '[twMenuItemRadio]',
@@ -353,10 +366,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
353
366
  }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }] } });
354
367
  // ── MenuGroupDirective ──
355
368
  class MenuGroupDirective {
356
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
357
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuGroupDirective, isStandalone: true, selector: "[twMenuGroup]", hostDirectives: [{ directive: i1.CdkMenuGroup }], ngImport: i0 });
369
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
370
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MenuGroupDirective, isStandalone: true, selector: "[twMenuGroup]", hostDirectives: [{ directive: i1.CdkMenuGroup }], ngImport: i0 });
358
371
  }
359
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuGroupDirective, decorators: [{
372
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuGroupDirective, decorators: [{
360
373
  type: Directive,
361
374
  args: [{
362
375
  selector: '[twMenuGroup]',
@@ -367,11 +380,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
367
380
  /** Styles a leading icon inside a menu item. */
368
381
  class MenuItemIconDirective {
369
382
  menu = inject(MenuComponent, { optional: true });
370
- classes = computed(() => menuItemIconVariants({ size: this.menu?.size() ?? 'md' }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
371
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
372
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemIconDirective, isStandalone: true, selector: "[twMenuItemIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
383
+ classes = computed(() => menuItemIconVariants({ size: this.menu?.size() ?? 'md' }), /* @ts-ignore */
384
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
385
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
386
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MenuItemIconDirective, isStandalone: true, selector: "[twMenuItemIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
373
387
  }
374
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemIconDirective, decorators: [{
388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemIconDirective, decorators: [{
375
389
  type: Directive,
376
390
  args: [{
377
391
  selector: '[twMenuItemIcon]',
@@ -382,10 +396,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
382
396
  }] });
383
397
  /** Styles secondary description text inside a menu item. */
384
398
  class MenuItemDescriptionDirective {
385
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
386
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemDescriptionDirective, isStandalone: true, selector: "[twMenuItemDescription]", host: { classAttribute: "block text-xs text-fg-muted min-w-0 truncate order-last basis-full" }, ngImport: i0 });
399
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
400
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MenuItemDescriptionDirective, isStandalone: true, selector: "[twMenuItemDescription]", host: { classAttribute: "block text-xs text-fg-muted min-w-0 truncate order-last basis-full" }, ngImport: i0 });
387
401
  }
388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDescriptionDirective, decorators: [{
402
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemDescriptionDirective, decorators: [{
389
403
  type: Directive,
390
404
  args: [{
391
405
  selector: '[twMenuItemDescription]',
@@ -396,10 +410,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
396
410
  }] });
397
411
  /** Right-aligns and mutes keyboard shortcut hint text. */
398
412
  class MenuItemShortcutDirective {
399
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemShortcutDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
400
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemShortcutDirective, isStandalone: true, selector: "[twMenuItemShortcut]", host: { classAttribute: "ml-auto pl-3 text-xs text-fg-subtle tracking-wide" }, ngImport: i0 });
413
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemShortcutDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
414
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MenuItemShortcutDirective, isStandalone: true, selector: "[twMenuItemShortcut]", host: { classAttribute: "ml-auto pl-3 text-xs text-fg-subtle tracking-wide" }, ngImport: i0 });
401
415
  }
402
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemShortcutDirective, decorators: [{
416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemShortcutDirective, decorators: [{
403
417
  type: Directive,
404
418
  args: [{
405
419
  selector: '[twMenuItemShortcut]',
@@ -411,11 +425,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
411
425
  /** Styles the trailing chevron for submenu triggers. */
412
426
  class MenuItemSubmenuIndicatorDirective {
413
427
  menu = inject(MenuComponent, { optional: true });
414
- classes = computed(() => menuItemSubmenuIndicatorVariants({ size: this.menu?.size() ?? 'md' }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
415
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemSubmenuIndicatorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
416
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemSubmenuIndicatorDirective, isStandalone: true, selector: "[twMenuItemSubmenuIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
428
+ classes = computed(() => menuItemSubmenuIndicatorVariants({ size: this.menu?.size() ?? 'md' }), /* @ts-ignore */
429
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
430
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemSubmenuIndicatorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
431
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MenuItemSubmenuIndicatorDirective, isStandalone: true, selector: "[twMenuItemSubmenuIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
417
432
  }
418
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemSubmenuIndicatorDirective, decorators: [{
433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuItemSubmenuIndicatorDirective, decorators: [{
419
434
  type: Directive,
420
435
  args: [{
421
436
  selector: '[twMenuItemSubmenuIcon]',
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-menu.mjs","sources":["../../../projects/ngx-tw/menu/menu.ts","../../../projects/ngx-tw/menu/cdevhub-ngx-tw-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CdkContextMenuTrigger,\n CdkMenu,\n CdkMenuGroup,\n CdkMenuItem,\n CdkMenuItemCheckbox,\n CdkMenuItemRadio,\n CdkMenuTrigger,\n} from '@angular/cdk/menu';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n// ── Variant configs ──\n\nconst menuVariants = tv(\n {\n base: 'min-w-48 flex flex-col max-h-96 rounded-lg bg-surface-overlay border border-border shadow-md overflow-y-auto text-fg',\n variants: {\n // Menu panels intentionally use sub-`p-1` padding at xs/sm because items\n // carry their own inline padding — the codified `p-2`/`p-3`/`p-4` container\n // scale would over-pad the panel gutter. The size axis here scales the panel\n // border-to-item gap only, not item density.\n size: {\n xs: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',\n sm: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',\n md: 'p-1 [&>tw-separator]:-mx-1 [&>tw-separator]:my-1',\n lg: 'p-1.5 [&>tw-separator]:-mx-1.5 [&>tw-separator]:my-1',\n xl: 'p-2 [&>tw-separator]:-mx-2 [&>tw-separator]:my-1',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Menu items use the codified menu-item focus carve-out: `focus-visible:bg-surface-muted`\n// (and color-tinted equivalents below) in place of the canonical outline ring. See the\n// \"Focus Rings → Menu-item carve-out\" section in CLAUDE.md.\nconst menuItemVariants = tv(\n {\n base: 'relative flex w-full flex-wrap items-center gap-2 rounded-md cursor-pointer select-none transition-colors duration-normal motion-reduce:transition-none text-fg outline-none focus-visible:bg-surface-muted hover:bg-surface-muted',\n variants: {\n size: {\n xs: 'px-1.5 py-0.5 text-xs',\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1.5 text-sm',\n lg: 'px-4 py-2 text-sm',\n xl: 'px-5 py-2.5 text-base',\n },\n // Slot tokens own light/dark contrast — no `dark:`, no shade picks.\n // `undefined` (the default) leaves the base text-fg styling untouched.\n color: {\n primary: 'text-primary-fg hover:bg-primary-soft focus-visible:bg-primary-soft',\n secondary: 'text-secondary-fg hover:bg-secondary-soft focus-visible:bg-secondary-soft',\n accent: 'text-accent-fg hover:bg-accent-soft focus-visible:bg-accent-soft',\n info: 'text-info-fg hover:bg-info-soft focus-visible:bg-info-soft',\n success: 'text-success-fg hover:bg-success-soft focus-visible:bg-success-soft',\n warning: 'text-warning-fg hover:bg-warning-soft focus-visible:bg-warning-soft',\n error: 'text-error-fg hover:bg-error-soft focus-visible:bg-error-soft',\n neutral: 'text-fg-muted hover:bg-surface-muted focus-visible:bg-surface-muted',\n },\n // `cursor-not-allowed` is layered so a programmatically-focused disabled item\n // still reads as disabled — `pointer-events-none` blocks pointer activation, but\n // the cursor cue communicates the state if focus lands here via CDK's own paths.\n // CDK's `FocusableOption` honours `cdkItem.disabled` (synced via the effect below)\n // and skips disabled items in keyboard navigation automatically.\n disabled: {\n true: 'opacity-50 pointer-events-none cursor-not-allowed',\n },\n },\n defaultVariants: { size: 'md', disabled: false },\n },\n { twMerge: true },\n);\n\nconst menuItemIconVariants = tv(\n {\n base: 'shrink-0 text-fg-muted',\n variants: {\n size: {\n xs: 'size-4',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\nconst menuItemIndicatorVariants = tv(\n {\n base: 'shrink-0 flex items-center justify-center',\n variants: {\n size: {\n xs: 'size-4',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Submenu indicator (trailing chevron). Keeps the `ml-auto pl-2` layout intent\n// separate from the leading-icon scale; size axis follows the glyph scale per\n// CLAUDE.md \"Icon Sizing\" so the chevron scales with the parent menu's density.\nconst menuItemSubmenuIndicatorVariants = tv(\n {\n base: 'ml-auto pl-2 shrink-0 text-fg-muted',\n variants: {\n size: {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// ── MenuComponent ──\n\n@Component({\n selector: 'tw-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenu,\n outputs: ['closed'],\n },\n ],\n host: {\n '[class]': 'classes()',\n '[attr.aria-label]': 'ariaLabel() ?? null',\n '[attr.aria-labelledby]': 'ariaLabel() ? null : (ariaLabelledBy() ?? null)',\n '[animate.enter]': '\"scale-in\"',\n '[animate.leave]': '\"scale-out\"',\n },\n template: `<ng-content />`,\n})\nexport class MenuComponent {\n /** Controls item density and padding. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Accessible label for the menu panel. Use when no visible heading describes the menu (e.g. a kebab-icon trigger). */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an element that labels the menu panel. Ignored when `ariaLabel` is set. */\n readonly ariaLabelledBy = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n readonly classes = computed(() => menuVariants({ size: this.size() }));\n}\n\n// ── MenuTriggerDirective ──\n\n@Directive({\n selector: '[twMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkMenuTrigger,\n inputs: [\n 'cdkMenuTriggerFor: twMenuTrigger',\n // Forward CDK's positioning so consumers can anchor the menu (e.g. bottom-end vs bottom-start).\n // Accepts `ConnectedPosition[]` from `@angular/cdk/overlay`.\n 'cdkMenuPosition: position',\n // Forward menu context data so consumers can parameterise the template.\n 'cdkMenuTriggerData: data',\n ],\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\n },\n ],\n})\nexport class MenuTriggerDirective {}\n\n// ── ContextMenuTriggerDirective ──\n\n@Directive({\n selector: '[twContextMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkContextMenuTrigger,\n inputs: [\n 'cdkContextMenuTriggerFor: twContextMenuTrigger',\n 'cdkContextMenuDisabled: disabled',\n // Context menus open at pointer coordinates; `position` here tunes the\n // `ConnectedPosition[]` fallback list once CDK has anchored the overlay.\n 'cdkContextMenuPosition: position',\n 'cdkContextMenuTriggerData: data',\n ],\n outputs: ['cdkContextMenuOpened: opened', 'cdkContextMenuClosed: closed'],\n },\n ],\n})\nexport class ContextMenuTriggerDirective {}\n\n// ── MenuItemDirective ──\n\n@Directive({\n selector: '[twMenuItem]',\n hostDirectives: [\n {\n directive: CdkMenuItem,\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemDirective {\n /**\n * Semantic role tint applied to the item. Use `'error'` for destructive actions.\n * Defaults to `undefined` — no role tint is applied and the item inherits the\n * base `text-fg` styling at full prominence; `'neutral'` (the explicit muted\n * variant) is a distinct value with `text-fg-muted` + `bg-surface-muted` hovers.\n */\n readonly color = input<TwColor | undefined>(undefined);\n\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n private readonly menu = inject(MenuComponent, { optional: true });\n private readonly cdkItem = inject(CdkMenuItem);\n\n constructor() {\n // Single source of truth: the local `disabled` signal drives both visual state\n // and the underlying CDK directive's behavior (`disabled` is a plain property on CDK).\n effect(() => {\n this.cdkItem.disabled = this.disabled();\n });\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.menu?.size() ?? 'md',\n color: this.color(),\n disabled: this.disabled(),\n }),\n );\n}\n\n// ── MenuItemCheckboxComponent ──\n\n@Component({\n selector: '[twMenuItemCheckbox]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenuItemCheckbox,\n inputs: ['cdkMenuItemChecked: checked'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (cdkCheckbox.checked) {\n <svg class=\"size-full\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n </span>\n <ng-content />\n `,\n})\nexport class MenuItemCheckboxComponent {\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** Fires when the item is activated, carrying the new `checked` value after CDK toggles it. */\n readonly checkedChange = output<boolean>();\n\n protected readonly cdkCheckbox = inject(CdkMenuItemCheckbox);\n private readonly menu = inject(MenuComponent, { optional: true });\n\n private readonly resolvedSize = computed(() => this.menu?.size() ?? 'md');\n\n constructor() {\n effect(() => {\n this.cdkCheckbox.disabled = this.disabled();\n });\n // CDK fires `triggered` BEFORE updating `checked`; emit the post-toggle value.\n this.cdkCheckbox.triggered\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.checkedChange.emit(!this.cdkCheckbox.checked));\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.resolvedSize(),\n disabled: this.disabled(),\n }),\n );\n\n readonly indicatorClasses = computed(() =>\n menuItemIndicatorVariants({ size: this.resolvedSize() }),\n );\n}\n\n// ── MenuItemRadioComponent ──\n\n@Component({\n selector: '[twMenuItemRadio]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenuItemRadio,\n inputs: ['cdkMenuItemChecked: checked'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (cdkRadio.checked) {\n <svg class=\"size-full\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <circle cx=\"10\" cy=\"10\" r=\"5\"/>\n </svg>\n }\n </span>\n <ng-content />\n `,\n})\nexport class MenuItemRadioComponent {\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** Fires when the item is activated, carrying the new `checked` value after CDK selects it. */\n readonly checkedChange = output<boolean>();\n\n protected readonly cdkRadio = inject(CdkMenuItemRadio);\n private readonly menu = inject(MenuComponent, { optional: true });\n\n private readonly resolvedSize = computed(() => this.menu?.size() ?? 'md');\n\n constructor() {\n effect(() => {\n this.cdkRadio.disabled = this.disabled();\n });\n // Radio activation always selects the item; emit `true` (the post-trigger checked state).\n this.cdkRadio.triggered\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.checkedChange.emit(true));\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.resolvedSize(),\n disabled: this.disabled(),\n }),\n );\n\n readonly indicatorClasses = computed(() =>\n menuItemIndicatorVariants({ size: this.resolvedSize() }),\n );\n}\n\n// ── MenuGroupDirective ──\n\n@Directive({\n selector: '[twMenuGroup]',\n hostDirectives: [CdkMenuGroup],\n})\nexport class MenuGroupDirective {}\n\n// ── Content directives ──\n\n/** Styles a leading icon inside a menu item. */\n@Directive({\n selector: '[twMenuItemIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemIconDirective {\n private readonly menu = inject(MenuComponent, { optional: true });\n\n readonly classes = computed(() =>\n menuItemIconVariants({ size: this.menu?.size() ?? 'md' }),\n );\n}\n\n/** Styles secondary description text inside a menu item. */\n@Directive({\n selector: '[twMenuItemDescription]',\n host: {\n class: 'block text-xs text-fg-muted min-w-0 truncate order-last basis-full',\n },\n})\nexport class MenuItemDescriptionDirective {}\n\n/** Right-aligns and mutes keyboard shortcut hint text. */\n@Directive({\n selector: '[twMenuItemShortcut]',\n host: {\n class: 'ml-auto pl-3 text-xs text-fg-subtle tracking-wide',\n },\n})\nexport class MenuItemShortcutDirective {}\n\n/** Styles the trailing chevron for submenu triggers. */\n@Directive({\n selector: '[twMenuItemSubmenuIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemSubmenuIndicatorDirective {\n private readonly menu = inject(MenuComponent, { optional: true });\n\n readonly classes = computed(() =>\n menuItemSubmenuIndicatorVariants({ size: this.menu?.size() ?? 'md' }),\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-menu.mjs","sources":["../../../projects/ngx-tw/menu/menu.ts","../../../projects/ngx-tw/menu/cdevhub-ngx-tw-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CdkContextMenuTrigger,\n CdkMenu,\n CdkMenuGroup,\n CdkMenuItem,\n CdkMenuItemCheckbox,\n CdkMenuItemRadio,\n CdkMenuTrigger,\n} from '@angular/cdk/menu';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n// ── Variant configs ──\n\nconst menuVariants = tv(\n {\n base: 'min-w-48 flex flex-col max-h-96 rounded-lg bg-surface-overlay border border-border shadow-md overflow-y-auto text-fg',\n variants: {\n // Menu panels intentionally use sub-`p-1` padding at xs/sm because items\n // carry their own inline padding — the codified `p-2`/`p-3`/`p-4` container\n // scale would over-pad the panel gutter. The size axis here scales the panel\n // border-to-item gap only, not item density.\n size: {\n xs: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',\n sm: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',\n md: 'p-1 [&>tw-separator]:-mx-1 [&>tw-separator]:my-1',\n lg: 'p-1.5 [&>tw-separator]:-mx-1.5 [&>tw-separator]:my-1',\n xl: 'p-2 [&>tw-separator]:-mx-2 [&>tw-separator]:my-1',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Menu items use the codified menu-item focus carve-out: `focus-visible:bg-surface-muted`\n// (and color-tinted equivalents below) in place of the canonical outline ring. See the\n// \"Focus Rings → Menu-item carve-out\" section in CLAUDE.md.\nconst menuItemVariants = tv(\n {\n base: 'relative flex w-full flex-wrap items-center gap-2 rounded-md cursor-pointer select-none transition-colors duration-normal motion-reduce:transition-none text-fg outline-none focus-visible:bg-surface-muted hover:bg-surface-muted',\n variants: {\n size: {\n xs: 'px-1.5 py-0.5 text-xs',\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1.5 text-sm',\n lg: 'px-4 py-2 text-sm',\n xl: 'px-5 py-2.5 text-base',\n },\n // Slot tokens own light/dark contrast — no `dark:`, no shade picks.\n // `undefined` (the default) leaves the base text-fg styling untouched.\n color: {\n primary: 'text-primary-fg hover:bg-primary-soft focus-visible:bg-primary-soft',\n secondary: 'text-secondary-fg hover:bg-secondary-soft focus-visible:bg-secondary-soft',\n accent: 'text-accent-fg hover:bg-accent-soft focus-visible:bg-accent-soft',\n info: 'text-info-fg hover:bg-info-soft focus-visible:bg-info-soft',\n success: 'text-success-fg hover:bg-success-soft focus-visible:bg-success-soft',\n warning: 'text-warning-fg hover:bg-warning-soft focus-visible:bg-warning-soft',\n error: 'text-error-fg hover:bg-error-soft focus-visible:bg-error-soft',\n neutral: 'text-fg-muted hover:bg-surface-muted focus-visible:bg-surface-muted',\n },\n // `cursor-not-allowed` is layered so a programmatically-focused disabled item\n // still reads as disabled — `pointer-events-none` blocks pointer activation, but\n // the cursor cue communicates the state if focus lands here via CDK's own paths.\n // CDK's `FocusableOption` honours `cdkItem.disabled` (synced via the effect below)\n // and skips disabled items in keyboard navigation automatically.\n disabled: {\n true: 'opacity-50 pointer-events-none cursor-not-allowed',\n },\n },\n defaultVariants: { size: 'md', disabled: false },\n },\n { twMerge: true },\n);\n\nconst menuItemIconVariants = tv(\n {\n base: 'shrink-0 text-fg-muted',\n variants: {\n size: {\n xs: 'size-4',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\nconst menuItemIndicatorVariants = tv(\n {\n base: 'shrink-0 flex items-center justify-center',\n variants: {\n size: {\n xs: 'size-4',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Submenu indicator (trailing chevron). Keeps the `ml-auto pl-2` layout intent\n// separate from the leading-icon scale; size axis follows the glyph scale per\n// CLAUDE.md \"Icon Sizing\" so the chevron scales with the parent menu's density.\nconst menuItemSubmenuIndicatorVariants = tv(\n {\n base: 'ml-auto pl-2 shrink-0 text-fg-muted',\n variants: {\n size: {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// ── MenuComponent ──\n\n@Component({\n selector: 'tw-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenu,\n outputs: ['closed'],\n },\n ],\n host: {\n '[class]': 'classes()',\n '[attr.aria-label]': 'ariaLabel() ?? null',\n '[attr.aria-labelledby]': 'ariaLabel() ? null : (ariaLabelledBy() ?? null)',\n '[animate.enter]': '\"scale-in\"',\n '[animate.leave]': '\"scale-out\"',\n },\n template: `<ng-content />`,\n})\nexport class MenuComponent {\n /** Controls item density and padding. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Accessible label for the menu panel. Use when no visible heading describes the menu (e.g. a kebab-icon trigger). */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an element that labels the menu panel. Ignored when `ariaLabel` is set. */\n readonly ariaLabelledBy = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n readonly classes = computed(() => menuVariants({ size: this.size() }));\n}\n\n// ── MenuTriggerDirective ──\n\n@Directive({\n selector: '[twMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkMenuTrigger,\n inputs: [\n 'cdkMenuTriggerFor: twMenuTrigger',\n // Forward CDK's positioning so consumers can anchor the menu (e.g. bottom-end vs bottom-start).\n // Accepts `ConnectedPosition[]` from `@angular/cdk/overlay`.\n 'cdkMenuPosition: position',\n // Forward menu context data so consumers can parameterise the template.\n 'cdkMenuTriggerData: data',\n ],\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\n },\n ],\n})\nexport class MenuTriggerDirective {}\n\n// ── ContextMenuTriggerDirective ──\n\n@Directive({\n selector: '[twContextMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkContextMenuTrigger,\n inputs: [\n 'cdkContextMenuTriggerFor: twContextMenuTrigger',\n 'cdkContextMenuDisabled: disabled',\n // Context menus open at pointer coordinates; `position` here tunes the\n // `ConnectedPosition[]` fallback list once CDK has anchored the overlay.\n 'cdkContextMenuPosition: position',\n 'cdkContextMenuTriggerData: data',\n ],\n outputs: ['cdkContextMenuOpened: opened', 'cdkContextMenuClosed: closed'],\n },\n ],\n})\nexport class ContextMenuTriggerDirective {}\n\n// ── MenuItemDirective ──\n\n@Directive({\n selector: '[twMenuItem]',\n hostDirectives: [\n {\n directive: CdkMenuItem,\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemDirective {\n /**\n * Semantic role tint applied to the item. Use `'error'` for destructive actions.\n * Defaults to `undefined` — no role tint is applied and the item inherits the\n * base `text-fg` styling at full prominence; `'neutral'` (the explicit muted\n * variant) is a distinct value with `text-fg-muted` + `bg-surface-muted` hovers.\n */\n readonly color = input<TwColor | undefined>(undefined);\n\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n private readonly menu = inject(MenuComponent, { optional: true });\n private readonly cdkItem = inject(CdkMenuItem);\n\n constructor() {\n // Single source of truth: the local `disabled` signal drives both visual state\n // and the underlying CDK directive's behavior (`disabled` is a plain property on CDK).\n effect(() => {\n this.cdkItem.disabled = this.disabled();\n });\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.menu?.size() ?? 'md',\n color: this.color(),\n disabled: this.disabled(),\n }),\n );\n}\n\n// ── MenuItemCheckboxComponent ──\n\n@Component({\n selector: '[twMenuItemCheckbox]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenuItemCheckbox,\n inputs: ['cdkMenuItemChecked: checked'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (cdkCheckbox.checked) {\n <svg class=\"size-full\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n </span>\n <ng-content />\n `,\n})\nexport class MenuItemCheckboxComponent {\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** Fires when the item is activated, carrying the new `checked` value after CDK toggles it. */\n readonly checkedChange = output<boolean>();\n\n protected readonly cdkCheckbox = inject(CdkMenuItemCheckbox);\n private readonly menu = inject(MenuComponent, { optional: true });\n\n private readonly resolvedSize = computed(() => this.menu?.size() ?? 'md');\n\n constructor() {\n effect(() => {\n this.cdkCheckbox.disabled = this.disabled();\n });\n // CDK fires `triggered` BEFORE updating `checked`; emit the post-toggle value.\n this.cdkCheckbox.triggered\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.checkedChange.emit(!this.cdkCheckbox.checked));\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.resolvedSize(),\n disabled: this.disabled(),\n }),\n );\n\n readonly indicatorClasses = computed(() =>\n menuItemIndicatorVariants({ size: this.resolvedSize() }),\n );\n}\n\n// ── MenuItemRadioComponent ──\n\n@Component({\n selector: '[twMenuItemRadio]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenuItemRadio,\n inputs: ['cdkMenuItemChecked: checked'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (cdkRadio.checked) {\n <svg class=\"size-full\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <circle cx=\"10\" cy=\"10\" r=\"5\"/>\n </svg>\n }\n </span>\n <ng-content />\n `,\n})\nexport class MenuItemRadioComponent {\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** Fires when the item is activated, carrying the new `checked` value after CDK selects it. */\n readonly checkedChange = output<boolean>();\n\n protected readonly cdkRadio = inject(CdkMenuItemRadio);\n private readonly menu = inject(MenuComponent, { optional: true });\n\n private readonly resolvedSize = computed(() => this.menu?.size() ?? 'md');\n\n constructor() {\n effect(() => {\n this.cdkRadio.disabled = this.disabled();\n });\n // Radio activation always selects the item; emit `true` (the post-trigger checked state).\n this.cdkRadio.triggered\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.checkedChange.emit(true));\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.resolvedSize(),\n disabled: this.disabled(),\n }),\n );\n\n readonly indicatorClasses = computed(() =>\n menuItemIndicatorVariants({ size: this.resolvedSize() }),\n );\n}\n\n// ── MenuGroupDirective ──\n\n@Directive({\n selector: '[twMenuGroup]',\n hostDirectives: [CdkMenuGroup],\n})\nexport class MenuGroupDirective {}\n\n// ── Content directives ──\n\n/** Styles a leading icon inside a menu item. */\n@Directive({\n selector: '[twMenuItemIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemIconDirective {\n private readonly menu = inject(MenuComponent, { optional: true });\n\n readonly classes = computed(() =>\n menuItemIconVariants({ size: this.menu?.size() ?? 'md' }),\n );\n}\n\n/** Styles secondary description text inside a menu item. */\n@Directive({\n selector: '[twMenuItemDescription]',\n host: {\n class: 'block text-xs text-fg-muted min-w-0 truncate order-last basis-full',\n },\n})\nexport class MenuItemDescriptionDirective {}\n\n/** Right-aligns and mutes keyboard shortcut hint text. */\n@Directive({\n selector: '[twMenuItemShortcut]',\n host: {\n class: 'ml-auto pl-3 text-xs text-fg-subtle tracking-wide',\n },\n})\nexport class MenuItemShortcutDirective {}\n\n/** Styles the trailing chevron for submenu triggers. */\n@Directive({\n selector: '[twMenuItemSubmenuIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemSubmenuIndicatorDirective {\n private readonly menu = inject(MenuComponent, { optional: true });\n\n readonly classes = computed(() =>\n menuItemSubmenuIndicatorVariants({ size: this.menu?.size() ?? 'md' }),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}