@memberjunction/ng-ui-components 6.2.0-edge.0 → 6.2.0-edge.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 (81) hide show
  1. package/README.md +35 -9
  2. package/dist/lib/a11y/named-control.base.d.ts +91 -0
  3. package/dist/lib/a11y/named-control.base.d.ts.map +1 -0
  4. package/dist/lib/a11y/named-control.base.js +121 -0
  5. package/dist/lib/a11y/named-control.base.js.map +1 -0
  6. package/dist/lib/a11y/unnamed-control-guard.d.ts +52 -0
  7. package/dist/lib/a11y/unnamed-control-guard.d.ts.map +1 -0
  8. package/dist/lib/a11y/unnamed-control-guard.js +94 -0
  9. package/dist/lib/a11y/unnamed-control-guard.js.map +1 -0
  10. package/dist/lib/accordion/accordion.component.d.ts +16 -4
  11. package/dist/lib/accordion/accordion.component.d.ts.map +1 -1
  12. package/dist/lib/accordion/accordion.component.js +36 -12
  13. package/dist/lib/accordion/accordion.component.js.map +1 -1
  14. package/dist/lib/applied-filters/applied-filters.component.js.map +1 -1
  15. package/dist/lib/button/button.directive.d.ts +34 -6
  16. package/dist/lib/button/button.directive.d.ts.map +1 -1
  17. package/dist/lib/button/button.directive.js +85 -25
  18. package/dist/lib/button/button.directive.js.map +1 -1
  19. package/dist/lib/card-grid/card-grid.component.d.ts +3 -1
  20. package/dist/lib/card-grid/card-grid.component.d.ts.map +1 -1
  21. package/dist/lib/card-grid/card-grid.component.js +13 -9
  22. package/dist/lib/card-grid/card-grid.component.js.map +1 -1
  23. package/dist/lib/clickable/clickable.directive.d.ts +11 -3
  24. package/dist/lib/clickable/clickable.directive.d.ts.map +1 -1
  25. package/dist/lib/clickable/clickable.directive.js +25 -5
  26. package/dist/lib/clickable/clickable.directive.js.map +1 -1
  27. package/dist/lib/combobox/combobox.component.d.ts +44 -3
  28. package/dist/lib/combobox/combobox.component.d.ts.map +1 -1
  29. package/dist/lib/combobox/combobox.component.js +135 -51
  30. package/dist/lib/combobox/combobox.component.js.map +1 -1
  31. package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts +6 -0
  32. package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts.map +1 -1
  33. package/dist/lib/confirm-dialog/confirm-dialog.component.js +16 -4
  34. package/dist/lib/confirm-dialog/confirm-dialog.component.js.map +1 -1
  35. package/dist/lib/datepicker/datepicker.component.d.ts +25 -2
  36. package/dist/lib/datepicker/datepicker.component.d.ts.map +1 -1
  37. package/dist/lib/datepicker/datepicker.component.js +98 -42
  38. package/dist/lib/datepicker/datepicker.component.js.map +1 -1
  39. package/dist/lib/dialog/dialog.component.d.ts +4 -0
  40. package/dist/lib/dialog/dialog.component.d.ts.map +1 -1
  41. package/dist/lib/dialog/dialog.component.js +12 -4
  42. package/dist/lib/dialog/dialog.component.js.map +1 -1
  43. package/dist/lib/dialog/dialog.service.js.map +1 -1
  44. package/dist/lib/dropdown/dropdown.component.d.ts +19 -44
  45. package/dist/lib/dropdown/dropdown.component.d.ts.map +1 -1
  46. package/dist/lib/dropdown/dropdown.component.js +37 -76
  47. package/dist/lib/dropdown/dropdown.component.js.map +1 -1
  48. package/dist/lib/dropdown/dropdown.scss +0 -16
  49. package/dist/lib/filter-panel/filter-panel.component.d.ts +8 -0
  50. package/dist/lib/filter-panel/filter-panel.component.d.ts.map +1 -1
  51. package/dist/lib/filter-panel/filter-panel.component.js +25 -9
  52. package/dist/lib/filter-panel/filter-panel.component.js.map +1 -1
  53. package/dist/lib/numeric-input/numeric-input.component.d.ts +15 -1
  54. package/dist/lib/numeric-input/numeric-input.component.d.ts.map +1 -1
  55. package/dist/lib/numeric-input/numeric-input.component.js +36 -9
  56. package/dist/lib/numeric-input/numeric-input.component.js.map +1 -1
  57. package/dist/lib/page-search/page-search.component.d.ts +32 -3
  58. package/dist/lib/page-search/page-search.component.d.ts.map +1 -1
  59. package/dist/lib/page-search/page-search.component.js +68 -12
  60. package/dist/lib/page-search/page-search.component.js.map +1 -1
  61. package/dist/lib/switch/switch.component.d.ts +22 -1
  62. package/dist/lib/switch/switch.component.d.ts.map +1 -1
  63. package/dist/lib/switch/switch.component.js +50 -16
  64. package/dist/lib/switch/switch.component.js.map +1 -1
  65. package/dist/lib/tabs/tab-chrome-guard.d.ts +2 -0
  66. package/dist/lib/tabs/tab-chrome-guard.d.ts.map +1 -1
  67. package/dist/lib/tabs/tab-chrome-guard.js +5 -1
  68. package/dist/lib/tabs/tab-chrome-guard.js.map +1 -1
  69. package/dist/lib/window/window.component.d.ts +10 -0
  70. package/dist/lib/window/window.component.d.ts.map +1 -1
  71. package/dist/lib/window/window.component.js +27 -7
  72. package/dist/lib/window/window.component.js.map +1 -1
  73. package/dist/lib/workspace-tabs/workspace-tab-strip.component.d.ts +10 -0
  74. package/dist/lib/workspace-tabs/workspace-tab-strip.component.d.ts.map +1 -1
  75. package/dist/lib/workspace-tabs/workspace-tab-strip.component.js +27 -7
  76. package/dist/lib/workspace-tabs/workspace-tab-strip.component.js.map +1 -1
  77. package/dist/public-api.d.ts +2 -0
  78. package/dist/public-api.d.ts.map +1 -1
  79. package/dist/public-api.js +2 -0
  80. package/dist/public-api.js.map +1 -1
  81. package/package.json +2 -2
@@ -51,7 +51,7 @@ export class MJAccordionTitleDirective {
51
51
  templateRef;
52
52
  constructor(templateRef) {
53
53
  this.templateRef = templateRef;
54
- }
54
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
55
55
  static ɵfac = function MJAccordionTitleDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJAccordionTitleDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
56
56
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJAccordionTitleDirective, selectors: [["", "mjAccordionTitle", ""]] });
57
57
  }
@@ -84,7 +84,7 @@ export class MJAccordionActionsDirective {
84
84
  templateRef;
85
85
  constructor(templateRef) {
86
86
  this.templateRef = templateRef;
87
- }
87
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
88
88
  static ɵfac = function MJAccordionActionsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJAccordionActionsDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
89
89
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJAccordionActionsDirective, selectors: [["", "mjAccordionActions", ""]] });
90
90
  }
@@ -118,7 +118,7 @@ export class MJAccordionBodyDirective {
118
118
  templateRef;
119
119
  constructor(templateRef) {
120
120
  this.templateRef = templateRef;
121
- }
121
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
122
122
  static ɵfac = function MJAccordionBodyDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJAccordionBodyDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
123
123
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJAccordionBodyDirective, selectors: [["", "mjAccordionBody", ""]] });
124
124
  }
@@ -213,9 +213,33 @@ export class MJAccordionPanelComponent {
213
213
  */
214
214
  Fill = false;
215
215
  ExpandedChange = new EventEmitter();
216
- titleTemplate = null;
217
- actionsTemplate = null;
218
- bodyTemplate = null;
216
+ TitleTemplate = null;
217
+ /** @deprecated Use {@link TitleTemplate}. */
218
+ get titleTemplate() {
219
+ return this.TitleTemplate;
220
+ }
221
+ /** @deprecated Use {@link TitleTemplate}. */
222
+ set titleTemplate(value) {
223
+ this.TitleTemplate = value;
224
+ }
225
+ ActionsTemplate = null;
226
+ /** @deprecated Use {@link ActionsTemplate}. */
227
+ get actionsTemplate() {
228
+ return this.ActionsTemplate;
229
+ }
230
+ /** @deprecated Use {@link ActionsTemplate}. */
231
+ set actionsTemplate(value) {
232
+ this.ActionsTemplate = value;
233
+ }
234
+ BodyTemplate = null;
235
+ /** @deprecated Use {@link BodyTemplate}. */
236
+ get bodyTemplate() {
237
+ return this.BodyTemplate;
238
+ }
239
+ /** @deprecated Use {@link BodyTemplate}. */
240
+ set bodyTemplate(value) {
241
+ this.BodyTemplate = value;
242
+ }
219
243
  hostClass = true;
220
244
  /** Host claims flex:1 of its parent ONLY while a Fill panel is expanded —
221
245
  * so a collapsed Fill panel sits at natural (header) height like any other. */
@@ -240,9 +264,9 @@ export class MJAccordionPanelComponent {
240
264
  i0.ɵɵcontentQuery(dirIndex, MJAccordionTitleDirective, 5)(dirIndex, MJAccordionActionsDirective, 5)(dirIndex, MJAccordionBodyDirective, 5);
241
265
  } if (rf & 2) {
242
266
  let _t;
243
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.titleTemplate = _t.first);
244
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.actionsTemplate = _t.first);
245
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.bodyTemplate = _t.first);
267
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TitleTemplate = _t.first);
268
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ActionsTemplate = _t.first);
269
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.BodyTemplate = _t.first);
246
270
  } }, hostVars: 4, hostBindings: function MJAccordionPanelComponent_HostBindings(rf, ctx) { if (rf & 2) {
247
271
  i0.ɵɵclassProp("mj-accordion-panel-host", ctx.hostClass)("mj-accordion-fill-active", ctx.fillActive);
248
272
  } }, inputs: { Title: "Title", Expanded: "Expanded", Disabled: "Disabled", Variant: "Variant", TitleIconMuted: "TitleIconMuted", Size: "Size", Bare: "Bare", FlushBody: "FlushBody", Fill: "Fill" }, outputs: { ExpandedChange: "ExpandedChange" }, ngContentSelectors: _c0, decls: 14, vars: 26, consts: [[1, "mj-accordion-panel"], [1, "mj-accordion-header-row"], ["type", "button", 1, "mj-accordion-header", 3, "click", "id", "disabled"], [1, "mj-accordion-title"], [3, "ngTemplateOutlet"], [1, "mj-accordion-actions"], ["type", "button", "tabindex", "-1", "aria-hidden", "true", 1, "mj-accordion-chevron", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down", "mj-accordion-icon"], [1, "mj-accordion-body-outer"], [1, "mj-accordion-body-clip"], ["role", "region", 1, "mj-accordion-body", 3, "id"]], template: function MJAccordionPanelComponent_Template(rf, ctx) { if (rf & 1) {
@@ -360,13 +384,13 @@ export class MJAccordionPanelComponent {
360
384
  type: Input
361
385
  }], ExpandedChange: [{
362
386
  type: Output
363
- }], titleTemplate: [{
387
+ }], TitleTemplate: [{
364
388
  type: ContentChild,
365
389
  args: [MJAccordionTitleDirective]
366
- }], actionsTemplate: [{
390
+ }], ActionsTemplate: [{
367
391
  type: ContentChild,
368
392
  args: [MJAccordionActionsDirective]
369
- }], bodyTemplate: [{
393
+ }], BodyTemplate: [{
370
394
  type: ContentChild,
371
395
  args: [MJAccordionBodyDirective]
372
396
  }], hostClass: [{
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.component.js","sourceRoot":"","sources":["../../../src/lib/accordion/accordion.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, HostBinding, ContentChild, TemplateRef, Directive, NgModule } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/** Process-wide counter for generating unique, stable accordion element ids\n * (used to wire `aria-controls` / `aria-labelledby` between header and body). */\nlet nextAccordionUid = 0;\n\n/**\n * Directive to mark a template as the accordion panel title.\n * Supports rich HTML content (icons, badges, dynamic text).\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * <span class=\"badge\">3</span>\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionTitle]',\n standalone: true\n})\nexport class MJAccordionTitleDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n/**\n * Directive to mark a template as the accordion header **actions** — interactive\n * controls (edit / copy / run / checkbox, etc.) that sit in the header row but\n * are NOT the expand/collapse toggle. Rendered as a sibling of the toggle\n * `<button>`, so there's no button-in-button and the toggle stays a clean,\n * accessible control.\n *\n * @example\n * ```html\n * <mj-accordion-panel>\n * <ng-template mjAccordionTitle>Connection</ng-template>\n * <ng-template mjAccordionActions>\n * <button mjButton variant=\"icon\" (click)=\"edit()\"><i class=\"fa fa-pen\"></i></button>\n * </ng-template>\n * …body…\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionActions]',\n standalone: true\n})\nexport class MJAccordionActionsDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n/**\n * Directive to mark a template as the accordion **body** — the panel's collapsible\n * content. Use this INSTEAD of placing content directly in the panel when the body\n * may be expensive (code editors, grids, large lists) OR just to be future-proof:\n * the accordion instantiates the template **lazily on first expand** and then keeps\n * it alive, so nothing is created until the user opens the panel, while later\n * open/close still animates. Consumers never have to reason about content weight or\n * write `@if (expanded)` themselves.\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"open\" (ExpandedChange)=\"open = $event\">\n * <ng-template mjAccordionTitle>Configuration</ng-template>\n * <ng-template mjAccordionBody>\n * <mj-code-editor ...></mj-code-editor> <!-- not created until first opened -->\n * </ng-template>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionBody]',\n standalone: true\n})\nexport class MJAccordionBodyDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n/**\n * mj-accordion-panel — Collapsible panel. Replaces `<kendo-panelbar-item>` and `<kendo-expansionpanel>`.\n *\n * Supports two title modes:\n * - Simple string: `[Title]=\"'Details'\"` — plain text title\n * - Rich template: `<ng-template mjAccordionTitle>` — HTML with icons, badges, etc.\n *\n * @example\n * ```html\n * <!-- Simple string title -->\n * <mj-accordion-panel Title=\"Details\" [Expanded]=\"true\">\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n *\n * <!-- Rich HTML title -->\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Component({\n selector: 'mj-accordion-panel',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"mj-accordion-panel\" [class.mj-accordion-panel--expanded]=\"Expanded\" [class.mj-accordion-panel--disabled]=\"Disabled\"\n [class.mj-accordion-panel--muted-icon]=\"TitleIconMuted\"\n [class.mj-accordion-panel--sm]=\"Size === 'sm'\"\n [class.mj-accordion-panel--bare]=\"Bare\"\n [class.mj-accordion-panel--flush-body]=\"FlushBody\"\n [class.mj-accordion-panel--fill]=\"Fill\"\n [attr.data-variant]=\"Variant !== 'default' ? Variant : null\">\n <div class=\"mj-accordion-header-row\">\n <button class=\"mj-accordion-header\" type=\"button\"\n [id]=\"HeaderId\"\n [attr.aria-expanded]=\"Expanded\"\n [attr.aria-controls]=\"BodyId\"\n [disabled]=\"Disabled\"\n (click)=\"Toggle()\">\n <span class=\"mj-accordion-title\">\n @if (titleTemplate) {\n <ng-container [ngTemplateOutlet]=\"titleTemplate.templateRef\"></ng-container>\n } @else {\n {{ Title }}\n }\n </span>\n </button>\n @if (actionsTemplate) {\n <div class=\"mj-accordion-actions\">\n <ng-container [ngTemplateOutlet]=\"actionsTemplate.templateRef\"></ng-container>\n </div>\n }\n <!-- The chevron is ALWAYS the rightmost element of the header row (after any\n actions). It's a secondary, a11y-hidden toggle affordance — the primary\n disclosure control is the title button above (which owns aria-expanded). -->\n <button class=\"mj-accordion-chevron\" type=\"button\" tabindex=\"-1\" aria-hidden=\"true\"\n [disabled]=\"Disabled\" (click)=\"Toggle()\">\n <i class=\"fa-solid fa-chevron-down mj-accordion-icon\"></i>\n </button>\n </div>\n <div class=\"mj-accordion-body-outer\" [attr.inert]=\"Expanded ? null : ''\">\n <div class=\"mj-accordion-body-clip\">\n <div class=\"mj-accordion-body\" role=\"region\" [id]=\"BodyId\" [attr.aria-labelledby]=\"HeaderId\">\n <!-- Legacy: content placed directly in the panel (eager). -->\n <ng-content></ng-content>\n <!-- Preferred: [mjAccordionBody] template — instantiated lazily on first\n expand, then kept alive so later toggles still animate. -->\n @if (bodyTemplate && (Expanded || hasBeenExpanded)) {\n <ng-container [ngTemplateOutlet]=\"bodyTemplate.templateRef\"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class MJAccordionPanelComponent {\n @Input() Title = '';\n private _expanded = false;\n /** Latches true the first time the panel is expanded; never resets. Lets a\n * [mjAccordionBody] template instantiate lazily on first open and then stay\n * alive so subsequent open/close still animates. */\n private _everExpanded = false;\n @Input()\n set Expanded(value: boolean) {\n this._expanded = value;\n if (value) this._everExpanded = true;\n }\n get Expanded(): boolean { return this._expanded; }\n protected get hasBeenExpanded(): boolean { return this._everExpanded; }\n @Input() Disabled = false;\n /**\n * Emphasis variant for visual hierarchy:\n * - `primary` — bold, solid brand-colored header (use to make a panel stand out)\n * - `secondary` — subtle brand tint\n * - `default` — standard neutral header\n * All brand-token-driven, so dark-mode-safe and themeable.\n */\n @Input() Variant: 'default' | 'primary' | 'secondary' = 'default';\n /**\n * Render icons projected into the title slot in the muted color instead of the\n * header's primary text color. Lets consumers get the common \"quiet icon\" look\n * without writing CSS. Status/brand-colored icons can still be colored inline.\n */\n @Input() TitleIconMuted = false;\n /**\n * Density. `md` (default) is the standard size; `sm` tightens header padding and\n * font for dense contexts (sidebars, flyouts, nested panels).\n */\n @Input() Size: 'sm' | 'md' = 'md';\n /**\n * Bare chrome — drop the panel's own border and header background so the panel\n * sits cleanly inside a host that already provides chrome (e.g. an expandable\n * card). The toggle/title/chevron/body still work; only the box styling is removed.\n */\n @Input() Bare = false;\n /**\n * Remove the body's default padding, for bodies that manage their own spacing\n * (code editors, full-bleed grids, custom forms).\n */\n @Input() FlushBody = false;\n /**\n * Fill mode — for \"rail section that owns the leftover height\" cases (e.g. an\n * entity tree or grid that should consume all remaining vertical space and\n * scroll *internally*), rather than the default \"reveal stacked content\"\n * disclosure. When set AND expanded, the panel becomes a flex column that\n * fills its flex parent and its body becomes a `flex:1; min-height:0` region —\n * the projected content is expected to provide its own scroll child. While\n * collapsed, the panel behaves exactly like a normal panel (header only,\n * natural height) and does NOT claim the leftover space.\n *\n * Requires the panel's parent to be a flex column with `min-height:0`.\n * Note: the open/close height animation is skipped in fill mode (the body\n * fills rather than animating to content height).\n */\n @Input() Fill = false;\n @Output() ExpandedChange = new EventEmitter<boolean>();\n @ContentChild(MJAccordionTitleDirective) titleTemplate: MJAccordionTitleDirective | null = null;\n @ContentChild(MJAccordionActionsDirective) actionsTemplate: MJAccordionActionsDirective | null = null;\n @ContentChild(MJAccordionBodyDirective) bodyTemplate: MJAccordionBodyDirective | null = null;\n @HostBinding('class.mj-accordion-panel-host') readonly hostClass = true;\n /** Host claims flex:1 of its parent ONLY while a Fill panel is expanded —\n * so a collapsed Fill panel sits at natural (header) height like any other. */\n @HostBinding('class.mj-accordion-fill-active') get fillActive(): boolean {\n return this.Fill && this.Expanded;\n }\n\n /** Stable per-instance ids that programmatically associate the header\n * `<button>` with its body region (`aria-controls` ↔ `aria-labelledby`),\n * completing the WAI-ARIA accordion pattern so screen readers announce the\n * region with the header's name. */\n private readonly _uid = nextAccordionUid++;\n readonly HeaderId = `mj-accordion-header-${this._uid}`;\n readonly BodyId = `mj-accordion-body-${this._uid}`;\n\n Toggle(): void {\n if (this.Disabled) return;\n this.Expanded = !this.Expanded;\n this.ExpandedChange.emit(this.Expanded);\n }\n}\n\n/**\n * Convenience module bundling the accordion panel + all of its slot directives.\n * Import this ONE symbol instead of listing the component and each directive\n * separately:\n *\n * ```ts\n * import { MJAccordionModule } from '@memberjunction/ng-ui-components';\n * @NgModule({ imports: [MJAccordionModule, ...] }) // or @Component standalone imports\n * ```\n *\n * Why a module (not a bare `const [...]` array): Angular's AOT compiler can't\n * statically expand a value-array imported across a compiled-package boundary in\n * an `imports` array (NG1010), and `as const` makes it a readonly tuple the\n * `imports` type rejects (TS2322). An NgModule is always a valid `imports` entry\n * in both NgModule and standalone consumers. Adding a future accordion directive\n * here makes it available to every consumer automatically — no per-module churn.\n */\n@NgModule({\n imports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n exports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n})\nexport class MJAccordionModule {}\n"]}
1
+ {"version":3,"file":"accordion.component.js","sourceRoot":"","sources":["../../../src/lib/accordion/accordion.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAe,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpI,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;;;;IA8HrC,2BAA4E;;;IAA9D,mEAA8C;;;IAE5D,YACF;;;IADE,6CACF;;;IAIF,8BAAkC;IAChC,2BAA8E;IAChF,iBAAM;;;IADU,cAAgD;IAAhD,qEAAgD;;;IAmB5D,2BAA2E;;;IAA7D,kEAA6C;;AAvJzE;kFACkF;AAClF,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;;;;;;;;;;;;;GAcG;AAKH,MAAM,OAAO,yBAAyB;IACjB;IAAnB,YAAmB,WAAiC;QAAjC,gBAAW,GAAX,WAAW,CAAsB;IAAG,CAAC,CAAE,sIAAsI;mHADrL,yBAAyB;6DAAzB,yBAAyB;;iFAAzB,yBAAyB;cAJrC,SAAS;eAAC;gBACT,QAAQ,EAAE,oBAAoB;gBAC9B,UAAU,EAAE,IAAI;aACjB;;AAKD;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,OAAO,2BAA2B;IACnB;IAAnB,YAAmB,WAAiC;QAAjC,gBAAW,GAAX,WAAW,CAAsB;IAAG,CAAC,CAAE,sIAAsI;qHADrL,2BAA2B;6DAA3B,2BAA2B;;iFAA3B,2BAA2B;cAJvC,SAAS;eAAC;gBACT,QAAQ,EAAE,sBAAsB;gBAChC,UAAU,EAAE,IAAI;aACjB;;AAKD;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,OAAO,wBAAwB;IAChB;IAAnB,YAAmB,WAAiC;QAAjC,gBAAW,GAAX,WAAW,CAAsB;IAAG,CAAC,CAAE,sIAAsI;kHADrL,wBAAwB;6DAAxB,wBAAwB;;iFAAxB,wBAAwB;cAJpC,SAAS;eAAC;gBACT,QAAQ,EAAE,mBAAmB;gBAC7B,UAAU,EAAE,IAAI;aACjB;;AAKD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAyDH,MAAM,OAAO,yBAAyB;IAC3B,KAAK,GAAG,EAAE,CAAC;IACZ,SAAS,GAAG,KAAK,CAAC;IAC1B;;yDAEqD;IAC7C,aAAa,GAAG,KAAK,CAAC;IAC9B,IACI,QAAQ,CAAC,KAAc;QACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,KAAK;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IACvC,CAAC;IACD,IAAI,QAAQ,KAAc,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,IAAc,eAAe,KAAc,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9D,QAAQ,GAAG,KAAK,CAAC;IAC1B;;;;;;OAMG;IACM,OAAO,GAAwC,SAAS,CAAC;IAClE;;;;OAIG;IACM,cAAc,GAAG,KAAK,CAAC;IAChC;;;OAGG;IACM,IAAI,GAAgB,IAAI,CAAC;IAClC;;;;OAIG;IACM,IAAI,GAAG,KAAK,CAAC;IACtB;;;OAGG;IACM,SAAS,GAAG,KAAK,CAAC;IAC3B;;;;;;;;;;;;;OAaG;IACM,IAAI,GAAG,KAAK,CAAC;IACZ,cAAc,GAAG,IAAI,YAAY,EAAW,CAAC;IACd,aAAa,GAAqC,IAAI,CAAC;IAEhG,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAI,aAAa,CAAC,KAAuC;QACvD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAC0C,eAAe,GAAuC,IAAI,CAAC;IAEtG,+CAA+C;IAC/C,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,+CAA+C;IAC/C,IAAI,eAAe,CAAC,KAAyC;QAC3D,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IACuC,YAAY,GAAoC,IAAI,CAAC;IAE7F,4CAA4C;IAC5C,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,4CAA4C;IAC5C,IAAI,YAAY,CAAC,KAAsC;QACrD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IACsD,SAAS,GAAG,IAAI,CAAC;IACxE;oFACgF;IAChF,IAAmD,UAAU;QAC3D,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED;;;yCAGqC;IACpB,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAClC,QAAQ,GAAG,uBAAuB,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,GAAG,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnD,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;mHA9GU,yBAAyB;6DAAzB,yBAAyB;wCA6DtB,yBAAyB,eAUzB,2BAA2B,eAU3B,wBAAwB;;;;;;;YAjF3B,wDAAyB,4CAAA;;;YA3C9B,AADF,AAPF,8BAM+D,aACxB,gBAMd;YAAnB,sGAAS,YAAQ,IAAC;YAClB,+BAAiC;YAG7B,AAFF,oGAAqB,2DAEZ;YAIb,AADE,iBAAO,EACA;YACT,2FAAuB;YAQvB,iCAC2C;YAAnB,sGAAS,YAAQ,IAAC;YACxC,uBAA0D;YAE9D,AADE,iBAAS,EACL;YAGF,AADF,AADF,8BAAyE,cACnC,eAC2D;YAE3F,mBAAyB;YAGzB,sGAAqD;YAM7D,AADE,AADE,AADE,iBAAM,EACF,EACF,EACF;;YA3CJ,AADA,AADA,AADA,AADA,AAD8E,AAAhD,4DAA+C,8CAAgD,sDACtE,6CACT,sCACP,iDACW,sCACX;;YAInC,eAAe;YAGf,AAHA,iCAAe,0BAGM;;YAGnB,eAIC;YAJD,2CAIC;YAGL,eAIC;YAJD,8CAIC;YAKC,cAAqB;YAArB,uCAAqB;YAIY,eAAmC;;YAEvB,eAAa;YAAb,+BAAa;;YAKxD,eAEC;YAFD,qFAEC;4BA9CD,gBAAgB;;iFAqDf,yBAAyB;cAxDrC,SAAS;eAAC;gBACT,QAAQ,EAAE,oBAAoB;gBAC9B,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,gBAAgB,CAAC;gBAC3B,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDT;aACF;;kBAEE,KAAK;;kBAML,KAAK;;kBAOL,KAAK;;kBAQL,KAAK;;kBAML,KAAK;;kBAKL,KAAK;;kBAML,KAAK;;kBAKL,KAAK;;kBAeL,KAAK;;kBACL,MAAM;;kBACN,YAAY;mBAAC,yBAAyB;;kBAUtC,YAAY;mBAAC,2BAA2B;;kBAUxC,YAAY;mBAAC,wBAAwB;;kBAUrC,WAAW;mBAAC,+BAA+B;;kBAG3C,WAAW;mBAAC,gCAAgC;;kFA9FlC,yBAAyB;AAiHtC;;;;;;;;;;;;;;;;GAgBG;AAeH,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;;;iFAAjB,iBAAiB;cAd7B,QAAQ;eAAC;gBACR,OAAO,EAAE;oBACP,yBAAyB;oBACzB,yBAAyB;oBACzB,2BAA2B;oBAC3B,wBAAwB;iBACzB;gBACD,OAAO,EAAE;oBACP,yBAAyB;oBACzB,yBAAyB;oBACzB,2BAA2B;oBAC3B,wBAAwB;iBACzB;aACF;;wFACY,iBAAiB,cAhJjB,yBAAyB,EAxIzB,yBAAyB,EA0BzB,2BAA2B,EA2B3B,wBAAwB,aAmFxB,yBAAyB,EAxIzB,yBAAyB,EA0BzB,2BAA2B,EA2B3B,wBAAwB","sourcesContent":["import { Component, Input, Output, EventEmitter, HostBinding, ContentChild, TemplateRef, Directive, NgModule } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/** Process-wide counter for generating unique, stable accordion element ids\n * (used to wire `aria-controls` / `aria-labelledby` between header and body). */\nlet nextAccordionUid = 0;\n\n/**\n * Directive to mark a template as the accordion panel title.\n * Supports rich HTML content (icons, badges, dynamic text).\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * <span class=\"badge\">3</span>\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionTitle]',\n standalone: true\n})\nexport class MJAccordionTitleDirective {\n constructor(public templateRef: TemplateRef<unknown>) {} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n}\n\n/**\n * Directive to mark a template as the accordion header **actions** — interactive\n * controls (edit / copy / run / checkbox, etc.) that sit in the header row but\n * are NOT the expand/collapse toggle. Rendered as a sibling of the toggle\n * `<button>`, so there's no button-in-button and the toggle stays a clean,\n * accessible control.\n *\n * @example\n * ```html\n * <mj-accordion-panel>\n * <ng-template mjAccordionTitle>Connection</ng-template>\n * <ng-template mjAccordionActions>\n * <button mjButton variant=\"icon\" (click)=\"edit()\"><i class=\"fa fa-pen\"></i></button>\n * </ng-template>\n * …body…\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionActions]',\n standalone: true\n})\nexport class MJAccordionActionsDirective {\n constructor(public templateRef: TemplateRef<unknown>) {} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n}\n\n/**\n * Directive to mark a template as the accordion **body** — the panel's collapsible\n * content. Use this INSTEAD of placing content directly in the panel when the body\n * may be expensive (code editors, grids, large lists) OR just to be future-proof:\n * the accordion instantiates the template **lazily on first expand** and then keeps\n * it alive, so nothing is created until the user opens the panel, while later\n * open/close still animates. Consumers never have to reason about content weight or\n * write `@if (expanded)` themselves.\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"open\" (ExpandedChange)=\"open = $event\">\n * <ng-template mjAccordionTitle>Configuration</ng-template>\n * <ng-template mjAccordionBody>\n * <mj-code-editor ...></mj-code-editor> <!-- not created until first opened -->\n * </ng-template>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionBody]',\n standalone: true\n})\nexport class MJAccordionBodyDirective {\n constructor(public templateRef: TemplateRef<unknown>) {} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n}\n\n/**\n * mj-accordion-panel — Collapsible panel. Replaces `<kendo-panelbar-item>` and `<kendo-expansionpanel>`.\n *\n * Supports two title modes:\n * - Simple string: `[Title]=\"'Details'\"` — plain text title\n * - Rich template: `<ng-template mjAccordionTitle>` — HTML with icons, badges, etc.\n *\n * @example\n * ```html\n * <!-- Simple string title -->\n * <mj-accordion-panel Title=\"Details\" [Expanded]=\"true\">\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n *\n * <!-- Rich HTML title -->\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Component({\n selector: 'mj-accordion-panel',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"mj-accordion-panel\" [class.mj-accordion-panel--expanded]=\"Expanded\" [class.mj-accordion-panel--disabled]=\"Disabled\"\n [class.mj-accordion-panel--muted-icon]=\"TitleIconMuted\"\n [class.mj-accordion-panel--sm]=\"Size === 'sm'\"\n [class.mj-accordion-panel--bare]=\"Bare\"\n [class.mj-accordion-panel--flush-body]=\"FlushBody\"\n [class.mj-accordion-panel--fill]=\"Fill\"\n [attr.data-variant]=\"Variant !== 'default' ? Variant : null\">\n <div class=\"mj-accordion-header-row\">\n <button class=\"mj-accordion-header\" type=\"button\"\n [id]=\"HeaderId\"\n [attr.aria-expanded]=\"Expanded\"\n [attr.aria-controls]=\"BodyId\"\n [disabled]=\"Disabled\"\n (click)=\"Toggle()\">\n <span class=\"mj-accordion-title\">\n @if (titleTemplate) {\n <ng-container [ngTemplateOutlet]=\"titleTemplate.templateRef\"></ng-container>\n } @else {\n {{ Title }}\n }\n </span>\n </button>\n @if (actionsTemplate) {\n <div class=\"mj-accordion-actions\">\n <ng-container [ngTemplateOutlet]=\"actionsTemplate.templateRef\"></ng-container>\n </div>\n }\n <!-- The chevron is ALWAYS the rightmost element of the header row (after any\n actions). It's a secondary, a11y-hidden toggle affordance — the primary\n disclosure control is the title button above (which owns aria-expanded). -->\n <button class=\"mj-accordion-chevron\" type=\"button\" tabindex=\"-1\" aria-hidden=\"true\"\n [disabled]=\"Disabled\" (click)=\"Toggle()\">\n <i class=\"fa-solid fa-chevron-down mj-accordion-icon\"></i>\n </button>\n </div>\n <div class=\"mj-accordion-body-outer\" [attr.inert]=\"Expanded ? null : ''\">\n <div class=\"mj-accordion-body-clip\">\n <div class=\"mj-accordion-body\" role=\"region\" [id]=\"BodyId\" [attr.aria-labelledby]=\"HeaderId\">\n <!-- Legacy: content placed directly in the panel (eager). -->\n <ng-content></ng-content>\n <!-- Preferred: [mjAccordionBody] template — instantiated lazily on first\n expand, then kept alive so later toggles still animate. -->\n @if (bodyTemplate && (Expanded || hasBeenExpanded)) {\n <ng-container [ngTemplateOutlet]=\"bodyTemplate.templateRef\"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class MJAccordionPanelComponent {\n @Input() Title = '';\n private _expanded = false;\n /** Latches true the first time the panel is expanded; never resets. Lets a\n * [mjAccordionBody] template instantiate lazily on first open and then stay\n * alive so subsequent open/close still animates. */\n private _everExpanded = false;\n @Input()\n set Expanded(value: boolean) {\n this._expanded = value;\n if (value) this._everExpanded = true;\n }\n get Expanded(): boolean { return this._expanded; }\n protected get hasBeenExpanded(): boolean { return this._everExpanded; }\n @Input() Disabled = false;\n /**\n * Emphasis variant for visual hierarchy:\n * - `primary` — bold, solid brand-colored header (use to make a panel stand out)\n * - `secondary` — subtle brand tint\n * - `default` — standard neutral header\n * All brand-token-driven, so dark-mode-safe and themeable.\n */\n @Input() Variant: 'default' | 'primary' | 'secondary' = 'default';\n /**\n * Render icons projected into the title slot in the muted color instead of the\n * header's primary text color. Lets consumers get the common \"quiet icon\" look\n * without writing CSS. Status/brand-colored icons can still be colored inline.\n */\n @Input() TitleIconMuted = false;\n /**\n * Density. `md` (default) is the standard size; `sm` tightens header padding and\n * font for dense contexts (sidebars, flyouts, nested panels).\n */\n @Input() Size: 'sm' | 'md' = 'md';\n /**\n * Bare chrome — drop the panel's own border and header background so the panel\n * sits cleanly inside a host that already provides chrome (e.g. an expandable\n * card). The toggle/title/chevron/body still work; only the box styling is removed.\n */\n @Input() Bare = false;\n /**\n * Remove the body's default padding, for bodies that manage their own spacing\n * (code editors, full-bleed grids, custom forms).\n */\n @Input() FlushBody = false;\n /**\n * Fill mode — for \"rail section that owns the leftover height\" cases (e.g. an\n * entity tree or grid that should consume all remaining vertical space and\n * scroll *internally*), rather than the default \"reveal stacked content\"\n * disclosure. When set AND expanded, the panel becomes a flex column that\n * fills its flex parent and its body becomes a `flex:1; min-height:0` region —\n * the projected content is expected to provide its own scroll child. While\n * collapsed, the panel behaves exactly like a normal panel (header only,\n * natural height) and does NOT claim the leftover space.\n *\n * Requires the panel's parent to be a flex column with `min-height:0`.\n * Note: the open/close height animation is skipped in fill mode (the body\n * fills rather than animating to content height).\n */\n @Input() Fill = false;\n @Output() ExpandedChange = new EventEmitter<boolean>();\n @ContentChild(MJAccordionTitleDirective) TitleTemplate: MJAccordionTitleDirective | null = null;\n\n /** @deprecated Use {@link TitleTemplate}. */\n get titleTemplate(): MJAccordionTitleDirective | null {\n return this.TitleTemplate;\n }\n /** @deprecated Use {@link TitleTemplate}. */\n set titleTemplate(value: MJAccordionTitleDirective | null) {\n this.TitleTemplate = value;\n }\n @ContentChild(MJAccordionActionsDirective) ActionsTemplate: MJAccordionActionsDirective | null = null;\n\n /** @deprecated Use {@link ActionsTemplate}. */\n get actionsTemplate(): MJAccordionActionsDirective | null {\n return this.ActionsTemplate;\n }\n /** @deprecated Use {@link ActionsTemplate}. */\n set actionsTemplate(value: MJAccordionActionsDirective | null) {\n this.ActionsTemplate = value;\n }\n @ContentChild(MJAccordionBodyDirective) BodyTemplate: MJAccordionBodyDirective | null = null;\n\n /** @deprecated Use {@link BodyTemplate}. */\n get bodyTemplate(): MJAccordionBodyDirective | null {\n return this.BodyTemplate;\n }\n /** @deprecated Use {@link BodyTemplate}. */\n set bodyTemplate(value: MJAccordionBodyDirective | null) {\n this.BodyTemplate = value;\n }\n @HostBinding('class.mj-accordion-panel-host') readonly hostClass = true;\n /** Host claims flex:1 of its parent ONLY while a Fill panel is expanded —\n * so a collapsed Fill panel sits at natural (header) height like any other. */\n @HostBinding('class.mj-accordion-fill-active') get fillActive(): boolean {\n return this.Fill && this.Expanded;\n }\n\n /** Stable per-instance ids that programmatically associate the header\n * `<button>` with its body region (`aria-controls` ↔ `aria-labelledby`),\n * completing the WAI-ARIA accordion pattern so screen readers announce the\n * region with the header's name. */\n private readonly _uid = nextAccordionUid++;\n readonly HeaderId = `mj-accordion-header-${this._uid}`;\n readonly BodyId = `mj-accordion-body-${this._uid}`;\n\n Toggle(): void {\n if (this.Disabled) return;\n this.Expanded = !this.Expanded;\n this.ExpandedChange.emit(this.Expanded);\n }\n}\n\n/**\n * Convenience module bundling the accordion panel + all of its slot directives.\n * Import this ONE symbol instead of listing the component and each directive\n * separately:\n *\n * ```ts\n * import { MJAccordionModule } from '@memberjunction/ng-ui-components';\n * @NgModule({ imports: [MJAccordionModule, ...] }) // or @Component standalone imports\n * ```\n *\n * Why a module (not a bare `const [...]` array): Angular's AOT compiler can't\n * statically expand a value-array imported across a compiled-package boundary in\n * an `imports` array (NG1010), and `as const` makes it a readonly tuple the\n * `imports` type rejects (TS2322). An NgModule is always a valid `imports` entry\n * in both NgModule and standalone consumers. Adding a future accordion directive\n * here makes it available to every consumer automatically — no per-module churn.\n */\n@NgModule({\n imports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n exports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n})\nexport class MJAccordionModule {}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"applied-filters.component.js","sourceRoot":"","sources":["../../../src/lib/applied-filters/applied-filters.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;;IAgD3D,AADF,kCAAwC,cACF;IAAA,YAAc;IAAA,oBAAO;IACzD,kCAAoC;IAAA,YAAa;IAAA,oBAAO;IACxD,oCAIwB;IAAtB,8NAAS,qBAAW,KAAC;IACrB,0BAAoD;IAExD,AADE,oBAAS,EACJ;;;IAT+B,eAAc;IAAd,0CAAc;IACd,eAAa;IAAb,gCAAa;IAI/C,cAAuD;;;;;IAR7D,AADF,iCAAgC,cACS;IAAA,YAAe;IAAA,oBAAO;IAC7D,2GAYC;IACD,oCAA+E;IAAvB,gMAAS,mBAAY,KAAC;IAC5E,YACF;IACF,AADE,oBAAS,EACL;;;IAjBmC,eAAe;IAAf,sCAAe;IACtD,cAYC;IAZD,6BAYC;IAEC,eACF;IADE,qDACF;;AA7CR;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA6HH,MAAM,OAAO,yBAAyB;IACpC,iEAAiE;IACxD,OAAO,GAAoB,EAAE,CAAC;IAEvC,oEAAoE;IAC3D,SAAS,GAAW,aAAa,CAAC;IAE3C,6DAA6D;IACpD,aAAa,GAAW,WAAW,CAAC;IAE7C,mDAAmD;IACzC,MAAM,GAAG,IAAI,YAAY,EAAiB,CAAC;IAErD,oDAAoD;IAC1C,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE9C,QAAQ,CAAC,MAAqB;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;mHAtBU,yBAAyB;6DAAzB,yBAAyB;YAxHlC,2FAA0B;;YAA1B,iDAoBC;;;iFAoGQ,yBAAyB;cA5HrC,SAAS;2BACE,oBAAoB,cAClB,IAAI,YACN;;;;;;;;;;;;;;;;;;;;;;GAsBT;;kBAqGA,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kFAdI,yBAAyB","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n/**\n * One applied filter, as surfaced in the `mj-applied-filters` chip row.\n * `label` is the dimension (e.g. \"Status\"), `value` is the human-readable\n * selection (e.g. \"Active\"), `key` uniquely identifies it for removal.\n */\nexport interface AppliedFilter {\n /** Stable identifier emitted on removal — typically `<field>:<value>`. */\n key: string;\n /** Dimension label shown before the colon (e.g. \"Status\", \"Sort\"). */\n label: string;\n /** Human-readable applied value shown after the colon (e.g. \"Active\"). */\n value: string;\n}\n\n/**\n * `mj-applied-filters` — the \"Filtered by …\" chip row that renders the *state*\n * of filtering, separate from the *input* (a single `mj-filter-popover`\n * \"Filter\" button). Each applied filter shows as a removable pill; a \"Clear\n * all\" link clears the lot.\n *\n * Part of the concise-chrome model: one Filter entry point sets filters, this\n * row shows what's on and removes them individually. Identical on desktop\n * (chips wrap) and mobile (chips scroll horizontally) — nothing new to learn\n * between breakpoints.\n *\n * Renders nothing when `Filters` is empty, so consumers can place it\n * unconditionally above their content.\n *\n * ## Example\n * ```html\n * <mj-applied-filters\n * [Filters]=\"appliedFilters\"\n * (Remove)=\"onRemoveFilter($event)\"\n * (ClearAll)=\"resetAllFilters()\">\n * </mj-applied-filters>\n * ```\n */\n@Component({\n selector: 'mj-applied-filters',\n standalone: true,\n template: `\n @if (Filters.length > 0) {\n <div class=\"mj-applied-filters\">\n <span class=\"mj-applied-filters__lead\">{{ LeadLabel }}</span>\n @for (f of Filters; track f.key) {\n <span class=\"mj-applied-filters__token\">\n <span class=\"mj-applied-filters__k\">{{ f.label }}:</span>\n <span class=\"mj-applied-filters__v\">{{ f.value }}</span>\n <button\n type=\"button\"\n class=\"mj-applied-filters__x\"\n [attr.aria-label]=\"'Remove ' + f.label + ' ' + f.value\"\n (click)=\"OnRemove(f)\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n <button type=\"button\" class=\"mj-applied-filters__clear\" (click)=\"OnClearAll()\">\n {{ ClearAllLabel }}\n </button>\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .mj-applied-filters {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-5);\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .mj-applied-filters__lead {\n flex-shrink: 0;\n margin-right: 2px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__token {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n height: 30px;\n padding: 0 5px 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .mj-applied-filters__k {\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__v {\n color: var(--mj-text-primary);\n font-weight: 600;\n }\n\n .mj-applied-filters__x {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border: none;\n background: transparent;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n }\n .mj-applied-filters__x:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .mj-applied-filters__clear {\n flex-shrink: 0;\n margin-left: 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n .mj-applied-filters__clear:hover {\n text-decoration: underline;\n }\n\n /* Mobile: the chip row scrolls horizontally rather than wrapping, so it\n stays a single compact line. */\n @media (max-width: 700px) {\n .mj-applied-filters {\n overflow-x: auto;\n flex-wrap: nowrap;\n scrollbar-width: none;\n -webkit-overflow-scrolling: touch;\n padding-left: var(--mj-space-4);\n padding-right: var(--mj-space-4);\n }\n .mj-applied-filters::-webkit-scrollbar {\n display: none;\n }\n }\n `]\n})\nexport class MJAppliedFiltersComponent {\n /** The currently-applied filters rendered as removable chips. */\n @Input() Filters: AppliedFilter[] = [];\n\n /** Lead label shown before the chips. Defaults to \"Filtered by\". */\n @Input() LeadLabel: string = 'Filtered by';\n\n /** Label for the clear-all link. Defaults to \"Clear all\". */\n @Input() ClearAllLabel: string = 'Clear all';\n\n /** Emitted when a single filter's ✕ is clicked. */\n @Output() Remove = new EventEmitter<AppliedFilter>();\n\n /** Emitted when the \"Clear all\" link is clicked. */\n @Output() ClearAll = new EventEmitter<void>();\n\n OnRemove(filter: AppliedFilter): void {\n this.Remove.emit(filter);\n }\n\n OnClearAll(): void {\n this.ClearAll.emit();\n }\n}\n"]}
1
+ {"version":3,"file":"applied-filters.component.js","sourceRoot":"","sources":["../../../src/lib/applied-filters/applied-filters.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;;IAgD3D,AADF,kCAAwC,cACF;IAAA,YAAc;IAAA,oBAAO;IACzD,kCAAoC;IAAA,YAAa;IAAA,oBAAO;IACxD,oCAIwB;IAAtB,8NAAS,qBAAW,KAAC;IACrB,0BAAoD;IAExD,AADE,oBAAS,EACJ;;;IAT+B,eAAc;IAAd,0CAAc;IACd,eAAa;IAAb,gCAAa;IAI/C,cAAuD;;;;;IAR7D,AADF,iCAAgC,cACS;IAAA,YAAe;IAAA,oBAAO;IAC7D,2GAYC;IACD,oCAA+E;IAAvB,gMAAS,mBAAY,KAAC;IAC5E,YACF;IACF,AADE,oBAAS,EACL;;;IAjBmC,eAAe;IAAf,sCAAe;IACtD,cAYC;IAZD,6BAYC;IAEC,eACF;IADE,qDACF;;AA7CR;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA6HH,MAAM,OAAO,yBAAyB;IACpC,iEAAiE;IACxD,OAAO,GAAoB,EAAE,CAAC;IAEvC,oEAAoE;IAC3D,SAAS,GAAW,aAAa,CAAC;IAE3C,6DAA6D;IACpD,aAAa,GAAW,WAAW,CAAC;IAE7C,mDAAmD;IACzC,MAAM,GAAG,IAAI,YAAY,EAAiB,CAAC;IAErD,oDAAoD;IAC1C,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE9C,QAAQ,CAAC,MAAqB;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;mHAtBU,yBAAyB;6DAAzB,yBAAyB;YAxHlC,2FAA0B;;YAA1B,iDAoBC;;;iFAoGQ,yBAAyB;cA5HrC,SAAS;2BACE,oBAAoB,cAClB,IAAI,YACN;;;;;;;;;;;;;;;;;;;;;;GAsBT;;kBAqGA,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kFAdI,yBAAyB","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n/**\n * One applied filter, as surfaced in the `mj-applied-filters` chip row.\n * `label` is the dimension (e.g. \"Status\"), `value` is the human-readable\n * selection (e.g. \"Active\"), `key` uniquely identifies it for removal.\n */\nexport interface AppliedFilter {\n /** Stable identifier emitted on removal — typically `<field>:<value>`. */\n key: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Dimension label shown before the colon (e.g. \"Status\", \"Sort\"). */\n label: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Human-readable applied value shown after the colon (e.g. \"Active\"). */\n value: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n}\n\n/**\n * `mj-applied-filters` — the \"Filtered by …\" chip row that renders the *state*\n * of filtering, separate from the *input* (a single `mj-filter-popover`\n * \"Filter\" button). Each applied filter shows as a removable pill; a \"Clear\n * all\" link clears the lot.\n *\n * Part of the concise-chrome model: one Filter entry point sets filters, this\n * row shows what's on and removes them individually. Identical on desktop\n * (chips wrap) and mobile (chips scroll horizontally) — nothing new to learn\n * between breakpoints.\n *\n * Renders nothing when `Filters` is empty, so consumers can place it\n * unconditionally above their content.\n *\n * ## Example\n * ```html\n * <mj-applied-filters\n * [Filters]=\"appliedFilters\"\n * (Remove)=\"onRemoveFilter($event)\"\n * (ClearAll)=\"resetAllFilters()\">\n * </mj-applied-filters>\n * ```\n */\n@Component({\n selector: 'mj-applied-filters',\n standalone: true,\n template: `\n @if (Filters.length > 0) {\n <div class=\"mj-applied-filters\">\n <span class=\"mj-applied-filters__lead\">{{ LeadLabel }}</span>\n @for (f of Filters; track f.key) {\n <span class=\"mj-applied-filters__token\">\n <span class=\"mj-applied-filters__k\">{{ f.label }}:</span>\n <span class=\"mj-applied-filters__v\">{{ f.value }}</span>\n <button\n type=\"button\"\n class=\"mj-applied-filters__x\"\n [attr.aria-label]=\"'Remove ' + f.label + ' ' + f.value\"\n (click)=\"OnRemove(f)\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n <button type=\"button\" class=\"mj-applied-filters__clear\" (click)=\"OnClearAll()\">\n {{ ClearAllLabel }}\n </button>\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .mj-applied-filters {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-5);\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .mj-applied-filters__lead {\n flex-shrink: 0;\n margin-right: 2px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__token {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n height: 30px;\n padding: 0 5px 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .mj-applied-filters__k {\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__v {\n color: var(--mj-text-primary);\n font-weight: 600;\n }\n\n .mj-applied-filters__x {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border: none;\n background: transparent;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n }\n .mj-applied-filters__x:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .mj-applied-filters__clear {\n flex-shrink: 0;\n margin-left: 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n .mj-applied-filters__clear:hover {\n text-decoration: underline;\n }\n\n /* Mobile: the chip row scrolls horizontally rather than wrapping, so it\n stays a single compact line. */\n @media (max-width: 700px) {\n .mj-applied-filters {\n overflow-x: auto;\n flex-wrap: nowrap;\n scrollbar-width: none;\n -webkit-overflow-scrolling: touch;\n padding-left: var(--mj-space-4);\n padding-right: var(--mj-space-4);\n }\n .mj-applied-filters::-webkit-scrollbar {\n display: none;\n }\n }\n `]\n})\nexport class MJAppliedFiltersComponent {\n /** The currently-applied filters rendered as removable chips. */\n @Input() Filters: AppliedFilter[] = [];\n\n /** Lead label shown before the chips. Defaults to \"Filtered by\". */\n @Input() LeadLabel: string = 'Filtered by';\n\n /** Label for the clear-all link. Defaults to \"Clear all\". */\n @Input() ClearAllLabel: string = 'Clear all';\n\n /** Emitted when a single filter's ✕ is clicked. */\n @Output() Remove = new EventEmitter<AppliedFilter>();\n\n /** Emitted when the \"Clear all\" link is clicked. */\n @Output() ClearAll = new EventEmitter<void>();\n\n OnRemove(filter: AppliedFilter): void {\n this.Remove.emit(filter);\n }\n\n OnClearAll(): void {\n this.ClearAll.emit();\n }\n}\n"]}
@@ -28,10 +28,34 @@ export type MjButtonSize = 'sm' | 'md' | 'lg';
28
28
  */
29
29
  export declare class MJButtonDirective implements AfterContentInit {
30
30
  private readonly host;
31
- variant: MjButtonVariant;
32
- size: MjButtonSize;
33
- toggleable: boolean;
34
- selected: boolean;
31
+ Variant: MjButtonVariant;
32
+ /** @deprecated Use {@link Variant}. */
33
+ set variant(value: MjButtonVariant);
34
+ /** @deprecated Use {@link Variant}. */
35
+ get variant(): MjButtonVariant;
36
+ Size: MjButtonSize;
37
+ /** @deprecated Use {@link Size}. */
38
+ set size(value: MjButtonSize);
39
+ /** @deprecated Use {@link Size}. */
40
+ get size(): MjButtonSize;
41
+ Toggleable: boolean;
42
+ /** @deprecated Use {@link Toggleable}. */
43
+ set toggleable(value: MJButtonDirective['Toggleable']);
44
+ /** @deprecated Use {@link Toggleable}. */
45
+ get toggleable(): MJButtonDirective['Toggleable'];
46
+ Selected: boolean;
47
+ /** @deprecated Use {@link Selected}. */
48
+ set selected(value: MJButtonDirective['Selected']);
49
+ /** @deprecated Use {@link Selected}. */
50
+ get selected(): MJButtonDirective['Selected'];
51
+ SelectedChange: EventEmitter<boolean>;
52
+ /**
53
+ * @deprecated Use {@link SelectedChange}.
54
+ *
55
+ * The same emitter under the old binding name, so a template still binding
56
+ * (selectedChange) keeps working. Must stay AFTER SelectedChange: class fields
57
+ * initialise in order, and the other way round this captures undefined.
58
+ */
35
59
  selectedChange: EventEmitter<boolean>;
36
60
  constructor(host: ElementRef<HTMLElement>);
37
61
  /**
@@ -39,8 +63,12 @@ export declare class MJButtonDirective implements AfterContentInit {
39
63
  * (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored
40
64
  * `aria-label="..."` on the element is never clobbered.
41
65
  */
42
- set ariaLabel(value: string | null | undefined);
66
+ set AriaLabel(value: string | null | undefined);
67
+ get AriaLabel(): string | undefined;
68
+ /** @deprecated Use {@link AriaLabel}. */
43
69
  get ariaLabel(): string | undefined;
70
+ /** @deprecated Use {@link AriaLabel}. */
71
+ set ariaLabel(value: string | null | undefined);
44
72
  private _ariaLabel?;
45
73
  readonly baseClass = true;
46
74
  get isPrimary(): boolean;
@@ -63,6 +91,6 @@ export declare class MJButtonDirective implements AfterContentInit {
63
91
  */
64
92
  ngAfterContentInit(): void;
65
93
  static ɵfac: i0.ɵɵFactoryDeclaration<MJButtonDirective, never>;
66
- static ɵdir: i0.ɵɵDirectiveDeclaration<MJButtonDirective, "button[mjButton], a[mjButton]", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "toggleable": { "alias": "toggleable"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "selectedChange": "selectedChange"; }, never, never, true, never>;
94
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MJButtonDirective, "button[mjButton], a[mjButton]", never, { "Variant": { "alias": "Variant"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "Size": { "alias": "Size"; "required": false; }; "size": { "alias": "size"; "required": false; }; "Toggleable": { "alias": "Toggleable"; "required": false; }; "toggleable": { "alias": "toggleable"; "required": false; }; "Selected": { "alias": "Selected"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "AriaLabel": { "alias": "AriaLabel"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "SelectedChange": "SelectedChange"; "selectedChange": "selectedChange"; }, never, never, true, never>;
67
95
  }
68
96
  //# sourceMappingURL=button.directive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.directive.d.ts","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGZ,UAAU,EACV,gBAAgB,EAEjB,MAAM,eAAe,CAAC;;AAEvB,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAIa,iBAAkB,YAAW,gBAAgB;IAS5C,OAAO,CAAC,QAAQ,CAAC,IAAI;IARxB,OAAO,EAAE,eAAe,CAAe;IACvC,IAAI,EAAE,YAAY,CAAQ;IAC1B,UAAU,UAAS;IACnB,QAAQ,UAAS;IAChB,cAAc,wBAA+B;gBAI1B,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC;IAE1D;;;;OAIG;IACH,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAK7C;IACD,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IACD,OAAO,CAAC,UAAU,CAAC,CAAS;IAEC,QAAQ,CAAC,SAAS,QAAQ;IAEvD,IAA0C,SAAS,YAAyC;IAC5F,IAA4C,WAAW,YAA2C;IAClG,IAA0C,SAAS,YAAyC;IAC5F,IAAuC,MAAM,YAAsC;IACnF,IAAyC,QAAQ,YAAwC;IACzF,IAAuC,MAAM,YAAsC;IACnF,IAA0C,SAAS,YAAyC;IAC5F,IAA0C,SAAS,YAAyC;IAE5F,IAAqC,IAAI,YAAiC;IAC1E,IAAqC,IAAI,YAAiC;IAE1E,IAA2C,UAAU,YAA+C;IACpG,IAAsC,WAAW,IAAI,MAAM,GAAG,IAAI,CAEjE;IAGD,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;yCA5Df,iBAAiB;2CAAjB,iBAAiB;CAgF7B"}
1
+ {"version":3,"file":"button.directive.d.ts","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGZ,UAAU,EACV,gBAAgB,EAEjB,MAAM,eAAe,CAAC;;AAEvB,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAIa,iBAAkB,YAAW,gBAAgB;IAsD5C,OAAO,CAAC,QAAQ,CAAC,IAAI;IArDxB,OAAO,EAAE,eAAe,CAAe;IAEhD,uCAAuC;IACvC,IAAa,OAAO,CAAC,KAAK,EAAE,eAAe,EAE1C;IACD,uCAAuC;IACvC,IAAI,OAAO,IAAI,eAAe,CAE7B;IACQ,IAAI,EAAE,YAAY,CAAQ;IAEnC,oCAAoC;IACpC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAEpC;IACD,oCAAoC;IACpC,IAAI,IAAI,IAAI,YAAY,CAEvB;IACQ,UAAU,UAAS;IAE5B,0CAA0C;IAC1C,IAAa,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAE7D;IACD,0CAA0C;IAC1C,IAAI,UAAU,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAEhD;IACQ,QAAQ,UAAS;IAE1B,wCAAwC;IACxC,IAAa,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAEzD;IACD,wCAAwC;IACxC,IAAI,QAAQ,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAE5C;IACS,cAAc,wBAA+B;IAEvD;;;;;;OAMG;IACO,cAAc,wBAAuB;gBAIlB,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC;IAE1D;;;;OAIG;IACH,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAK7C;IACD,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,yCAAyC;IACzC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IACD,yCAAyC;IACzC,IAAa,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAEtD;IACD,OAAO,CAAC,UAAU,CAAC,CAAS;IAEC,QAAQ,CAAC,SAAS,QAAQ;IAEvD,IAA0C,SAAS,YAAyC;IAC5F,IAA4C,WAAW,YAA2C;IAClG,IAA0C,SAAS,YAAyC;IAC5F,IAAuC,MAAM,YAAsC;IACnF,IAAyC,QAAQ,YAAwC;IACzF,IAAuC,MAAM,YAAsC;IACnF,IAA0C,SAAS,YAAyC;IAC5F,IAA0C,SAAS,YAAyC;IAE5F,IAAqC,IAAI,YAAiC;IAC1E,IAAqC,IAAI,YAAiC;IAE1E,IAA2C,UAAU,YAA+C;IACpG,IAAsC,WAAW,IAAI,MAAM,GAAG,IAAI,CAEjE;IAGD,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;yCAlHf,iBAAiB;2CAAjB,iBAAiB;CAsI7B"}
@@ -26,11 +26,51 @@ import * as i0 from "@angular/core";
26
26
  */
27
27
  export class MJButtonDirective {
28
28
  host;
29
- variant = 'secondary';
30
- size = 'md';
31
- toggleable = false;
32
- selected = false;
33
- selectedChange = new EventEmitter();
29
+ Variant = 'secondary';
30
+ /** @deprecated Use {@link Variant}. */
31
+ set variant(value) {
32
+ this.Variant = value;
33
+ }
34
+ /** @deprecated Use {@link Variant}. */
35
+ get variant() {
36
+ return this.Variant;
37
+ }
38
+ Size = 'md';
39
+ /** @deprecated Use {@link Size}. */
40
+ set size(value) {
41
+ this.Size = value;
42
+ }
43
+ /** @deprecated Use {@link Size}. */
44
+ get size() {
45
+ return this.Size;
46
+ }
47
+ Toggleable = false;
48
+ /** @deprecated Use {@link Toggleable}. */
49
+ set toggleable(value) {
50
+ this.Toggleable = value;
51
+ }
52
+ /** @deprecated Use {@link Toggleable}. */
53
+ get toggleable() {
54
+ return this.Toggleable;
55
+ }
56
+ Selected = false;
57
+ /** @deprecated Use {@link Selected}. */
58
+ set selected(value) {
59
+ this.Selected = value;
60
+ }
61
+ /** @deprecated Use {@link Selected}. */
62
+ get selected() {
63
+ return this.Selected;
64
+ }
65
+ SelectedChange = new EventEmitter();
66
+ /**
67
+ * @deprecated Use {@link SelectedChange}.
68
+ *
69
+ * The same emitter under the old binding name, so a template still binding
70
+ * (selectedChange) keeps working. Must stay AFTER SelectedChange: class fields
71
+ * initialise in order, and the other way round this captures undefined.
72
+ */
73
+ selectedChange = this.SelectedChange;
34
74
  // Constructor injection (not inject()) so the directive can be unit-tested via direct
35
75
  // instantiation with a stub ElementRef — the established pattern in this package's specs.
36
76
  constructor(host) {
@@ -41,35 +81,43 @@ export class MJButtonDirective {
41
81
  * (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored
42
82
  * `aria-label="..."` on the element is never clobbered.
43
83
  */
44
- set ariaLabel(value) {
84
+ set AriaLabel(value) {
45
85
  this._ariaLabel = value ?? undefined;
46
86
  if (this._ariaLabel) {
47
87
  this.host.nativeElement.setAttribute('aria-label', this._ariaLabel);
48
88
  }
49
89
  }
50
- get ariaLabel() {
90
+ get AriaLabel() {
51
91
  return this._ariaLabel;
52
92
  }
93
+ /** @deprecated Use {@link AriaLabel}. */
94
+ get ariaLabel() {
95
+ return this.AriaLabel;
96
+ }
97
+ /** @deprecated Use {@link AriaLabel}. */
98
+ set ariaLabel(value) {
99
+ this.AriaLabel = value;
100
+ }
53
101
  _ariaLabel;
54
102
  baseClass = true;
55
- get isPrimary() { return this.variant === 'primary'; }
56
- get isSecondary() { return this.variant === 'secondary'; }
57
- get isOutline() { return this.variant === 'outline'; }
58
- get isFlat() { return this.variant === 'flat'; }
59
- get isDanger() { return this.variant === 'danger'; }
60
- get isIcon() { return this.variant === 'icon'; }
61
- get isSuccess() { return this.variant === 'success'; }
62
- get isWarning() { return this.variant === 'warning'; }
63
- get isSm() { return this.size === 'sm'; }
64
- get isLg() { return this.size === 'lg'; }
65
- get isSelected() { return this.toggleable && this.selected; }
103
+ get isPrimary() { return this.Variant === 'primary'; }
104
+ get isSecondary() { return this.Variant === 'secondary'; }
105
+ get isOutline() { return this.Variant === 'outline'; }
106
+ get isFlat() { return this.Variant === 'flat'; }
107
+ get isDanger() { return this.Variant === 'danger'; }
108
+ get isIcon() { return this.Variant === 'icon'; }
109
+ get isSuccess() { return this.Variant === 'success'; }
110
+ get isWarning() { return this.Variant === 'warning'; }
111
+ get isSm() { return this.Size === 'sm'; }
112
+ get isLg() { return this.Size === 'lg'; }
113
+ get isSelected() { return this.Toggleable && this.Selected; }
66
114
  get ariaPressed() {
67
- return this.toggleable ? String(this.selected) : null;
115
+ return this.Toggleable ? String(this.Selected) : null;
68
116
  }
69
117
  OnClick() {
70
- if (this.toggleable) {
71
- this.selected = !this.selected;
72
- this.selectedChange.emit(this.selected);
118
+ if (this.Toggleable) {
119
+ this.Selected = !this.Selected;
120
+ this.SelectedChange.emit(this.Selected);
73
121
  }
74
122
  }
75
123
  /**
@@ -78,7 +126,7 @@ export class MJButtonDirective {
78
126
  * agents. Warn so it gets a name. No-op in production builds.
79
127
  */
80
128
  ngAfterContentInit() {
81
- if (!isDevMode() || this.variant !== 'icon') {
129
+ if (!isDevMode() || this.Variant !== 'icon') {
82
130
  return;
83
131
  }
84
132
  const el = this.host.nativeElement;
@@ -98,7 +146,7 @@ export class MJButtonDirective {
98
146
  } if (rf & 2) {
99
147
  i0.ɵɵattribute("aria-pressed", ctx.ariaPressed);
100
148
  i0.ɵɵclassProp("mj-btn", ctx.baseClass)("mj-btn--primary", ctx.isPrimary)("mj-btn--secondary", ctx.isSecondary)("mj-btn--outline", ctx.isOutline)("mj-btn--flat", ctx.isFlat)("mj-btn--danger", ctx.isDanger)("mj-btn--icon", ctx.isIcon)("mj-btn--success", ctx.isSuccess)("mj-btn--warning", ctx.isWarning)("mj-btn--sm", ctx.isSm)("mj-btn--lg", ctx.isLg)("mj-btn--selected", ctx.isSelected);
101
- } }, inputs: { variant: "variant", size: "size", toggleable: "toggleable", selected: "selected", ariaLabel: "ariaLabel" }, outputs: { selectedChange: "selectedChange" } });
149
+ } }, inputs: { Variant: "Variant", variant: "variant", Size: "Size", size: "size", Toggleable: "Toggleable", toggleable: "toggleable", Selected: "Selected", selected: "selected", AriaLabel: "AriaLabel", ariaLabel: "ariaLabel" }, outputs: { SelectedChange: "SelectedChange", selectedChange: "selectedChange" } });
102
150
  }
103
151
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJButtonDirective, [{
104
152
  type: Directive,
@@ -106,16 +154,28 @@ export class MJButtonDirective {
106
154
  selector: 'button[mjButton], a[mjButton]',
107
155
  standalone: true
108
156
  }]
109
- }], () => [{ type: i0.ElementRef }], { variant: [{
157
+ }], () => [{ type: i0.ElementRef }], { Variant: [{
158
+ type: Input
159
+ }], variant: [{
160
+ type: Input
161
+ }], Size: [{
110
162
  type: Input
111
163
  }], size: [{
112
164
  type: Input
165
+ }], Toggleable: [{
166
+ type: Input
113
167
  }], toggleable: [{
114
168
  type: Input
169
+ }], Selected: [{
170
+ type: Input
115
171
  }], selected: [{
116
172
  type: Input
173
+ }], SelectedChange: [{
174
+ type: Output
117
175
  }], selectedChange: [{
118
176
  type: Output
177
+ }], AriaLabel: [{
178
+ type: Input
119
179
  }], ariaLabel: [{
120
180
  type: Input
121
181
  }], baseClass: [{
@@ -1 +1 @@
1
- {"version":3,"file":"button.directive.js","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EACZ,WAAW,EACX,YAAY,EAGZ,SAAS,EACV,MAAM,eAAe,CAAC;;AAcvB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,MAAM,OAAO,iBAAiB;IASC;IARpB,OAAO,GAAoB,WAAW,CAAC;IACvC,IAAI,GAAiB,IAAI,CAAC;IAC1B,UAAU,GAAG,KAAK,CAAC;IACnB,QAAQ,GAAG,KAAK,CAAC;IAChB,cAAc,GAAG,IAAI,YAAY,EAAW,CAAC;IAEvD,sFAAsF;IACtF,0FAA0F;IAC1F,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAE9D;;;;OAIG;IACH,IACI,SAAS,CAAC,KAAgC;QAC5C,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI,SAAS,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACO,UAAU,CAAU;IAEU,SAAS,GAAG,IAAI,CAAC;IAEvD,IAA0C,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5F,IAA4C,WAAW,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC;IAClG,IAA0C,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5F,IAAuC,MAAM,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;IACnF,IAAyC,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC;IACzF,IAAuC,MAAM,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;IACnF,IAA0C,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5F,IAA0C,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC;IAE5F,IAAqC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;IAC1E,IAAqC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;IAE1E,IAA2C,UAAU,KAAK,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpG,IAAsC,WAAW;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAGD,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QACnC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAC1B,IAAI,CAAC,UAAU;YACf,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;YAC7B,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC;YAClC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;YACxB,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACzC,CAAC;QACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CACV,2FAA2F;gBACzF,yDAAyD,EAC3D,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;2GA/EU,iBAAiB;6DAAjB,iBAAiB;YAAjB,sFAAA,aAAS,IAAQ;;;YAAjB,uCAAiB,kCAAA,sCAAA,kCAAA,4BAAA,gCAAA,4BAAA,kCAAA,kCAAA,wBAAA,wBAAA,oCAAA;;;iFAAjB,iBAAiB;cAJ7B,SAAS;eAAC;gBACT,QAAQ,EAAE,+BAA+B;gBACzC,UAAU,EAAE,IAAI;aACjB;;kBAEE,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBAWN,KAAK;;kBAYL,WAAW;mBAAC,cAAc;;kBAE1B,WAAW;mBAAC,uBAAuB;;kBACnC,WAAW;mBAAC,yBAAyB;;kBACrC,WAAW;mBAAC,uBAAuB;;kBACnC,WAAW;mBAAC,oBAAoB;;kBAChC,WAAW;mBAAC,sBAAsB;;kBAClC,WAAW;mBAAC,oBAAoB;;kBAChC,WAAW;mBAAC,uBAAuB;;kBACnC,WAAW;mBAAC,uBAAuB;;kBAEnC,WAAW;mBAAC,kBAAkB;;kBAC9B,WAAW;mBAAC,kBAAkB;;kBAE9B,WAAW;mBAAC,wBAAwB;;kBACpC,WAAW;mBAAC,mBAAmB;;kBAI/B,YAAY;mBAAC,OAAO","sourcesContent":["import {\n Directive,\n Input,\n Output,\n EventEmitter,\n HostBinding,\n HostListener,\n ElementRef,\n AfterContentInit,\n isDevMode\n} from '@angular/core';\n\nexport type MjButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'flat'\n | 'danger'\n | 'icon'\n | 'success'\n | 'warning';\n\nexport type MjButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * mjButton — Attribute directive that styles a native `<button>` or `<a>` element\n * as an MJ-branded button.\n *\n * Uses `--mj-*` design tokens for all colors, ensuring dark-mode support\n * with zero extra CSS.\n *\n * Inputs use lowercase (not PascalCase) per the Phase 2 plan exception for\n * directives — matches HTML attribute convention.\n *\n * Accessibility: an **icon-only** button (`variant=\"icon\"`, no visible text) has no accessible\n * name unless you supply one — set `[ariaLabel]` (or a native `title`). Without a name, screen\n * readers announce it as an unlabeled \"button\" and DOM/accessibility-tree agents (e.g. computer-use)\n * can't identify it. In dev mode the directive logs a warning for an icon button that ends up with\n * no accessible name.\n *\n * @example\n * ```html\n * <button mjButton variant=\"primary\" (click)=\"save()\">Save</button>\n * <button mjButton variant=\"outline\" size=\"sm\">Cancel</button>\n * <button mjButton variant=\"icon\" ariaLabel=\"Remove\" (click)=\"remove()\"><i class=\"fa-solid fa-xmark\"></i></button>\n * <button mjButton variant=\"flat\" [toggleable]=\"true\" [(selected)]=\"isActive\">Toggle</button>\n * ```\n */\n@Directive({\n selector: 'button[mjButton], a[mjButton]',\n standalone: true\n})\nexport class MJButtonDirective implements AfterContentInit {\n @Input() variant: MjButtonVariant = 'secondary';\n @Input() size: MjButtonSize = 'md';\n @Input() toggleable = false;\n @Input() selected = false;\n @Output() selectedChange = new EventEmitter<boolean>();\n\n // Constructor injection (not inject()) so the directive can be unit-tested via direct\n // instantiation with a stub ElementRef — the established pattern in this package's specs.\n constructor(private readonly host: ElementRef<HTMLElement>) {}\n\n /**\n * Accessible name for the button, surfaced as `aria-label`. Primarily for **icon-only** buttons\n * (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored\n * `aria-label=\"...\"` on the element is never clobbered.\n */\n @Input()\n set ariaLabel(value: string | null | undefined) {\n this._ariaLabel = value ?? undefined;\n if (this._ariaLabel) {\n this.host.nativeElement.setAttribute('aria-label', this._ariaLabel);\n }\n }\n get ariaLabel(): string | undefined {\n return this._ariaLabel;\n }\n private _ariaLabel?: string;\n\n @HostBinding('class.mj-btn') readonly baseClass = true;\n\n @HostBinding('class.mj-btn--primary') get isPrimary() { return this.variant === 'primary'; }\n @HostBinding('class.mj-btn--secondary') get isSecondary() { return this.variant === 'secondary'; }\n @HostBinding('class.mj-btn--outline') get isOutline() { return this.variant === 'outline'; }\n @HostBinding('class.mj-btn--flat') get isFlat() { return this.variant === 'flat'; }\n @HostBinding('class.mj-btn--danger') get isDanger() { return this.variant === 'danger'; }\n @HostBinding('class.mj-btn--icon') get isIcon() { return this.variant === 'icon'; }\n @HostBinding('class.mj-btn--success') get isSuccess() { return this.variant === 'success'; }\n @HostBinding('class.mj-btn--warning') get isWarning() { return this.variant === 'warning'; }\n\n @HostBinding('class.mj-btn--sm') get isSm() { return this.size === 'sm'; }\n @HostBinding('class.mj-btn--lg') get isLg() { return this.size === 'lg'; }\n\n @HostBinding('class.mj-btn--selected') get isSelected() { return this.toggleable && this.selected; }\n @HostBinding('attr.aria-pressed') get ariaPressed(): string | null {\n return this.toggleable ? String(this.selected) : null;\n }\n\n @HostListener('click')\n OnClick(): void {\n if (this.toggleable) {\n this.selected = !this.selected;\n this.selectedChange.emit(this.selected);\n }\n }\n\n /**\n * Dev-only guard: an icon-variant button with no accessible name (no `ariaLabel`/`aria-label`/\n * `aria-labelledby`/`title` and no visible text) is invisible-by-name to screen readers and DOM\n * agents. Warn so it gets a name. No-op in production builds.\n */\n ngAfterContentInit(): void {\n if (!isDevMode() || this.variant !== 'icon') {\n return;\n }\n const el = this.host.nativeElement;\n const hasAccessibleName = !!(\n this._ariaLabel ||\n el.getAttribute('aria-label') ||\n el.getAttribute('aria-labelledby') ||\n el.getAttribute('title') ||\n (el.textContent ?? '').trim().length > 0\n );\n if (!hasAccessibleName) {\n console.warn(\n '[mjButton] icon-only button has no accessible name — add [ariaLabel]=\"…\" (or a title) so ' +\n 'screen readers and computer-use agents can identify it.',\n el\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"button.directive.js","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n Input,\n Output,\n EventEmitter,\n HostBinding,\n HostListener,\n ElementRef,\n AfterContentInit,\n isDevMode\n} from '@angular/core';\n\nexport type MjButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'flat'\n | 'danger'\n | 'icon'\n | 'success'\n | 'warning';\n\nexport type MjButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * mjButton — Attribute directive that styles a native `<button>` or `<a>` element\n * as an MJ-branded button.\n *\n * Uses `--mj-*` design tokens for all colors, ensuring dark-mode support\n * with zero extra CSS.\n *\n * Inputs use lowercase (not PascalCase) per the Phase 2 plan exception for\n * directives — matches HTML attribute convention.\n *\n * Accessibility: an **icon-only** button (`variant=\"icon\"`, no visible text) has no accessible\n * name unless you supply one — set `[ariaLabel]` (or a native `title`). Without a name, screen\n * readers announce it as an unlabeled \"button\" and DOM/accessibility-tree agents (e.g. computer-use)\n * can't identify it. In dev mode the directive logs a warning for an icon button that ends up with\n * no accessible name.\n *\n * @example\n * ```html\n * <button mjButton variant=\"primary\" (click)=\"save()\">Save</button>\n * <button mjButton variant=\"outline\" size=\"sm\">Cancel</button>\n * <button mjButton variant=\"icon\" ariaLabel=\"Remove\" (click)=\"remove()\"><i class=\"fa-solid fa-xmark\"></i></button>\n * <button mjButton variant=\"flat\" [toggleable]=\"true\" [(selected)]=\"isActive\">Toggle</button>\n * ```\n */\n@Directive({\n selector: 'button[mjButton], a[mjButton]',\n standalone: true\n})\nexport class MJButtonDirective implements AfterContentInit {\n @Input() Variant: MjButtonVariant = 'secondary';\n\n /** @deprecated Use {@link Variant}. */\n @Input() set variant(value: MjButtonVariant) {\n this.Variant = value;\n }\n /** @deprecated Use {@link Variant}. */\n get variant(): MjButtonVariant {\n return this.Variant;\n }\n @Input() Size: MjButtonSize = 'md';\n\n /** @deprecated Use {@link Size}. */\n @Input() set size(value: MjButtonSize) {\n this.Size = value;\n }\n /** @deprecated Use {@link Size}. */\n get size(): MjButtonSize {\n return this.Size;\n }\n @Input() Toggleable = false;\n\n /** @deprecated Use {@link Toggleable}. */\n @Input() set toggleable(value: MJButtonDirective['Toggleable']) {\n this.Toggleable = value;\n }\n /** @deprecated Use {@link Toggleable}. */\n get toggleable(): MJButtonDirective['Toggleable'] {\n return this.Toggleable;\n }\n @Input() Selected = false;\n\n /** @deprecated Use {@link Selected}. */\n @Input() set selected(value: MJButtonDirective['Selected']) {\n this.Selected = value;\n }\n /** @deprecated Use {@link Selected}. */\n get selected(): MJButtonDirective['Selected'] {\n return this.Selected;\n }\n @Output() SelectedChange = new EventEmitter<boolean>();\n\n /**\n * @deprecated Use {@link SelectedChange}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (selectedChange) keeps working. Must stay AFTER SelectedChange: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() selectedChange = this.SelectedChange;\n\n // Constructor injection (not inject()) so the directive can be unit-tested via direct\n // instantiation with a stub ElementRef — the established pattern in this package's specs.\n constructor(private readonly host: ElementRef<HTMLElement>) {}\n\n /**\n * Accessible name for the button, surfaced as `aria-label`. Primarily for **icon-only** buttons\n * (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored\n * `aria-label=\"...\"` on the element is never clobbered.\n */\n @Input()\n set AriaLabel(value: string | null | undefined) {\n this._ariaLabel = value ?? undefined;\n if (this._ariaLabel) {\n this.host.nativeElement.setAttribute('aria-label', this._ariaLabel);\n }\n }\n get AriaLabel(): string | undefined {\n return this._ariaLabel;\n }\n\n /** @deprecated Use {@link AriaLabel}. */\n get ariaLabel(): string | undefined {\n return this.AriaLabel;\n }\n /** @deprecated Use {@link AriaLabel}. */\n @Input() set ariaLabel(value: string | null | undefined) {\n this.AriaLabel = value;\n }\n private _ariaLabel?: string;\n\n @HostBinding('class.mj-btn') readonly baseClass = true;\n\n @HostBinding('class.mj-btn--primary') get isPrimary() { return this.Variant === 'primary'; }\n @HostBinding('class.mj-btn--secondary') get isSecondary() { return this.Variant === 'secondary'; }\n @HostBinding('class.mj-btn--outline') get isOutline() { return this.Variant === 'outline'; }\n @HostBinding('class.mj-btn--flat') get isFlat() { return this.Variant === 'flat'; }\n @HostBinding('class.mj-btn--danger') get isDanger() { return this.Variant === 'danger'; }\n @HostBinding('class.mj-btn--icon') get isIcon() { return this.Variant === 'icon'; }\n @HostBinding('class.mj-btn--success') get isSuccess() { return this.Variant === 'success'; }\n @HostBinding('class.mj-btn--warning') get isWarning() { return this.Variant === 'warning'; }\n\n @HostBinding('class.mj-btn--sm') get isSm() { return this.Size === 'sm'; }\n @HostBinding('class.mj-btn--lg') get isLg() { return this.Size === 'lg'; }\n\n @HostBinding('class.mj-btn--selected') get isSelected() { return this.Toggleable && this.Selected; }\n @HostBinding('attr.aria-pressed') get ariaPressed(): string | null {\n return this.Toggleable ? String(this.Selected) : null;\n }\n\n @HostListener('click')\n OnClick(): void {\n if (this.Toggleable) {\n this.Selected = !this.Selected;\n this.SelectedChange.emit(this.Selected);\n }\n }\n\n /**\n * Dev-only guard: an icon-variant button with no accessible name (no `ariaLabel`/`aria-label`/\n * `aria-labelledby`/`title` and no visible text) is invisible-by-name to screen readers and DOM\n * agents. Warn so it gets a name. No-op in production builds.\n */\n ngAfterContentInit(): void {\n if (!isDevMode() || this.Variant !== 'icon') {\n return;\n }\n const el = this.host.nativeElement;\n const hasAccessibleName = !!(\n this._ariaLabel ||\n el.getAttribute('aria-label') ||\n el.getAttribute('aria-labelledby') ||\n el.getAttribute('title') ||\n (el.textContent ?? '').trim().length > 0\n );\n if (!hasAccessibleName) {\n console.warn(\n '[mjButton] icon-only button has no accessible name — add [ariaLabel]=\"…\" (or a title) so ' +\n 'screen readers and computer-use agents can identify it.',\n el\n );\n }\n }\n}\n"]}
@@ -43,7 +43,9 @@ export declare class MJCardFooterDirective {
43
43
  export declare class MJCardGridComponent implements OnChanges {
44
44
  private cdr;
45
45
  /** Stream of the currently maximized card ID across all children. */
46
- readonly maximizedCard$: BehaviorSubject<string | null>;
46
+ readonly MaximizedCard$: BehaviorSubject<string | null>;
47
+ /** @deprecated Use {@link MaximizedCard$}. */
48
+ get maximizedCard$(): BehaviorSubject<string | null>;
47
49
  /** Number of columns for standard layout (defaults to 2). */
48
50
  Columns: number | string;
49
51
  /** CSS gap between cards (defaults to var(--mj-space-4)). */
@@ -1 +1 @@
1
- {"version":3,"file":"card-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/card-grid/card-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,YAAY,EACZ,WAAW,EAMX,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAgB,MAAM,MAAM,CAAC;;AAIrD;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,sBAAsB;IACZ,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,sBAAsB;2CAAtB,sBAAsB;CAElC;AAED;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,qBAAqB;IACX,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,qBAAqB;2CAArB,qBAAqB;CAEjC;AAsLD;;GAEG;AACH,qBAea,mBAAoB,YAAW,SAAS;IACjD,OAAO,CAAC,GAAG,CAA6B;IAExC,qEAAqE;IACrE,SAAgB,cAAc,iCAA4C;IAE1E,6DAA6D;IACpD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAK;IAEtC,6DAA6D;IACpD,GAAG,SAA6B;IAEzC,iFAAiF;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/C,0EAA0E;IAChE,qBAAqB,8BAAqC;IAEpE,kDAAkD;IACxC,aAAa,uBAA8B;IAErD,uEAAuE;IAC7D,YAAY,qBAA4B;IAE3C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,qEAAqE;IAE9D,QAAQ,IAAI,IAAI;IAMhB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQlC,OAAO,IAAI,IAAI;IASf,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;yCA3DnC,mBAAmB;2CAAnB,mBAAmB;CA8D/B;AAED;;GAEG;AACH,qBAwEa,eAAgB,YAAW,MAAM,EAAE,SAAS;IACrD,OAAO,CAAC,IAAI,CAAmD;IAC/D,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,GAAG,CAAC,CAAe;IAElB,MAAM,SAA6B;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,UAAQ;IACrB,eAAe,SAAiB;IAChC,cAAc,SAAkB;IAChC,UAAU,UAAQ;IAEjB,QAAQ,qBAA4B;IACpC,OAAO,qBAA4B;IAET,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACnC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IAC3C,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACpC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IAE5E,IAAW,WAAW,IAAI,OAAO,CAKhC;IAED,IAAW,QAAQ,IAAI,OAAO,CAK7B;IAEM,QAAQ,IAAI,IAAI;IAWhB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;yCAnDtC,eAAe;2CAAf,eAAe;CAgE3B"}
1
+ {"version":3,"file":"card-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/card-grid/card-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,YAAY,EACZ,WAAW,EAMX,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAgB,MAAM,MAAM,CAAC;;AAIrD;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,sBAAsB;IACZ,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,sBAAsB;2CAAtB,sBAAsB;CAElC;AAED;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,qBAAqB;IACX,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,qBAAqB;2CAArB,qBAAqB;CAEjC;AAsLD;;GAEG;AACH,qBAea,mBAAoB,YAAW,SAAS;IACjD,OAAO,CAAC,GAAG,CAA6B;IAExC,qEAAqE;IACrE,SAAgB,cAAc,iCAA4C;IAE1E,8CAA8C;IAC9C,IAAW,cAAc,mCAExB;IAED,6DAA6D;IACpD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAK;IAEtC,6DAA6D;IACpD,GAAG,SAA6B;IAEzC,iFAAiF;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/C,0EAA0E;IAChE,qBAAqB,8BAAqC;IAEpE,kDAAkD;IACxC,aAAa,uBAA8B;IAErD,uEAAuE;IAC7D,YAAY,qBAA4B;IAE3C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,qEAAqE;IAE9D,QAAQ,IAAI,IAAI;IAMhB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQlC,OAAO,IAAI,IAAI;IASf,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;yCAhEnC,mBAAmB;2CAAnB,mBAAmB;CAmE/B;AAED;;GAEG;AACH,qBAwEa,eAAgB,YAAW,MAAM,EAAE,SAAS;IACrD,OAAO,CAAC,IAAI,CAAmD;IAC/D,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,GAAG,CAAC,CAAe;IAElB,MAAM,SAA6B;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,UAAQ;IACrB,eAAe,SAAiB;IAChC,cAAc,SAAkB;IAChC,UAAU,UAAQ;IAEjB,QAAQ,qBAA4B;IACpC,OAAO,qBAA4B;IAET,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACnC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IAC3C,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACpC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IAE5E,IAAW,WAAW,IAAI,OAAO,CAKhC;IAED,IAAW,QAAQ,IAAI,OAAO,CAK7B;IAEM,QAAQ,IAAI,IAAI;IAWhB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;yCAnDtC,eAAe;2CAAf,eAAe;CAgE3B"}
@@ -113,7 +113,7 @@ export class MJCardTitleDirective {
113
113
  templateRef;
114
114
  constructor(templateRef) {
115
115
  this.templateRef = templateRef;
116
- }
116
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
117
117
  static ɵfac = function MJCardTitleDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardTitleDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
118
118
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardTitleDirective, selectors: [["", "mjCardTitle", ""]] });
119
119
  }
@@ -131,7 +131,7 @@ export class MJCardActionsDirective {
131
131
  templateRef;
132
132
  constructor(templateRef) {
133
133
  this.templateRef = templateRef;
134
- }
134
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
135
135
  static ɵfac = function MJCardActionsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardActionsDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
136
136
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardActionsDirective, selectors: [["", "mjCardActions", ""]] });
137
137
  }
@@ -149,7 +149,7 @@ export class MJCardToolsDirective {
149
149
  templateRef;
150
150
  constructor(templateRef) {
151
151
  this.templateRef = templateRef;
152
- }
152
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
153
153
  static ɵfac = function MJCardToolsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardToolsDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
154
154
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardToolsDirective, selectors: [["", "mjCardTools", ""]] });
155
155
  }
@@ -167,7 +167,7 @@ export class MJCardFooterDirective {
167
167
  templateRef;
168
168
  constructor(templateRef) {
169
169
  this.templateRef = templateRef;
170
- }
170
+ } // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
171
171
  static ɵfac = function MJCardFooterDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardFooterDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
172
172
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardFooterDirective, selectors: [["", "mjCardFooter", ""]] });
173
173
  }
@@ -363,7 +363,11 @@ mj-card {
363
363
  export class MJCardGridComponent {
364
364
  cdr = inject(ChangeDetectorRef);
365
365
  /** Stream of the currently maximized card ID across all children. */
366
- maximizedCard$ = new BehaviorSubject(null);
366
+ MaximizedCard$ = new BehaviorSubject(null);
367
+ /** @deprecated Use {@link MaximizedCard$}. */
368
+ get maximizedCard$() {
369
+ return this.MaximizedCard$;
370
+ }
367
371
  /** Number of columns for standard layout (defaults to 2). */
368
372
  Columns = 2;
369
373
  /** CSS gap between cards (defaults to var(--mj-space-4)). */
@@ -378,7 +382,7 @@ export class MJCardGridComponent {
378
382
  CardRestored = new EventEmitter();
379
383
  ngOnChanges(changes) {
380
384
  if (changes['MaximizedCardId'] && !changes['MaximizedCardId'].firstChange) {
381
- this.maximizedCard$.next(this.MaximizedCardId);
385
+ this.MaximizedCard$.next(this.MaximizedCardId);
382
386
  }
383
387
  }
384
388
  /** Pressing Escape restores the grid view if a card is maximized. */
@@ -389,7 +393,7 @@ export class MJCardGridComponent {
389
393
  }
390
394
  MaximizeCard(cardId) {
391
395
  this.MaximizedCardId = cardId;
392
- this.maximizedCard$.next(cardId);
396
+ this.MaximizedCard$.next(cardId);
393
397
  this.MaximizedCardIdChange.emit(cardId);
394
398
  this.CardMaximized.emit(cardId);
395
399
  this.cdr.markForCheck();
@@ -398,7 +402,7 @@ export class MJCardGridComponent {
398
402
  if (!this.MaximizedCardId)
399
403
  return;
400
404
  this.MaximizedCardId = null;
401
- this.maximizedCard$.next(null);
405
+ this.MaximizedCard$.next(null);
402
406
  this.MaximizedCardIdChange.emit(null);
403
407
  this.CardRestored.emit();
404
408
  this.cdr.markForCheck();
@@ -636,5 +640,5 @@ export class MJCardComponent {
636
640
  type: ContentChild,
637
641
  args: [MJCardFooterDirective]
638
642
  }] }); })();
639
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCardComponent, { className: "MJCardComponent", filePath: "lib/card-grid/card-grid.component.ts", lineNumber: 404 }); })();
643
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCardComponent, { className: "MJCardComponent", filePath: "lib/card-grid/card-grid.component.ts", lineNumber: 409 }); })();
640
644
  //# sourceMappingURL=card-grid.component.js.map